通过SSH在Eclipse上远程参与项目

211

我有以下两个开发环境:

a) 安装了Eclipse CDT的Windows开发环境,
b) 只通过SSH访问的Linux远程服务器。

编译和运行项目所需的编译器和硬件都只有在B机器上。

我想从Windows开发环境“透明地”协作这个项目,使用Eclipse CDT构建、运行和调试该项目,并且希望能够从IDE中远程执行这些操作。

如何设置才能实现以下功能:

  • 构建工作正常?是否有比编写本地makefile更简单的解决方案,可以使用rsync同步项目并调用远程makefile启动实际构建过程?Eclipse managed build是否支持此功能?
  • 调试工作正常?
  • 最好能够正常进行Eclipse CDT代码索引?我是否必须手动将所需头文件从机器B复制到机器A并将其添加到包含路径中?

4
Kos,你最终使用了RSE吗?你的体验如何? - Aleksandr Levchuk
2
我设法做到了,但是:a)CDT在意识到虚拟文件系统方面存在一些问题(据我所知,这是一个暂时的问题,在他们将某些东西重写为较新的API时会消失;也许他们已经这样做了?IDK),b)我不得不通过自定义makefile来卷起自己的编译链,c)一个令人不愉快的烦恼-文件保存需要2~3秒钟,这很令人不安。 - Kos
1
如果我今天需要再次远程工作,我可能会再试一下RSE,但我可能会发现将其保留为本地项目并基于例如rsync的自定义构建系统更可行,正如我所提到的那样。 - Kos
2
不幸的是,我还没有成功设置远程调试或索引远程库头文件。我怀疑后者甚至无法完成。前者-我确信可以,但我没有真正需要深入研究它。 - Kos
我通过先登录到登录服务器,然后再从那里登录到我的远程机器来访问它。两者有不同的密码。有没有办法在Eclipse中使用这样的远程机器? - Arjun J Rao
显示剩余4条评论
9个回答

233

尝试使用 Remote System Explorer(RSE)。这是一组插件,可以完全满足你的需求。

RSE 可能已经包含在您当前的 Eclipse 安装中。要在 Eclipse Indigo 中检查,请转到 Window > Open Perspective > Other... 并从 Open Perspective 对话框中选择 Remote System Explorer 以打开 RSE 视角。

在 Eclipse 的 RSE 视图中创建一个 SSH 远程项目:

  1. 定义新连接并在 New Connection 对话框的 Select Remote System Type 屏幕中选择 SSH Only。
  2. 输入连接信息,然后选择 Finish。
  3. 连接到新主机。(假设已经设置了 SSH 密钥。)
  4. 连接成功后,展开主机的 Sftp Files,选择一个文件夹,然后从上下文菜单中选择 Create Remote Project。等待远程项目创建完成。

如果操作正确,现在应该有一个新的远程项目可在 Eclipse 的 Project Explorer 和其他视角中访问。如果正确设置了 SSH 连接,密码可以作为正常 SSH 认证过程的可选部分。现在已通过 SSH 在 Eclipse 中创建了一个远程项目。


2
RSE仍然很棘手。 RSE的最佳想法是让Eclipse通过SSH连接完成所有操作,但该功能尚未工作。 工作功能涉及一些服务器,您需要在Linux框上设置它。 - Ioan
2
RSE的开发人员也喜欢收到错误/增强报告。 - Aaron Digulla
2
@Aaron - 我之前尝试过使用Makefile中的rsync解决方案,这基本上会将您的密钥序列替换为一个Ctrl+B。问题是,使用这种方法,我既无法从Eclipse运行也无法进行调试。 RSE确实听起来像是一项很好的工具; @Ioan,您能详细说明一下哪些地方出了问题吗?RSE维基似乎列出了SSH文件系统和远程调试作为当前功能...或者我将在本周一尝试它。 - Kos
3
嗨,@AaronDigulla,解决方案很棒,但我发现在构建远程项目时,Eclipse 试图在本地进行编译。有没有办法让它在远程机器上进行编译和运行? - shaoyl85
2
C/C++索引在RSE中无法正常工作。索引器抱怨缺少符号。当项目和源文件存储在本地时,它可以很好地工作,但是在RSE中却不行。有什么想法吗? - Black_Zero
显示剩余18条评论

13

最简单的方法是在Linux上运行Eclipse CDT,并使用X11-Forwarding或远程桌面软件(例如VNC)。

当然,这只有在Linux上安装了Eclipse并且与该盒的网络连接足够快时才可能实现。

优点在于由于一切都是本地的,因此您不会遇到同步问题,也不会出现任何尴尬的跨平台问题。

如果您在该盒上没有安装Eclipse,则可以考虑通过SMB(或SSHFS)共享您的Linux工作目录,并从Windows机器访问它,但这需要相当多的设置。

两者都比拥有两个副本要好,特别是跨平台情况下如此。


