VSCode将一份代码同步到多台服务器的解决方案

Posted by kevin on September 22, 2021

preface

我大概两年前就开始用 VSCode 了,虽然很好用,但是后来由于它对 PyTorch 的补全不太彳亍,以及一份代码同步到多个远程服务器很不方便便转向了 PyCharm,之前用 VSCode 的时候直接将代码放在服务器上修改,但是有时候会没有显卡跑,而另一台服务器显卡有空闲,要将代码同步就很麻烦,而用 PyCharm 的话就可以绑定多个服务器,在本地只需要维护一份代码,哪台服务器有空闲就上传到哪台服务器,这样就很方便。前几天因故 PyCharm 出了点问题,又准备开始用 VSCode,VSCode 和 PyCharm 的差别就只有同步多个服务器的功能了,之前我找过,没有合适的插件,然后在实验室同学的研究下发现了 sftp 这个插件,一番配置,好像真的可以完成这个功能。

下载插件

首先去 VSCode 插件下载处输入 sftp ,有三个,选择第二个,作者是 Natizyskunk ,原版作者的仓库已经几年没维护了,有很多 bug,这个老外接手了这个插件并维护。

配置config

按住 ctrl+shift+p,就会出现菜单栏,输入 sftp 就会出现和插件相关的内容

image.png

选择第二个 SFTP: Config 就会在项目的 .vscode 下面生成一个 sftp.json 文件,里面就是我们要使用的连接配置,下面是我的模板,如下,我添加了两个服务器,remotepath 是本地的文件在远程上对应的目录,没有的话会自动生成,ignore 就把不想同步的文件添加上去,类似 .gitignore

{
    "name": "✌",
    "protocol": "sftp",
    "port": 22,
    "profiles": {
        "159": {
            "host": "",
            "username": "",
            "password": ".",
            "remotePath": "/data1/kevin/goubatest"
        },
        "190": {
            "host": "",
            "username": "",
            "password": "",
            "remotePath": "/raid/kevin/mmdet180"
        }        
        
    },
    "uploadOnSave": true,
    "downloadOnOpen":false,
    "ignore": [
        ".vscode",
        ".git",
        ".DS_Store",
        ".github",
        ".dev_scripts",
        ".idea",
        "show_dirs/*",
        "work_dirs/*",
        "checkpoints/*",
        "data"
    ],
    "watcher": {
        "files": "data/*",
        "autoUpload": true,
        "autoDelete": false
    },
    "defaultProfile": "159"
}


整完了之后就可以将文件上传到服务器了,注意上面我用了 defaultProfile 这个配置来添加一个默认的远程服务器,如果没有的话,就需要输入 SFTP: Set Profile 来选择一个远程服务器,选好了之后下方就会出现对应的服务器名字

image.png

然后在左边的文件栏里可以将所有文件同步上去,也可以只同步一部分文件,也可以将远程的东西同步到本地,很方便

image.png

上传之后可以在左边的 sftp 工具栏中看到对应的远程目录下的文件,而且打开后是只读的,在文件的前面会有一个 ~ 波浪线,这点挺好的,防止误编辑。我觉得这个插件比 PyCharm 的功能要好,他会对比本地和远程的不同,用 Sync Local/Remote/Both 的话,他只会上传两边不同的文件,相同的文件不会上传,PyCharm 的话是直接给传上去了,要是我本地有个巨大的文件,每次上传都得花很久时间。

要是想再将代码传到另一个服务器上的话,只需要 SFTP: Set Profile 选择另一个服务器再上传一遍就行了。

曲线救国

同步代码的问题解决了,本以为能够抛弃 PyCharm 了,但是还有一个问题,那就是自动补全,如果这份代码需要的库在远程服务器上安装了,但是在本地没有安装的话,是无法进行自动补全的,只能在本地也装一份,常规的库也就算了,有些库不支持 windows,就装都装不了,这是个很头疼的事,我和 jlchen 讨论了一下有没有可能曲线救国,最终还真有,那就是,抛弃本地环境,直接返璞归真,在一台远程服务器上直接操作代码,完了再同步到其他服务器,也就是相当于将一台装有环境的服务器当成客户端,利用 SFTP 插件将代码传到另外的服务器,这样子的话呢,就能够解决自动补全的问题了!

可能的Bugs

每次 SFTP: Set Profile 都显示没有合适的 profile,只要将 sftp.json 重新替换一下(不使用它自动生成的)就行了,我盲猜是因为文件编码的问题(fileencoding=unix/dos),还没空去验证是不是这个问题

reference

(官方文档,各种参数说的很明白了)