Pracuj nad zdalnym projektem za pomocą Eclipse przez SSH


192

Mam następujące pola:

  1. Windows box z Eclipse CDT,
  2. Linux box, dostępny dla mnie tylko przez SSH.

Zarówno kompilator, jak i sprzęt wymagany do zbudowania i uruchomienia mojego projektu znajdują się tylko na komputerze B.

Chciałbym pracować „transparentnie” z okna Windows na tym projekcie za pomocą Eclipse CDT i móc zdalnie budować, uruchamiać i debugować projekt z poziomu IDE.

Jak to skonfigurować:

  • Budynek będzie działał? Jakieś prostsze rozwiązania niż napisanie lokalnego pliku makefile, który rsyncprojekt, a następnie wywołanie zdalnego makefile, aby zainicjować faktyczną kompilację? Czy kompilacja zarządzana przez Eclipse ma taką funkcję?
  • Debugowanie zadziała?
  • Najlepiej - indeksowanie kodu CDT Eclipse będzie działać? Czy muszę skopiować wszystkie wymagane pliki nagłówków z komputera B na komputer A i dodać je, aby ręcznie uwzględnić ścieżkę?

4
Kos, skończyłaś na RSE? Jakie było twoje doświadczenie?
Aleksandr Levchuk,

2
Udało mi się to zrobić, ale: a) CDT miał pewne problemy ze świadomością wirtualnego systemu plików (AFAIK jest to problem tymczasowy i zniknie, gdy przepisują niektóre rzeczy na nowszy interfejs API; może już to zrobili? IDK) i b) Musiałem zwinąć własny łańcuch kompilacji (poprzez niestandardowy plik makefile) ic) nieprzyjemne zapisywanie pliku irytujące zajęło około 2 ~ 3 sekund i to było niepokojące.
Kos

1
Gdybym musiał pracować zdalnie znowu dzisiaj, prawdopodobnie zrobić kolejny spin z OZE, ale może znajdę to bardziej możliwe, aby zachować go jako lokalny projektu i roll up system specjalnie skonstruowaną w oparciu o np rsyncjak mam wzmiankowany.
Kos

2
I niestety - nie udało mi się skonfigurować zdalnego debugowania ani indeksowania nagłówków zdalnych bibliotek. Wątpię, czy to drugie można nawet zrobić. Ten pierwszy - jestem przekonany, że tak, ale tak naprawdę nie musiałem się w to zagłębiać.
Kos

Uzyskuję dostęp do mojego komputera zdalnego, najpierw logując się na serwerze logowania, a następnie logując się z niego na mój komputer zdalny. Oba mają różne hasła. Czy jest jakiś sposób pracy na tak zdalnej maszynie w Eclipse?
Arjun J Rao,

Odpowiedzi:


218

Wypróbuj Remote System Explorer (RSE). To zestaw wtyczek do robienia dokładnie tego, co chcesz.

RSE może już być uwzględnione w bieżącej instalacji Eclipse. Aby sprawdzić w Eclipse Indigo, przejdź do Okno > Otwórz perspektywę > Inne ... i wybierz Remote System Explorer z okna dialogowego Otwórz perspektywę, aby otworzyć perspektywę RSE.

Aby utworzyć zdalny projekt SSH z perspektywy RSE w Eclipse:

  1. Zdefiniuj nowe połączenie i wybierz Tylko SSH z ekranu Wybierz typ systemu zdalnego w oknie dialogowym Nowe połączenie.
  2. Wprowadź informacje o połączeniu, a następnie wybierz Zakończ.
  3. Połącz się z nowym hostem. (Zakłada się, że klucze SSH są już skonfigurowane).
  4. Po połączeniu przejdź do plików Sftp hosta , wybierz folder i wybierz polecenie Utwórz projekt zdalny z menu kontekstowego elementu. (Poczekaj na utworzenie projektu zdalnego).