1
恐怕这个 Linux 盒子甚至没有 X11。 :) - Kos
2
@Kos,你需要X11服务器才能在你物理所在的位置运行 - 可以使用虚拟机中的Linux或Windows的X11服务器 - 并且需要在Linux服务器上运行Eclipse。ssh只允许隧道传输网络数据 - 你会发现压缩和“-c blowfish”可以帮助提高体验。 - Thorbjørn Ravn Andersen
只是想澄清一下 - 你是指远程机器上的所谓“无头Eclipse”吗?(前提是它甚至有Java :))。我正在寻找一个轻量级的客户端解决方案,但在远程机器上进行一些设置也可能是一个选项。 - Kos
7
@Kos: 不行。X11 的工作方式如下:你有一个客户端和一个服务器。服务器是显示器连接的地方,它完成所有的渲染和显示操作。客户端(在这个例子里是 Eclipse)只需要向服务器发送渲染命令。因此,你必须在 Windows 上安装 X11,并在 Linux 上运行 Eclipse。在 Linux 上,你只需要设置 DISPLAY 变量,这样 Eclipse 就知道服务器在哪里了。 - Aaron Digulla
5
网络和服务器都需要快速运行,否则Eclipse会变得非常慢。 - mattalxndr

7

我自己也遇到了同样的问题,最后我选择在Linux主机上检出到一个Samba共享目录,并在Windows机器上使用notepad++本地编辑该共享文件,然后通过PuTTY在Linux上编译。(我们不允许更新Linux主机上十年前的编辑器版本,而且它没有Java,所以我放弃了X11转发)

现在...我在Windows主机上运行现代Linux虚拟机,在VM中添加所有我想要的工具(如CDT),然后在一个紧密类似于RTE的chroot jail中检出和构建。

这是一个笨重的解决方案,但我想把它加入到混合中。


5
我的解决方案与SAMBA类似,但使用sshfs。用sshfs挂载远程服务器,在远程机器上打开我的makefile项目,然后从那里开始。看起来我也可以这样运行mercurial的GUI前端。构建我的远程代码就像这样简单:ssh地址 远程make命令。不过我正在寻找一种合适的调试方式。可能是通过gdbserver?

4

我尝试使用ssh -X,但速度实在是太慢了。

我也尝试了RSE,但它甚至不支持使用Makefile构建项目(有人告诉我自从我发表答案以来情况已经改变,但我还没有尝试过)。

我了解到NX比X11转发更快,但我无法让它工作。

最后,我发现我的服务器支持X2Go (如果您的服务器不支持该链接提供安装说明)。现在,我只需要:

  • 在服务器上下载和解压Eclipse,
  • 在本地机器上安装X2Go(Ubuntu上使用sudo apt-get install x2goclient),
  • 配置连接(主机、使用ssh密钥进行自动登录、选择运行Eclipse)。

一切都像在本地机器上工作一样,包括构建、调试和代码索引。而且没有明显的延迟。


只需补充一点,这在客户端使用Windows也非常好。客户端和服务器都很简单易安装,使用体验就像本地操作一样。 - Andy Madge

3

两年前我也遇到了同样的问题,我通过以下方式解决了它:

1)我使用makefile来构建项目,而不是使用eclipse管理 2)我使用SAMBA连接在Eclipse中编辑文件 3)构建项目: Eclipse调用一个“本地” makefile,该makefile打开一个SSH连接到Linux主机。在SSH命令行上,您可以提供参数,在Linux主机上执行这些参数。我使用makeit.sh shell脚本作为参数,调用Linux主机上的“真正”的make。 您还可以通过本地makefile中的参数提供不同的构建目标--> makeit.sh --> Linux主机上的makefile。


不错,但不能称之为“透明”——至少不允许调试。此外,它也可以基于RSync而不是Samba(这是我在发布原始问题之前使用的)。 - Kos

1
我解决这个问题的方法是:
对于Windows:
1. 使用Samba从Linux机器导出“workspace”目录。 2. 在Windows本地挂载它。 3. 运行Eclipse,并将挂载的“workspace”目录作为Eclipse工作区。 4. 导入您想要的项目并开始工作。
对于Linux:
1. 使用sshfs挂载“workspace”目录。 2. 运行Eclipse。 3. 运行Eclipse,并将挂载的“workspace”目录作为Eclipse工作区。 4. 导入您想要的项目并开始工作。
在两种情况下,您可以通过Eclipse构建和运行,或通过ssh在远程机器上构建。

0

如何在Eclipse中本地编辑,但使用我编写的基于git的脚本(sync_git_repo_from_pc1_to_pc2.sh)进行远程同步和构建

这个答案目前只适用于使用两台Linux计算机(或者可能也适用于Mac?- 未在Mac上测试)(从一个同步到另一个)因为我用bash编写了这个同步脚本。然而,它只是git的包装器,所以如果您愿意,可以随意将其转换为跨平台Python解决方案或其他内容。


这并不能直接回答楼主的问题,但它非常接近,我保证它会回答很多其他人的问题,他们会着陆在这个页面上(实际上,我自己也是如此,因为在写自己的解决方案之前就来到这里了),所以我还是要在这里发布它。

