分享 使用 Windows 10 + WSL 进行无缝 Ruby 开发

nine · 2019年05月09日 · 最后由 jelly-g 回复于 2023年12月06日 · 14867 次阅读
本帖已被管理员设置为精华贴

最近使用 Windows 10 比较多,越来越觉得 Mac 的 GUI 是上个世纪的产物了,所以一直在琢磨要不要在 Win 上搞 Ruby。刚巧,本月微软公布了 3 个讨好 Linux/Unix 开发者的产品/功能。

  1. Windows Subsystem for Linux 2 ( WSL2 ) ,预期年底发布。
  2. Windows Terminal ,预期年底发布,现在可以自行编译(功能没有视频上的牛 X)。
  3. VSCode Remote ,VS 的插件,现在可以安装。

其中 VSCode Remote 是一组插件,由 3 个插件组成

  1. Remote SSH
  2. Remote Containers
  3. Remote WSL

具体介绍可以看 VS Code Remote 发布!开启远程开发新时代

于是尝试了一把 Win 下开发。之前也 try 了一下虚拟机方案,感觉不是我想要的,而且挂载系统有 bug。看到新闻后,想起来之前同事在 2017 年就使用 WSL 了,而且在我们公司的实际项目中使用了大半年,并没有什么不妥。

WSL

在 Windows 上运行的 Linux,和虚拟机不同,WSL 和宿主 Windows 是几乎无缝的。

有很多发行版可以用,我选择的是 Ubuntu,WSL 2 还早,目前可安装的 WSL 1 完全可以胜任(如何安装?在 Microsoft Store 里点击安装,网上有图文详细教程,可自行 Google)

Windows Terminal

编译过程比较麻烦,我没有编译成功,用网友编译好的版本,提示证书问题,装不上。后来按 第 45 期 Windows Terminal 微软新版终端工具安装教程 的步骤,把证书搞定,安装成功了。不过实际体验和 Hyper、ConEmu 没有什么质的差别。

附 2 个网友编译版下载地址:

https://cloud.natfrp.org/s/AaxfrxK96JebHsj

http://cdn.lr3800.52qdw.cn/Terminal.7z

VSCode Remote

VSCode 的 Remote 方案也尝试了,实际结果是没有什么卵用。

实际需要做的是

  1. 安装 WSL
  2. 使用任意终端(包括 cmd、powershell 都可以),进入工作目录,输入 wsl + 回车,即可进入 wsl 的 shell 实际的效果如下

也就是说使用任意 Windows 的编辑器/IDE 对 win 上的目录进行编码,实际代码运行在 WSL 内。rails s 后,打开 Windows 的浏览器,输入http://localhost:3000 即可访问 rails 项目。完全无缝。

其中 windows 的文件系统按盘符,自动挂载在 WSL 的“/mnt/盘符”目录下,图中的 d:\work\demo3 挂载在 /mnt/d/work/demo3 目录下。 所以也可以输入 wsl 后 cd 到 /mnt/d/work/demo3 运行 rails s

在 WSL 下可以使用 windows 命令,输入 code-insiders . 之后会自动使用 VSCode 预览版打开 wsl 的目录,并且安装 VSCode 的 Remote WSL 插件

此时新打开的 VSCode 左下角会多出一个 WSL 的图标

点击 WSL 图标会出现菜单

这个模式用于编辑 WSL 系统内文件比较方便。但是对于 Rails 开发,WSL 模式是没有什么用的,直接在 mnt 目录下编辑代码就行了。毕竟我对 WSL 的文件系统不是很放心,不想把代码放在上面。另外 WSL 的文件系统默认在 C 盘的某个目录下,还没有研究如何更改位置。

最后,说下数据库。

我这边数据库是在 win 下安装的,理由也是对 WSL 不太放心,所以此时 Rails 的 database.yml 文件需要配置上 host 和 port。不配 host 和 port 的话会默认连接 WSL 里的 unix 数据库套接字。

也就是说这套方案只有程序运行环境在 WSL 内,而程序代码、编辑器、数据库,和所有开发配套装备全部都是 windows 上的。

  1. Win10 和 WSL 是两个系统使用的是不同的公钥,这点需要注意一下。
  2. WSL 系统长时间不使用会挂起,第一次做 apt-get update 的时候切到别的界面了,回来发现不动了,然后按回车之后就开始动了,不知道是挂起了还是 terminal 的 bug。
  3. 直觉上速度不是那么快,不知道和上一条是否有关。
  4. node 的 hmr 有时不太灵光,目前还不能确定是不是 WSL 的锅。

