Bekerja pada proyek jarak jauh dengan Eclipse via SSH

192

Saya memiliki kotak-kotak berikut:

  1. Kotak Windows dengan Eclipse CDT,
  2. Sebuah kotak Linux, hanya dapat diakses oleh saya melalui SSH.

Baik kompiler maupun perangkat keras yang diperlukan untuk membangun dan menjalankan proyek saya hanya pada mesin B.

Saya ingin bekerja "secara transparan" dari kotak Windows pada proyek itu menggunakan Eclipse CDT dan dapat membangun, menjalankan dan men-debug proyek dari jarak jauh di dalam IDE.

Bagaimana cara mengaturnya:

  • Bangunan akan bekerja? Adakah solusi yang lebih sederhana daripada menulis makefile lokal yang akan digunakan rsyncoleh proyek dan kemudian memanggil makefile jarak jauh untuk memulai pembuatan sebenarnya? Apakah Eclipse berhasil membangun memiliki fitur untuk itu?
  • Proses debug akan berhasil?
  • Lebih disukai - pengindeksan kode Eclipse CDT akan berfungsi? Apakah saya harus menyalin semua file header yang diperlukan dari mesin B ke mesin A dan menambahkannya untuk memasukkan path secara manual?
Kos
sumber
4
Kos, apakah Anda akhirnya menggunakan RSE? Bagaimana pengalaman Anda?
Aleksandr Levchuk
2
Saya berhasil melakukannya, tetapi: a) CDT memiliki beberapa masalah dengan menyadari sistem file virtual (AFAIK ini adalah masalah sementara dan akan hilang ketika mereka menulis ulang beberapa hal ke API yang lebih baru; mungkin mereka sudah melakukannya? IDK) dan b) Saya harus menggulung rantai kompilasi saya sendiri (melalui custom makefile) dan c) save file yang tidak menyenangkan memakan waktu sekitar 2 ~ 3 detik dan ini mengganggu.
Kos
1
Jika saya perlu bekerja dari jarak jauh lagi hari ini, saya mungkin akan mengambil putaran lain dengan RSE, tapi saya mungkin menemukan itu lebih layak untuk menyimpannya sebagai proyek lokal dan menggulung sistem membangun kustom, berdasarkan misalnya rsyncseperti yang telah saya lakukan tersebut.
Kos
2
Dan sayangnya - saya belum berhasil mengatur debugging jarak jauh atau pengindeksan header perpustakaan jarak jauh. Saya ragu bahwa yang terakhir bahkan dapat dilakukan. Yang pertama - saya yakin itu bisa, tetapi saya tidak benar-benar perlu menggali lebih dalam.
Kos
Saya mengakses mesin jarak jauh saya dengan terlebih dahulu masuk ke server masuk dan kemudian masuk dari sana ke mesin jarak jauh saya. Keduanya memiliki kata sandi yang berbeda. Apakah ada cara untuk bekerja pada mesin yang begitu jauh di Eclipse?
Arjun J Rao

Jawaban:

218

Coba Remote System Explorer (RSE). Ini adalah set plug-in untuk melakukan apa yang Anda inginkan.

RSE mungkin sudah termasuk dalam instalasi Eclipse Anda saat ini. Untuk mengecek Eclipse Indigo, buka Window > Open Perspective > Other ... dan pilih Remote System Explorer dari dialog Open Perspective untuk membuka perspektif RSE.

Untuk membuat proyek jarak jauh SSH dari perspektif RSE di Eclipse:

  1. Tetapkan koneksi baru dan pilih SSH Only dari layar Select Remote System Type di dialog New Connection.
  2. Masukkan informasi koneksi, lalu pilih Selesai.
  3. Hubungkan ke host baru. (Asumsikan kunci SSH sudah diatur.)
  4. Setelah terhubung, telusuri ke File Sftp host , pilih folder dan pilih Buat Proyek Jarak Jauh dari menu konteks item. (Tunggu saat proyek jarak jauh dibuat.)

Jika dilakukan dengan benar, sekarang harus ada proyek jarak jauh baru yang dapat diakses dari Project Explorer dan perspektif lain dalam gerhana. Dengan koneksi SSH, pengaturan dengan benar kata sandi dapat dijadikan bagian opsional dari proses otentikasi SSH yang normal. Proyek jarak jauh dengan Eclipse via SSH sekarang dibuat.