Jeśli wykonano to poprawnie, powinien być teraz dostępny nowy projekt zdalny dostępny z Eksploratora projektów i innych perspektyw w ramach zaćmienia. Przy prawidłowym skonfigurowaniu połączenia SSH hasła mogą stać się opcjonalną częścią normalnego procesu uwierzytelniania SSH. Utworzono zdalny projekt z Eclipse przez SSH.


2
RSE jest nadal trudne. Najlepszym pomysłem od RSE jest, aby Eclipse robił wszystko za pośrednictwem połączenia SSH, ale ta funkcja jeszcze nie działa. Działająca funkcja wymaga serwera, który musisz skonfigurować na Linux-ie.
Ioan

2
Również faceci RSE lubią otrzymywać raporty o błędach / ulepszeniach.
Aaron Digulla,

2
@Aaron - Próbowałem już wcześniej tego rozwiązania rsync z pliku Makefile - który zasadniczo zastąpiłby Twoją sekwencję klawiszy jednym Ctrl + B. Problem polega na tym, że przy takim podejściu nie mogę uruchomić ani debugować z Eclipse. RSE rzeczywiście brzmi jak dobre narzędzie pracy; @Ioan, czy możesz opracować, co nie działa? Wydaje się, że wiki RSE wymienia systemy plików SSH i zdalne debugowanie jako bieżącą funkcję ... Albo po prostu wypróbuję to w poniedziałek.
Kos,

3
@AaronDigulla Cześć, rozwiązanie jest fajne, ale odkryłem, że kiedy buduję zdalny projekt, Eclipse próbuje go skompilować lokalnie. Czy istnieje możliwość, aby kompilowała się i działała na zdalnym komputerze?
shaoyl85

1
Indeksowanie C / C ++ nie działa poprawnie z RSE. Indeksator skarży się na brakujące symbole. Działa dobrze, gdy projekt i pliki źródłowe są przechowywane lokalnie, ale w RSE nie działa. jakieś pomysły?
Black_Zero

12

Najprostszym sposobem byłoby uruchomienie Eclipse CDT na Linuksie i użycie albo X11-Forwarding, albo oprogramowania do zdalnego pulpitu, takiego jak VNC.

Jest to oczywiście możliwe tylko wtedy, gdy Eclipse jest obecny na komputerze z systemem Linux, a połączenie sieciowe z urządzeniem jest wystarczająco szybkie.

Zaletą jest to, że ponieważ wszystko jest lokalne, nie będziesz mieć problemów z synchronizacją i nie będziesz mieć żadnych niezręcznych problemów na różnych platformach.

Jeśli nie masz zaćmienia na pudełku, możesz pomyśleć o udostępnieniu katalogu roboczego Linux za pośrednictwem SMB (lub SSHFS) i uzyskać do niego dostęp z komputera z systemem Windows, ale wymagałoby to sporo konfiguracji.

Oba byłyby lepsze niż posiadanie dwóch kopii, zwłaszcza gdy jest to platforma wieloplatformowa.


1
Obawiam się, że Linux nie ma nawet X11. :)
Kos

2
@Kos, potrzebujesz serwera X11, aby działał tam, gdzie fizycznie siedzisz - albo z Linuksem na maszynie wirtualnej, albo z serwerem X11 dla Windows - i Eclipse, aby działał na serwerze Linux. ssh pozwala tylko na tunelowanie danych sieciowych - znajdziesz kompresję + „-c blowfish”, aby pomóc w doświadczeniu.
Thorbjørn Ravn Andersen

Tylko dla wyjaśnienia - czy masz na myśli tak zwane „bezgłowe Eclipse” na zdalnym komputerze? (Cóż, pod warunkiem, że ma nawet Javę :)). Szukałem lekkiego rozwiązania po stronie klienta, ale pewna konfiguracja na zdalnym komputerze może być również opcją.
Kos,