不过

  1. 台式机 CPU 总比笔记本快。
  2. 程序运行效率不是第一位,最重要的还是 GUI 对 CPU 的利用率和 GUI 软件操作的便捷性。
  3. 比起虚拟机 WSL 可以使用全部的 CPU 内核和内存。可以按 htop 看下效果(具体性能待测试)

其他:想到再补充。

适用人群

  • 对 Windows 有需求的,比如经常装机刷机,经常使用带 VBS 的 Excel,经常测试各种 CS ERP,经常使用 IE 专属系统的,经常使用 Win 专有软件的,等等……
  • 对 Mac 特性需求不强烈的,或对移动办公需求不强烈的。
  • 对 Linux/Mac 操作系统不满的。
  • 资金紧张的新手,或对 Linux/Mac 系统不熟悉的新手。
  • 资金紧张的团队,或需要大规模招募新手的团队。

顺便说下 VSCode Remote SSH 的用法。

安装插件后,按 Ctrl + Shift + P 调出菜单选择 Connect to Host 选择 Configure SSH Hosts 编辑远程服务器

编辑后点击左侧电脑图标,可以看到常用的 host,点击后可以连接到服务器

之后会打开一个新的 VSCode 窗口,左下角显示 SSH 连接标志。

之后可以编辑服务器上的文件

RemoteSSH 默认使用公钥连接,所以连接服务器之前需要安装 OpenSSH,生成公钥,然后在服务器上配置好公钥,不然就会一直连接不上。

Remote Containers

连接容器的,容器没怎么玩过,未测试,理论上应该和 Remote SSH 差不太多。

于是