Aaron Digulla
sumber
2
RSE masih rumit. Ide terbaik dari RSE adalah Eclipse melakukan semuanya melalui koneksi SSH, tetapi fitur itu belum berfungsi. Fitur kerja melibatkan beberapa server yang perlu Anda setup pada kotak Linux.
Ioan
2
Orang-orang RSE juga ingin mendapatkan laporan bug / peningkatan.
Aaron Digulla
2
@ Harun - Saya sudah mencoba solusi rsync sebelumnya, dari Makefile - yang pada dasarnya akan mengganti urutan kunci Anda dengan satu Ctrl + B. Masalahnya adalah bahwa dengan pendekatan ini saya tidak dapat menjalankan atau men-debug dari Eclipse. RSE memang terdengar seperti alat yang bagus dari pekerjaan; @Ian, bisakah Anda menguraikan apa yang tidak berfungsi? Wiki RSE tampaknya mencantumkan sistem file SSH dan debugging jarak jauh sebagai fitur saat ini ... Atau saya akan mencobanya Senin ini.
Kos
3
@ AaronDigulla Hai, solusinya keren, tapi saya menemukan bahwa ketika saya sedang membangun proyek jarak jauh, Eclipse sedang mencoba untuk mengkompilasinya secara lokal. Apakah ada cara untuk membiarkannya dikompilasi dan dijalankan di mesin remote?
shaoyl85
1
Pengindeksan C / C ++ tidak berfungsi dengan benar dengan RSE. Pengindeks mengeluh tentang simbol yang hilang. Ini berfungsi dengan baik ketika file proyek dan sumber disimpan secara lokal tetapi dengan RSE tidak. ada ide?
Black_Zero
12

Cara yang paling sederhana adalah dengan menjalankan Eclipse CDT di Linux Box dan menggunakan X11-Forwarding atau perangkat lunak desktop jarak jauh seperti VNC.

Ini, tentu saja, hanya mungkin ketika Eclipse Anda hadir di kotak Linux dan koneksi jaringan Anda ke kotak cukup cepat.

Keuntungannya adalah, karena semuanya bersifat lokal, Anda tidak akan memiliki masalah sinkronisasi, dan Anda tidak mendapatkan masalah lintas platform yang canggung.

Jika Anda tidak memiliki gerhana di dalam kotak, Anda dapat berpikir untuk berbagi direktori kerja linux Anda melalui SMB (atau SSHFS) dan mengaksesnya dari mesin windows Anda, tetapi itu akan membutuhkan beberapa pengaturan.

Keduanya akan lebih baik daripada memiliki dua salinan, terutama ketika itu lintas platform.

Lagerbaer
sumber
1
Saya khawatir kotak linux bahkan tidak memiliki X11. :)
Kos
2
@ Ko, Anda memerlukan server X11 untuk menjalankan tempat Anda duduk secara fisik - baik dengan Linux di mesin virtual, atau server X11 untuk Windows - dan Eclipse untuk berjalan di server Linux. ssh hanya memungkinkan untuk tunneling data jaringan - Anda akan menemukan kompresi + "-c blowfish" untuk membantu pengalaman.
Thorbjørn Ravn Andersen
Hanya untuk memperjelas - apakah Anda mengacu pada apa yang disebut "Eclipse tanpa kepala" pada mesin jarak jauh? (Yah, asal saja punya Java :)). Saya sedang mencari solusi sisi klien yang ringan, tetapi memiliki beberapa pengaturan pada mesin jarak jauh bisa menjadi pilihan juga.
Kos
7
@Kos: Tidak. X11 berfungsi seperti ini: Anda memiliki klien dan server. Server adalah tempat monitor terhubung. Itu semua rendering dan menampilkan. Klien (Eclipse dalam kasus ini) hanya mengirim perintah rendering ke server. Jadi, Anda harus menginstal X11 di Windows dan menjalankan Eclipse di kotak Linux Anda. Yang perlu Anda lakukan di Linux adalah mengatur DISPLAYvariabel sehingga Eclipse tahu di mana server berada.
Aaron Digulla
5
Jaringan perlu cepat, begitu juga server Anda, dan atau Eclipse akan berjalan sangat lambat.
mattalxndr
6

Saya sendiri berada di tempat yang sama (atau dulu), FWIW saya akhirnya memeriksa untuk berbagi samba pada host Linux dan mengedit yang berbagi secara lokal pada mesin Windows dengan notepad ++, kemudian saya dikompilasi pada kotak Linux melalui Putty. (Kami tidak diizinkan memperbarui versi editor versi 10 pada host Linux dan tidak memiliki Java, jadi saya menyerah pada penerusan X11)

Sekarang ... Saya menjalankan Linux modern di VM di host Windows saya, menambahkan semua alat yang saya inginkan (misalnya CDT) ke VM dan kemudian saya checkout dan membangun di chroot jail yang sangat mirip dengan RTE.

Ini solusi kikuk tapi saya pikir saya akan memasukkannya ke dalam campuran.

timB33
sumber
3