7
@ Ko: Nie. X11 działa w ten sposób: masz klienta i serwer. Serwer jest podłączony do monitora. Robi wszystkie renderowanie i wyświetlanie. Klient (w tym przypadku Eclipse) po prostu wysyła polecenia renderowania do serwera. Musisz więc zainstalować X11 w systemie Windows i uruchomić Eclipse na swoim Linux-ie. Wszystko, co musisz zrobić w systemie Linux, to ustawić DISPLAYzmienną, aby Eclipse wiedział, gdzie jest serwer.
Aaron Digulla,

5
Sieć musi być jednak szybka, podobnie jak serwer i Eclipse będzie działać bardzo wolno.
mattalxndr

6

Sam jestem (lub byłam) w tym samym miejscu, FWIW Skończyło się na sprawdzeniu udziału w sambie na hoście Linuksa i edycji, które udostępniam lokalnie na komputerze z Windows za pomocą notatnika ++, a potem skompilowałem na Linux-ie za pomocą PuTTY. (Nie mogliśmy aktualizować dziesięciu wersji edytorów na hoście Linuksa i nie było w nim Java, więc zrezygnowałem z przekazywania X11)

Teraz ... uruchamiam nowoczesny system Linux na maszynie wirtualnej na hoście systemu Windows, dodaję wszystkie potrzebne narzędzia (np. CDT) do maszyny wirtualnej, a następnie kasuję i buduję więzienie chroot, które bardzo przypomina RTE.

To niezgrabne rozwiązanie, ale pomyślałem, że wrzucę to do miksu.


3

Moje rozwiązanie jest podobne do rozwiązania SAMBA oprócz tego, że używa sshfs. Zamontuj mój zdalny serwer za pomocą sshfs, otwórz mój projekt makefile na zdalnym komputerze. Idź stamtąd.

Wygląda na to, że w ten sposób mogę uruchomić interfejs GUI do mercurial.

Budowanie mojego zdalnego kodu jest tak proste jak: ssh address remote_make_command

Szukam jednak porządnego sposobu na debugowanie. Być może przez gdbserver?


2

Miałem ten sam problem 2 lata temu i rozwiązałem go w następujący sposób:

1) Buduję swoje projekty z plików makefile, nie zarządzanych przez eclipse 2) Korzystam z połączenia SAMBA do edycji plików w Eclipse 3) Budowanie projektu: Eclipse nazywa się „lokalnym” make z plikiem makefile, który otwiera połączenie SSH z Linuksem Gospodarz. W wierszu komend SSH możesz podać parametry, które są wykonywane na hoście Linux. Używam dla tego parametru skryptu powłoki makeit.sh, który wywołuje „real” make na hoście Linux. Różne cele budowania, które możesz podać, również za pomocą parametrów z lokalnego makefile -> makeit.sh -> makefile na hoście Linux.


Fajnie, ale nie można go nazwać „przezroczystym” - co najmniej nie pozwala na debugowanie. Może być również oparty na RSync zamiast na Sambie (czyli to, co miałem przed opublikowaniem mojego pierwotnego pytania).
Kos,

2

Próbowałem, ssh -Xale było to nieznośnie wolne.

Próbowałem też RSE, ale nawet nie wspierało to budowania projektu z Makefile ( powiedziano mi, że zmieniło się to od opublikowania mojej odpowiedzi , ale tego nie wypróbowałem)

Czytałem, że NX jest szybszy niż przekazywanie X11, ale nie mogłem go uruchomić.

Wreszcie dowiedziałem się, że mój serwer obsługuje X2Go (link zawiera instrukcje instalacji, jeśli twój nie). Teraz musiałem tylko:

  • pobierz i rozpakuj Eclipse na serwerze,
  • zainstaluj X2Go na moim komputerze lokalnym ( sudo apt-get install x2goclientna Ubuntu),
  • skonfiguruj połączenie (host, automatyczne logowanie za pomocą klucza ssh, wybierz uruchomienie Eclipse).

Wszystko jest tak, jakbym pracował na komputerze lokalnym, w tym budowanie, debugowanie i indeksowanie kodu. I nie ma zauważalnych opóźnień.



0