SOHO 的 007 们可以在工作累了的时候无缝切换到游戏模式了。 (逃

补充,dd 测试磁盘写入 IO 基本测试

dd if=/dev/zero of=/mnt/e/test conv=fdatasync bs=1M count=1024 #1M写入性能
dd if=/dev/zero of=/mnt/e/test conv=fdatasync bs=4k count=262144   #4K写入性能

Mac 没有 fdatasync 参数,默认使用 osync,输出结果为 bytes/s

硬件环境 dd 测试路径 配置 系统 1M 写 4K 写
台式机+SSD 系统盘 /tmp/test 7700K + 32G 内存 + 960EVO 1TB WSL 870 MB/s 409 MB/s
台式机+SSD 非系统盘 /mnt/d/work/test 7700K + 32G 内存 + 960EVO 1TB WSL 963 MB/s 470 MB/s
台式 + 机械硬盘 /mnt/e/test 7700K + 32G 内存 + 西数 3T 蓝盘 WSL 132 MB/s 127 MB/s
Surface Pro4 /tmp/test I7 + 8G 内存 + 256G 硬盘 WSL 177 MB/s 105 MB/s
Macbook Pro 15 2016 /tmp/test I7 + 16G + 512SSD macOS 10.14.4 ≈340MB/s ≈570MB/s
国内某云(非阿里云)高性能磁盘 /tmp/test 2 核 4G 高性能磁盘 CentOS 7.4 266MB/s 234MB/s
国内某云(非阿里云)企业磁盘 /tmp/test 4 核 8G 企业级磁盘 CentOS 7.4 137MB/s 127MB/s
Google 云 + SSD 永久性磁盘 /tmp/test 4 核 15G SSD 永久性磁盘 CentOS 7.4 213MB/s 199MB/s
Google 云 + 标准磁盘 /tmp/test 4 核 15G 标准磁盘 CentOS 7.4 116MB/s 113MB/s

结论:

Mac 由于 dd 参数不同,结果仅供参考,不过 Mac 磁盘似乎是针对小文件优化过的,4K 写速度要快于 1M 写速度。 960EVO 仅仅 4k 写速度似乎略小于 Macbook Pro 512SSD(缺少 fdatasync 参数)。 所以担心磁盘 IO 的基本可以放心了,即使是普通的机械蓝盘,也不会差太多。

速度瓶颈,主要应该在 CPU 上,对比之前将 i7 的 MacBook Air 更新为 Macbook Pro,程序运行实际感官提升超过不止 10 倍。 (完)

請問一下最近的 WSL 支援 GPU 了嗎?

hong_xin 回复

目前,似乎没有,还未求证。

huacnlee 将本帖设为了精华贴。 05月10日 09:38
nine 关闭了讨论。 05月10日 09:59
nine 重新开启了讨论。 05月10日 09:59

如果真的可以这样,那么对于那些程序在 linux 运行而产品在 windows 端展示的项目时非常棒的消息啊。以后开发 ruby 门槛也可以低一些了

👍,我正好也想分享这个,最近用这个组合写 rails 一周了,比过去在 ubuntu 方便挺多

kxu1988 回复

可以分享哦,优缺点用了一周看样子还不错呢

我软牛逼!

目前的 WSL 还存在一个问题,在 WSL 中安装合适用 docker,实际上是 connect 到 docker for windows 中的。 前天给同事在 WSL 中运行 docker,提示 docker for windows,由于是家庭版 win10,安装不了 docker for win…… 遂放弃

kimmg 回复

装 win 专业版 emmm

kimmg 回复

我的也是家庭版,下载专业工作站版 ISO,双击打开,直接升级。完成后默认激活状态。若是没有激活,淘宝有 30 块钱电话激活。

真是赶上好时候了,节前刚入了一台小米 pro,i7 4 核 16G 才不到 7k,环比之下同配置的 mbp 要贵 10k。经过一段时间的适应发现,现在的 win10 和原来的 win xp 真是不一样了,对开发者很友好。

  • RubyMine 自带 WSL 支持
  • cmder + zsh 接近 iTerm 的体验
  • 多桌面真的很舒服,触摸板也很赞

现在跑卡夫卡都不卡了!

nine 回复

謝謝,半年前想用 WSL 跑一個依賴 tensorflow-gpu 的 web service 搭配 Rails 使用,研究很久發現還沒支援 GPU,只好退回正常安裝的 Ubuntu。 WSL 用起來很方便,希望未來能夠支援 GPU

hong_xin 回复

pytorch winfows 版支持 GPU,tersorflow 不清楚,你可以试下

类似 #15 的组合已经用了两个月,很舒爽,系统也很干净。

Windows 10 大为改观了我对 Windows 系统的印象。多桌面的使用体验比 macOS 好很多。

wsl io 性能这么垃圾你们也用的下去

liprais 回复

en,文中有说,观点就是 wsl 的性能其实并不是很重要,损耗一些完全可以接受,我更看重系统 GUI 本身以及丰富的 GUI 软件带来操作效率提升。

并且除了运行环境,其他一切都在 WIN 上,包括代码和数据库。所以真正考验 IO 的地方就是 WSL 的文件挂载。

另外我是有 960EVO 加持的,所以实际 IO 强过主流生产环境 ssd 云主机是没什么问题的。

毕竟好看才是第一生产力😎

nine 回复

不是我不愿意……电脑是同事的,他不愿意再折腾升级专业版……我自己早就专业版了。

我在 surface pro 上启动中大型 rails 应用 性能可不是 lz 说的可以忍受(哭),启动进程 2 分钟,打断点进到 pry 里要 30s,在 pry 里打一条调试命令也要 30s,完全无法开发

xiaok 回复

哈 Surface Pro 肯定不行的,之前的老的 I7 Macbook Air 都慢的一塌糊涂。 这个方案主要还是给台式机用的。一会发下磁盘 IO 测试结果。

nine 回复

目前只有 surface pro 类的产品可以满足我对硬件的需求,只能等 wsl2 了,目前用 cloud studio + 一台自己的服务器开发

一直关注但是没实践,昨晚和今早亲自实践了一下, 先上图:

1.win 的 bash 复制黏贴快捷键冲突换了鼠标右键刚一开始有点不适应

.win 的 bash 比较丑虽然我用 zsh + oh my zsh 不过体验依然不如 item2 + zsh + oh my zsh 不过也可以接受在意料之中

3.装好之后 ubuntu 虚拟在 192.168.1.2 上 可以添加共享文件夹

4.zai ubuntu 上装好 ruby 环境 win 上把代码放在贡献文件夹 在 win 上安装 git 这样可以使用 vscode 的 git 功能

5 今早跑到了 rake db:migrate 跑完了还没来得及 rails s 时间到了去上班了 不过我想问题不大了

总结:

对于新手,刚入门资金不足,动手装黑苹果 或者 linux 双系统有困难的同学算是不个不错的工具 它不完美还有很多问题,但是即使是这样它也足够用来让你熟悉 ubuntu bash linux 等知识,入门 ruby 也没有那么高的门槛了,值得尝试成本极低,我是断断续续弄了 3 小时不到吧(主要是下载 ubuntu 很慢),值得一试。

kevinyu 回复

终端我用的 MobaXterm,复制粘贴,ctrl+shift+C / V,其他相关需要配置下。

比如直接进 WSL 并启动 ZSH+ 工作区,和指定公钥位置。

rails s 和 rake 任务启动会比较慢。

ubuntu 下载慢,改成国内源会好点。

nine 回复

是的 rake rails 执行慢 我是放在固态的不知道为何,源已经改了,另外我发现其实字体看起来并没有那么丑,我换了 4K 显示器之后发现字体美观程度和 mac 几乎是一样的 可能是因为没有毛刺的原因?

kevinyu 回复

en,Win10 开启缩放就好了,字体倍儿棒,之前没法用是因为 n 多软件 HDPI 的设计没跟上,缩放后全是毛边,现在基本都搞定了。

rake rails 慢有说是 Windows Defender 的问题,不过我这是关闭的(非法途径关闭),可以等等 WSL2 正式版试试,目前 insider 了 https://www.oschina.net/news/107424/wsl-2-is-now-available-in-windows-insiders

好像弄那个 win terminal 需要安装 vs2017 往后的版本?

PaulChan1995 回复

编译的话是需要,不过我没编译成功,试用的网友编译好的版本。

关注这段,host 是如何设置呢? 最后,说下数据库。 我这边数据库是在 win 下安装的,理由也是对 WSL 不太放心,所以此时 Rails 的 database.yml 文件需要配置上 host 和 port。不配 host 和 port 的话会默认连接 WSL 里的 unix 数据库套接字。

chorylee 回复

host 不用设置,完全自动的,跟本机一样。

WSL2 端口不能直接访问了,需要做映射https://github.com/microsoft/WSL/issues/4150

WSL 坑补充:

  1. 新建文件权限问题,umask 不生效,导致经常看到警告 https://github.com/Microsoft/WSL/issues/352

  2. windows 挂在文件权限问题,挂在的文件是 777,解决: https://superuser.com/questions/1323645/unable-to-change-file-permissions-on-ubuntu-bash-for-windows-10

kevinyu 回复

wsl 靠谱?

posee 回复

之前的回答中已经提及了 WSL 适应哪些人群,新手小白 只有 windows 环境且对于 白苹果、黑苹果、ubuntu 等双系统使用有难度的同学,我反正暂时不会用这个毕竟有更好的,还达不到完美的水准。

wsl2 已装,terminal 商店里已经可以用了 00,等待试用

曾因為送修電腦,二個禮拜密集使用 Win10 + WSL 開發 Rails,使用心得是 WSL 相較於現有的解決方案來說,是比較友善且容易處理編譯、安裝相關套件的。但仍會發生權限問題 或 在某些情況下 WSL 掛程式跑會運作到死掉或跳不出程序 ( Ctrl + C ) 😅 😅

fangxing204 回复

权限这个问题确实比较别扭,其他的基本是可以用了,

特别的,要是用 docker,也还是挺恶心,当然大部分还是与那堵墙有关系。

哈哈,给楼主点赞,虽然我用的是 mac

整个教程看完了,我只记得了有一包玉溪 😂

推荐一个 SSH 工具 Termius,特别好用,之前一直在 iPad 上使,发现 windows 也支持,设计的非常棒

自己主力机是 mbp15,之前在 WSL 刚出来时在 surface pro 上折腾过,遇到基本楼上遇到过的所有问题(docker io 慢之类),后来一气之下换了一台 new macbook 出差用。

但还是觉得微软这个方向很不错,希望后续能把体验做得更无缝,毕竟使用 windows 的硬件更便宜。

Rei null 提及了此话题。 11月30日 21:58
nine 什么差异导致了 AI 领域选择了 py 而不是 rb? 提及了此话题。 06月25日 09:46
imdev 回复

能正常 debug 运行吗

需要 登录 后方可回复, 如果你还没有账号请 注册新账号