preface
我大概两年前就开始用 VSCode 了,虽然很好用,但是后来由于它对 PyTorch 的补全不太彳亍,以及一份代码同步到多个远程服务器很不方便便转向了 PyCharm,之前用 VSCode 的时候直接将代码放在服务器上修改,但是有时候会没有显卡跑,而另一台服务器显卡有空闲,要将代码同步就很麻烦,而用 PyCharm 的话就可以绑定多个服务器,在本地只需要维护一份代码,哪台服务器有空闲就上传到哪台服务器,这样就很方便。前几天因故 PyCharm 出了点问题,又准备开始用 VSCode,VSCode 和 PyCharm 的差别就只有同步多个服务器的功能了,之前我找过,没有合适的插件,然后在实验室同学的研究下发现了 sftp
这个插件,一番配置,好像真的可以完成这个功能。
下载插件
首先去 VSCode 插件下载处输入 sftp
,有三个,选择第二个,作者是 Natizyskunk
,原版作者的仓库已经几年没维护了,有很多 bug,这个老外接手了这个插件并维护。
配置config
按住 ctrl+shift+p
,就会出现菜单栏,输入 sftp
就会出现和插件相关的内容
选择第二个 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
来选择一个远程服务器,选好了之后下方就会出现对应的服务器名字
然后在左边的文件栏里可以将所有文件同步上去,也可以只同步一部分文件,也可以将远程的东西同步到本地,很方便
上传之后可以在左边的 sftp 工具栏中看到对应的远程目录下的文件,而且打开后是只读的,在文件的前面会有一个 ~
波浪线,这点挺好的,防止误编辑。我觉得这个插件比 PyCharm 的功能要好,他会对比本地和远程的不同,用 Sync Local/Remote/Both
的话,他只会上传两边不同的文件,相同的文件不会上传,PyCharm 的话是直接给传上去了,要是我本地有个巨大的文件,每次上传都得花很久时间。
要是想再将代码传到另一个服务器上的话,只需要 SFTP: Set Profile
选择另一个服务器再上传一遍就行了。
曲线救国
同步代码的问题解决了,本以为能够抛弃 PyCharm 了,但是还有一个问题,那就是自动补全,如果这份代码需要的库在远程服务器上安装了,但是在本地没有安装的话,是无法进行自动补全的,只能在本地也装一份,常规的库也就算了,有些库不支持 windows,就装都装不了,这是个很头疼的事,我和 jlchen 讨论了一下有没有可能曲线救国,最终还真有,那就是,抛弃本地环境,直接返璞归真,在一台远程服务器上直接操作代码,完了再同步到其他服务器,也就是相当于将一台装有环境的服务器当成客户端,利用 SFTP 插件将代码传到另外的服务器,这样子的话呢,就能够解决自动补全的问题了!
可能的Bugs
每次 SFTP: Set Profile
都显示没有合适的 profile,只要将 sftp.json
重新替换一下(不使用它自动生成的)就行了,我盲猜是因为文件编码的问题(fileencoding=unix/dos),还没空去验证是不是这个问题