我想要:

  1. 使用像Eclipse这样强大的IDE在轻量级Linux计算机上开发代码,然后
  2. 通过ssh在不同的更强大的Linux计算机上构建该代码(从命令行而不是从Eclipse内部)

让我们将编写代码的第一台计算机称为“PC1”(个人电脑1),将构建代码的第二台计算机称为“PC2”。 我需要一个工具,可以轻松地从PC1同步到PC2。我尝试过rsync,但对于大型存储库来说速度极慢,并且消耗大量带宽和数据。

那么,我该怎么做?应该使用什么工作流程?如果您也有这个问题,这是我决定采用的工作流程。我编写了一个Bash脚本来自动化此过程,使用git通过远程存储库(如GitHub)自动将更改从PC1推送到PC2。到目前为止,它工作得非常好,我非常满意。它比rsync快得多得多,我认为更加可靠,因为每台PC都维护着一个功能性的git repo,并且在整个同步过程中使用的带宽要少得多,所以即使在使用手机热点时也很容易完成而不消耗大量数据。

设置:

  1. 在PC1上安装脚本(此解决方案假定~/bin在您的$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. 现在编辑刚刚复制的“~/.sync_git_repo”文件,并更新其参数以适应您的情况。以下是它包含的参数:

     # 您正在将文件同步到的PC2上的git repo根目录;此目录必须*已经存在*,
     # 并且您必须已经在其中*`git clone`了*您的git repo!
     # - 不要使用变量,如`$HOME`。请明确说明。这是因为变量扩展将发生在本地计算机上,
     #   而我们需要的是远程计算机上的变量扩展。相反,明确说明只是避免了这个问题。
     PC2_GIT_REPO_TARGET_DIR="/home/gabriel/dev/eRCaGuy_dotfiles" # 明确地输入此内容;不要使用变量
    
     PC2_SSH_USERNAME="my_username" # 明确地输入此内容;不要使用变量
     PC2_SSH_HOST="my_hostname"     # 明确地输入此内容;不要使用变量
    
  3. 在PC1和PC2上克隆您想要同步的repo。

  4. 确保您的ssh密钥已经设置好,可以从PC1和PC2推送和拉取远程repo。以下是一些有用的链接:

    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. 确保您的ssh密钥已经设置好,可以从PC1到PC2进行ssh连接。

  6. 现在,在PC1上的git repo中的任何目录中运行以下命令:

     sync_git_repo_from_pc1_to_pc2
    
  7. 就这样!大约30秒后,所有东西都会神奇地从PC1同步到PC2,并且它将一直打印输出以告诉您它正在做什么,以及在您的磁盘上的位置以及在哪台计算机上执行操作。它很安全,因为它不会覆盖或删除未提交的任何内容。它首先备份!阅读下面的更多信息以了解其工作原理。

这个脚本使用的过程(即它实际在做什么)如下:

  1. 从PC1:它检查是否有任何未提交的更改在PC1上。如果是这样,它会将它们提交到当前分支的临时提交中。然后,它强制将它们推送到远程SYNC分支。接下来,它取消提交本地分支上刚刚进行的临时提交,然后通过暂存之前调用脚本时已经暂存的任何文件,将本地git repo恢复到完全相同的状态。接下来,它将脚本的副本rsync到PC2,并使用特殊选项对PC2进行ssh调用以运行脚本。
  2. 以下是PC2的操作:它cd进入repo,并检查是否存在任何本地未提交的更改。如果是这样,它将创建一个新的备份分支,该分支从当前分支分叉(示例名称:my_branch_SYNC_BAK_20200220-0028hrs-15sec<--注意这是YYYYMMDD-HHMMhrs--SSsec),并使用诸如DO BACKUP OF ALL UNCOMMITTED CHANGES ON PC2 (TARGET PC/BUILD MACHINE)的提交消息将任何未提交的更改提交到该分支中。现在,它检出SYNC分支,如果它还没有在本地机器上,则从远程仓库中拉取它。然后,它获取远程仓库中的最新更改,并进行硬重置以强制本地SYNC仓库与远程SYNC仓库匹配。您可以将其称为“硬拉取”。但是,这是安全的,因为我们已经在PC2上备份了任何本地未提交的更改,因此不会丢失任何内容!
  3. 就是这样!您现在已经生成了从PC1到PC2的完美副本,甚至无需确保干净的工作目录,因为脚本已处理了所有自动提交和其他事项!它快速并且在大型存储库上运行非常良好。 现在,您拥有了一种易于使用任何IDE的机制,在一个机器上构建或测试另一个机器,即使存储库有数十GB并且时间和资源受限,也可以轻松地通过wifi热点从手机上实现。

资源:

  1. 整个项目:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
  2. 在此项目的源代码中,可以看到更多的链接和参考资料。
  3. 如何进行“硬拉取”,我称之为:如何强制执行“git pull”以覆盖本地文件?

相关:

  1. 在计算机之间同步git存储库时,如何移动?

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接