Ta odpowiedź dotyczy obecnie tylko dwóch komputerów z systemem Linux [a może też działa na komputerze Mac? - niesprawdzone na komputerze Mac] (synchronizacja między komputerami), ponieważ napisałem ten skrypt synchronizacji w bash. Jest to jednak tylko opakowanie git, więc możesz go wziąć i przekształcić w wieloplatformowe rozwiązanie Python lub coś, jeśli chcesz


To nie odpowiada bezpośrednio na pytanie PO, ale jest tak blisko, że gwarantuję, że odpowie na pytanie wielu innych ludzi, którzy wylądują na tej stronie (w tym moje, tak naprawdę, ponieważ przybyłem tu pierwszy przed napisaniem własnego rozwiązania), więc W każdym razie zamieszczam to tutaj.

Chcę:

  1. opracuj kod za pomocą potężnego IDE, takiego jak Eclipse, na lekkim komputerze z systemem Linux
  2. zbuduj ten kod przez ssh na innym, mocniejszym komputerze z Linuksem (z wiersza poleceń, NIE z wnętrza Eclipse)

Nazwijmy pierwszy komputer, na którym piszę kod „PC1” (komputer osobisty 1), a drugi komputer, na którym buduję kod „PC2”. Potrzebuję narzędzia do łatwej synchronizacji z PC1 do PC2. Próbowałem rsync, ale było to niesamowicie wolne dla dużych repozytoriów i wymagało ogromnej przepustowości i danych.

Jak mam to zrobić? Jakiego przepływu pracy powinienem użyć? Jeśli masz również to pytanie, oto przepływ pracy, który zdecydowałem. Napisałem skrypt bash, aby zautomatyzować proces za pomocą gitautomatycznego wypychania zmian z PC1 na PC2 za pośrednictwem zdalnego repozytorium, takiego jak github. Jak dotąd działa bardzo dobrze i jestem z tego bardzo zadowolony. Jest o wiele znacznie szybszy niż rsync, moim zdaniem bardziej godny zaufania, ponieważ każdy komputer utrzymuje funkcjonalne repozytorium git i zużywa znacznie mniejszą przepustowość do przeprowadzenia całej synchronizacji, dzięki czemu można to łatwo zrobić na hotspocie telefonu komórkowego bez użycia ton danych.

Ustawiać:

  1. Zainstaluj skrypt na PC1 (to rozwiązanie zakłada, że ​​~ / bin znajduje się w zmiennej $ PATH):

    git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
    cd eRCaGuy_dotfiles/useful_scripts
    mkdir -p ~/bin
    ln -s "${PWD}/sync_git_repo_from_pc1_to_pc2.sh" ~/bin/sync_git_repo_from_pc1_to_pc2
    cd ..
    cp -i .sync_git_repo ~/.sync_git_repo
  2. Teraz edytuj plik „~ / .sync_git_repo”, który właśnie skopiowałeś powyżej, i zaktualizuj jego parametry, aby pasowały do ​​Twojego przypadku. Oto parametry, które zawiera:

    # The git repo root directory on PC2 where you are syncing your files TO; this dir must *already exist* 
    # and you must have *already `git clone`d* a copy of your git repo into it!
    # - Do NOT use variables such as `$HOME`. Be explicit instead. This is because the variable expansion will 
    #   happen on the local machine when what we need is the variable expansion from the remote machine. Being 
    #   explicit instead just avoids this problem.
    PC2_GIT_REPO_TARGET_DIR="/home/gabriel/dev/eRCaGuy_dotfiles" # explicitly type this out; don't use variables
    
    PC2_SSH_USERNAME="my_username" # explicitly type this out; don't use variables
    PC2_SSH_HOST="my_hostname"     # explicitly type this out; don't use variables
  3. Git sklonuj swoje repozytorium, które chcesz zsynchronizować na PC1 i PC2.

  4. Upewnij się, że wszystkie klucze ssh są skonfigurowane tak, aby móc przesuwać i ciągnąć do zdalnego repozytorium z PC1 i PC2. Oto kilka przydatnych linków:
    1. https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
    2. https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
  5. Upewnij się, że wszystkie klucze ssh są skonfigurowane do ssh z PC1 na PC2.
  6. Teraz cddo dowolnego katalogu w repozytorium git na PC1 i uruchom:

    sync_git_repo_from_pc1_to_pc2
  7. Otóż ​​to! Około 30 sekund później wszystko zostanie magicznie zsynchronizowane z PC1 na PC2 i będzie drukować cały czas, aby powiedzieć ci, co robi i gdzie robi to na dysku i na którym komputerze. Jest również bezpieczny, ponieważ nie zastępuje ani nie usuwa niczego, co nie jest zobowiązane. Zamiast tego najpierw tworzy kopię zapasową! Przeczytaj więcej poniżej, jak to działa.