Solusi saya mirip dengan SAMBA kecuali menggunakan sshfs. Pasang server jarak jauh saya dengan sshfs, buka proyek makefile saya pada mesin jarak jauh. Pergi dari sana.

Sepertinya saya bisa menjalankan antarmuka GUI untuk lincah dengan cara ini juga.

Membangun kode remote saya sesederhana: ssh address remote_make_command

Saya mencari cara yang layak untuk debug. Mungkin melalui gdbserver?

Samantha
sumber
2

Saya memiliki masalah yang sama 2 tahun yang lalu dan saya menyelesaikannya dengan cara berikut:

1) Saya membangun proyek saya dengan makefile, tidak dikelola oleh eclipse 2) Saya menggunakan koneksi SAMBA untuk mengedit file di dalam Eclipse 3) Membangun proyek: Eclipse memanggil make "lokal" dengan makefile yang membuka koneksi SSH ke Linux Tuan rumah. Pada baris perintah SSH Anda dapat memberikan parameter yang dijalankan pada host Linux. Saya menggunakan untuk parameter itu sebuah skrip shell makeit.sh yang memanggil make "real" pada host linux. Target berbeda untuk membangun dapat Anda berikan juga dengan parameter dari makefile lokal -> makeit.sh -> makefile di host linux.

900ss
sumber
Bagus, tetapi tidak dapat disebut "transparan" - setidaknya tidak memungkinkan debugging. Juga dapat didasarkan pada RSync bukan Samba (yang adalah apa yang saya miliki sebelum saya memposting pertanyaan asli saya).
Kos
2

Saya mencoba ssh -X tetapi lambat sekali.

Saya juga mencoba RSE, tetapi bahkan tidak mendukung membangun proyek dengan Makefile ( saya diberitahu bahwa ini telah berubah sejak saya memposting jawaban saya , tetapi saya belum mencobanya)

Saya membaca bahwa NX lebih cepat daripada penerusan X11, tetapi saya tidak bisa menjalankannya.

Akhirnya, saya mengetahui bahwa server saya mendukung X2Go (tautannya memiliki petunjuk pemasangan jika milik Anda tidak). Sekarang saya hanya perlu:

  • unduh dan bongkar Eclipse di server,
  • instal X2Go di mesin lokal saya ( sudo apt-get install x2goclientdi Ubuntu),
  • konfigurasikan koneksi (host, login otomatis dengan kunci ssh, pilih untuk menjalankan Eclipse).

Semuanya seolah-olah saya sedang mengerjakan mesin lokal, termasuk membangun, debugging, dan pengindeksan kode. Dan tidak ada kelambatan yang nyata.

arekolek
sumber
0

Jawaban ini saat ini hanya berlaku untuk menggunakan dua komputer Linux [atau mungkin bekerja pada Mac juga? - belum teruji pada Mac] (menyinkronkan dari satu ke yang lain) karena saya menulis skrip sinkronisasi ini di bash. Ini hanyalah sebuah pembungkus git, jadi jangan ragu untuk mengambilnya dan mengubahnya menjadi solusi Python lintas-platform atau sesuatu jika Anda mau.


Ini tidak secara langsung menjawab pertanyaan OP, tetapi begitu dekat saya jamin itu akan menjawab pertanyaan banyak orang lain yang mendarat di halaman ini (termasuk saya, sebenarnya, ketika saya datang ke sini dulu sebelum menulis solusi sendiri), jadi saya Saya mempostingnya di sini.

Aku ingin:

  1. kembangkan kode menggunakan IDE yang kuat seperti Eclipse pada komputer Linux yang ringan, lalu
  2. buat kode itu melalui ssh di komputer Linux yang berbeda dan lebih kuat (dari baris perintah, BUKAN dari dalam Eclipse)

Mari kita panggil komputer pertama tempat saya menulis kode "PC1" (Personal Computer 1), dan komputer ke-2 tempat saya membuat kode "PC2". Saya membutuhkan alat untuk menyinkronkan dengan mudah dari PC1 ke PC2. Saya mencoba rsync, tetapi itu sangat lambat untuk repo besar dan mengambil banyak bandwidth dan data.

Jadi, bagaimana saya melakukannya? Alur kerja apa yang harus saya gunakan? Jika Anda memiliki pertanyaan ini juga, inilah alur kerja yang saya putuskan. Saya menulis skrip bash untuk mengotomatiskan proses dengan menggunakan gituntuk secara otomatis mendorong perubahan dari PC1 ke PC2 melalui repositori jarak jauh, seperti github. Sejauh ini bekerja dengan sangat baik dan saya sangat senang dengannya. Ini jauh lebih cepat daripada rsync, lebih dapat dipercaya menurut saya karena setiap PC mempertahankan repositori fungsional, dan menggunakan bandwidth yang jauh lebih sedikit untuk melakukan seluruh sinkronisasi, sehingga mudah dilakukan melalui hot spot ponsel tanpa menggunakan banyak data Anda.

