总结一下我在“跨平台开发”上进行过的尝试

首先我得给标题中的 跨平台开发 下个定义 —— Windows 中开发、Linux 中运行
为什么要这样做?主要是我 Win 用那么多年顺手了,各种大大小小的软件在 Mac/Linux 下找不到替代品;其次是 Win 下跑代码多多少少会遇到一些问题,最好还是直接跑在 Linux 里。因此,才有了以下这些尝试

WSL / WSL 2

当你看到我所谓的跨平台开发时,第一个想到的可能是 WSL
WSL 刚出来不久时我是尝试过的,当时搭环境踩到一个什么坑忘了,各种查资料都搞不定。反而是查的过程中发现不少人认为 WSL 坑多,遂放弃
后来 WSL 2 推出,简单了解了一下发现是基于虚拟机。那我还不如继续用我的 VMware 呢,还支持快照啥的多舒服啊

VMware 的共享文件夹功能

创建一个 Linux 虚拟机,通过共享文件夹访问 Win 中的代码。原本以为这会是个终极的解决方案,而我确实也采用过这个方案一段时间,后来才发现一些问题
首先非常明显的是疑似 IO 很低。为什么说疑似,因为我用好几种方式对共享文件夹进行过 IO 测试,似乎都正常。可一旦我要执行里面的代码,一个普通的接口就要等待十几秒,非常抓狂。把代码复制到 Linux 内任意目录再执行,就瞬间响应了。百思不得其间,也查不到原因。所以只能说共享文件夹疑似 IO 很低
如果说上述问题忍忍也能无视掉,那 不支持软链接 就没法无视了。偶然一次当我需要初始化一个 vue 项目时,npm install 直接报错。查来查去才知道 Linux 下的软链接是无法在 Windows 的共享文件夹中正常工作的。直接给这个方案判了死刑

直接在虚拟机 Linux 下开发

虽然 JetBrains 家的 IDE 都有 Linux 版本,写代码本身不是问题
但 Win 下全局手势用习惯了,再加上 Linux 下也没有我喜欢的 Edge 浏览器。这就导致我写代码时如果要查资料还得切出虚拟机用 Win 上的浏览器,实在太麻烦

IDE 自带的部署功能

和 vscode 上的 remote 不同,JetBrains 家的 Deployement 本质上还是个 SFTP,代码放在本地,Linux 上只是一份副本。可以设置保存时自动上传
如果在 Linux 上执行了一些涉及文件改动的命令(例如 npm install \ composer require 之类),可以通过同步功能差量拉取到本地
8ba3dbbc4a1bf452402b13f4d9124bc3.png
起初我这里只显示了 从 xxx 下载上传到 xxx,这两个选项是全量的,不会比对差异,并不好使。经过排查可能是我禁用了某个官方插件导致的。全开插件之后才出现同步选项
除非是 node_modules 这种黑洞级目录,同步速度还是比较满意的,数百个文件也就几秒。要是 JB 懂得把这些文件一并打包然后下载解压到本地就更好了,逐个同步的机制遇上大量文件还是比较慢的
如果不想同步这些大目录,还可以设置忽略
6f0c85ea7f7cee3bccaef4224ceb54ce.png
由于代码实际是存储在 Linux 内的,所以总的来说是比较满意的一项解决方案

Samba

要说 Linux 和 Windows 之间共享文件的方案,Samba 肯定是被提起最多次的
安装教程满天飞,略过不表,说点不常见的
首先是配置文件 smb.conf 的文档 https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html
当时只注意到个 Samba Wiki,在里面找了半天都没找到些有意义的内容,抓耳挠腮。却没注意到下面的 Samba man pages in html 链接。点进去就是上述文档,有着完整的配置项说明

其次是权限问题。我虚拟机设的是 NAT 网络,仅本机可以访问到,所以在权限配置上就比较放飞自我,直接 777 完事。不过 samba 默认用的是 755,所以还需要在分享配置里加上两行

create mode = 0777
directory mode = 0777

接着是软链接问题。首先需要在全局配置项中加上 unix extensions = no。然后在对应的分享配置里添加

follow symlinks = yes
wide links = yes

这样,软链接也能正常工作了

最后,将 Samba 共享目录挂载为 Windows 网络驱动器,就能正常读写里面的代码了。

这个方案看似是完美的,但也仍然有个问题,那就是文件的变更无法及时体现在 IDE 中,常见于安装了某个依赖包之后
JetBrains 家的 IDE 会处在 正在同步… 的状态,动辄几秒几十秒,这个过程中智能补全和高亮可能无法正常工作。这时间干点别的什么又不够,干等着又着急。难受,而代码放在本地时是完全不会有这个问题的
也许,这就是网友常提到的 Samba 的性能问题?

还有一个难受的点,挂载网络驱动器之后,如果虚拟机没开,Win 资源管理器一打开就会卡死几分钟,似乎是在检查网络驱动器是否可用,很蛋疼

NFS

于是我开始尝试这个据说安全性不足但性能较强的 NFS,反正我 NAT 里的虚拟机无视一切安全性问题
安装配置过程不表。但后来始终连不上。几经折腾才知 NFS 依赖的某些服务每次启动时都会采用随机端口,防火墙光放通 111 和 2049 还不行。最后参考 https://chenyongjun.vip/articles/73 固定住了这些服务的端口并在防火墙上放通。解决了访问上的问题
简单使用一阵子,又发现了几个问题:

  • Win 下无法进行重命名操作,会提示“无效设备”
  • Win 下创建的文件/文件夹在 Linux 内都会显示为属于一个奇怪的用户
  • IDE 卡“正在同步”状态的问题几乎没有缓解

此时已经凌晨5点,真是不想再折腾了。没想到 nfs 的问题还比 samba 多一些。那我还不如用回 samba 算了

总结

最终还是用回了 Samba 方案,被迫忍受 正在同步…
光是 Samba 和 NFS 就折腾了今天一整天,还搞到那么晚,代码一点没动,心累

如果有更好的“跨平台开发”方案,还请各位大佬评论中指教,谢谢

补充:
受到 神林 的指点,找到了 JB 的同步功能,试用了几个项目,还蛮不错的。因此更改了 IDE 自带的部署功能 一节的内容
目前放弃了 Samba,改用 JB 的部署功能

8 条评论

昵称
  1. 了然

    国庆更新博客,真勤奋~!

  2. Kenvix

    WSL/WSL2 在windows下的文件互通走的是9P协议,不知道性能怎样

    1. mokeyjay

      最主要是不支持快照,想我这种菜鸡天天把系统玩坏实在是不喜欢

  3. 路过

    用webdav协议会不会好一点?

    1. mokeyjay

      面向局域网的 samba 都不太好使,webdav 是面向互联网的,恐怕……

  4. 惶心

    另外 gravatar 的调用大小改一下呗,50px 好模糊啊

    1. mokeyjay

      准备重写了,懒得改,wp代码看着糟心

  5. 惶心

    最近就在 WSL 上 van npm 来着……还行……(主要是能在 npm build 里面用 mv 和 cp)