Oto proces, którego używa ten skrypt (tj .: co faktycznie robi)

  1. Z PC1: Sprawdza, czy na PC1 są jakieś niezatwierdzone zmiany. Jeśli tak, zatwierdza je do tymczasowego zatwierdzenia w bieżącym oddziale. Następnie siła wypycha je do zdalnej gałęzi SYNC. Następnie odrzuci tymczasowe zatwierdzenie, które właśnie wykonał w lokalnym oddziale, a następnie przywraca lokalne repozytorium git dokładnie tak, jak było, umieszczając wszystkie pliki, które były wcześniej ustawione w czasie, gdy wywołałeś skrypt. Następnie jest to rsynckopia skryptu na PC2 i robissh aby powiedzieć PC2, aby uruchomił skrypt ze specjalną opcją, aby po prostu zrobić rzeczy PC2.
  2. Oto, co robi PC2: cdprzechodzi do repozytorium i sprawdza, czy istnieją jakieś lokalne niezatwierdzone zmiany. Jeśli tak, tworzy nową gałąź kopii zapasowej rozwidloną z bieżącej gałęzi (przykładowa nazwa: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- zauważ, że to RRRRMMDD-HHMMhrs - SSsec) i zatwierdza wszelkie niezatwierdzone zmiany w tej gałęzi za pomocą komunikatu zatwierdzenia, takiego jak DO zapasową wszystkich NIEZGODNE ZMIANY NA PC2 (DOCELOWY KOMPUTER / BUDOWANA MASZYNA). Teraz sprawdza gałąź SYNC, wyciągając ją ze zdalnego repozytorium, jeśli nie jest jeszcze na komputerze lokalnym. Następnie pobiera najnowsze zmiany w zdalnym repozytorium i wykonuje twardy reset, aby zmusić lokalne repozytorium SYNC do dopasowania do zdalnego repozytorium SYNC. Możesz to nazwać „mocnym pociągnięciem”. Jest to jednak bezpieczne, ponieważ utworzyliśmy już kopię zapasową wszelkich niezatwierdzonych zmian, które mieliśmy lokalnie na PC2, więc nic nie jest stracone!
  3. Otóż ​​to! Teraz stworzyłeś idealną kopię z PC1 na PC2 bez konieczności zapewnienia czystych katalogów roboczych, ponieważ skrypt obsługiwał wszystkie automatyczne zatwierdzanie i inne rzeczy dla Ciebie! Jest szybki i działa bardzo dobrze na dużych repozytoriach. Teraz masz łatwy mechanizm do użycia dowolnego wybranego IDE na jednej maszynie podczas budowania lub testowania na innej maszynie, łatwo, za pośrednictwem hotspotu Wi-Fi z twojego telefonu komórkowego, jeśli to konieczne, nawet jeśli repozytorium ma kilkadziesiąt gigabajtów i masz czas i ograniczone zasoby.

Zasoby:

  1. Cały projekt: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Zobacz więcej linków i referencji w samym kodzie źródłowym w ramach tego projektu.
  2. Jak wykonać „hard pull”, jak to nazywam: Jak wymusić „git pull”, aby zastąpić lokalne pliki?

Związane z:

  1. synchronizacja repozytorium git między komputerami podczas przenoszenia?
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.