Mempersiapkan:

  1. Instal skrip pada PC1 (solusi ini mengasumsikan ~ / bin berada di $ PATH Anda):

    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. Sekarang edit file "~ / .sync_git_repo" yang baru saja Anda salin di atas, dan perbarui parameternya agar sesuai dengan kasus Anda. Berikut adalah parameter yang dikandungnya:

    # 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 klon repo Anda yang ingin Anda sinkronkan pada PC1 dan PC2.

  4. Pastikan kunci ssh Anda sudah diatur untuk dapat mendorong dan menarik repo jarak jauh dari PC1 dan PC2. Inilah beberapa tautan bermanfaat:
    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. Pastikan kunci ssh Anda sudah diatur untuk ssh dari PC1 ke PC2.
  6. Sekarang, masuklah cdke direktori mana saja di git repo di PC1, dan jalankan:

    sync_git_repo_from_pc1_to_pc2
  7. Itu dia! Sekitar 30 detik kemudian semuanya akan disinkronkan secara ajaib dari PC1 ke PC2, dan itu akan mencetak output sepanjang waktu untuk memberi tahu Anda apa yang dilakukannya dan di mana ia melakukannya pada disk Anda dan di komputer mana. Ini aman juga, karena tidak menimpa atau menghapus apa pun yang tidak dikomit. Alih-alih, ia mendukungnya terlebih dahulu! Baca lebih lanjut di bawah untuk cara kerjanya.

Inilah proses yang digunakan skrip ini (yaitu: apa yang sebenarnya ia lakukan)

  1. Dari PC1: Memeriksa untuk melihat apakah ada perubahan yang tidak dikomit ada pada PC1. Jika demikian, itu mengikat mereka untuk komit sementara di cabang saat ini. Itu kemudian memaksa mendorong mereka ke cabang SYNC jauh. Kemudian ia melakukan komitmen sementara yang baru saja ia lakukan pada cabang lokal, lalu menempatkan repo git lokal kembali ke keadaan semula dengan mementaskan semua file yang sebelumnya dipentaskan pada saat Anda memanggil skrip. Selanjutnyarsync adalah salinan skrip ke PC2, dan melakukan sshpanggilan untuk memberitahu PC2 untuk menjalankan skrip dengan opsi khusus untuk hanya melakukan hal-hal PC2.
  2. Inilah yang dilakukan PC2: masuk cdke repo, dan memeriksa untuk melihat apakah ada perubahan lokal yang tidak dikomit. Jika demikian, ia membuat cabang cadangan baru yang dipotong dari cabang saat ini (nama sampel: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- perhatikan bahwa YYYYMMDD-HHMMhrs - SSsec), dan melakukan perubahan yang tidak dikomit ke cabang tersebut dengan pesan komit seperti DO BACKUP OF ALL PERUBAHAN YANG TAK TERDAPAT PADA PC2 (TARGET PC / BUILD MACHINE). Sekarang, ia memeriksa cabang SYNC, menariknya dari repositori jarak jauh jika belum ada di mesin lokal. Kemudian, ia mengambil perubahan terbaru pada repositori jarak jauh, dan melakukan hard reset untuk memaksa repositori SYNC lokal agar sesuai dengan repositori SYNC jarak jauh. Anda mungkin menyebutnya "tarikan keras". Namun, ini aman, karena kami telah mendukung setiap perubahan yang tidak dikomit yang kami miliki secara lokal pada PC2, jadi tidak ada yang hilang!
  3. Itu dia! Anda sekarang telah menghasilkan salinan yang sempurna dari PC1 ke PC2 bahkan tanpa harus memastikan direktori kerja yang bersih, karena skrip menangani semua komit otomatis dan hal-hal untuk Anda! Cepat dan bekerja sangat baik pada repositori besar. Sekarang Anda memiliki mekanisme yang mudah untuk menggunakan IDE apa pun pilihan Anda pada satu mesin saat membangun atau menguji pada komputer lain, dengan mudah, melalui hot spot wifi dari ponsel Anda jika diperlukan, bahkan jika repositori adalah puluhan gigabyte dan Anda punya waktu dan terbatas sumber daya.

Sumber:

  1. Seluruh proyek: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Lihat lebih banyak tautan dan referensi dalam kode sumber itu sendiri dalam proyek ini.
  2. Bagaimana cara melakukan "hard pull", seperti saya menyebutnya: Bagaimana cara memaksa "git pull" untuk menimpa file lokal?

Terkait:

  1. git sinkronisasi repositori antar komputer, saat bergerak?
Gabriel Staples
sumber