将MacOS Clojure Dev安装程序移植到Windows WSL2

2020-07-28 23:29:47

在过去的几年里,我主要在AppleMacBooks上进行开发。最近,我给自己造了一台处理器快、内存大的新PC。我想把我的一些开发任务转移到那台机器上。我仍然喜欢笔记本电脑给我的自由,让我可以在任何我想要的地方工作。无论是坐在家里的沙发上,还是在我居住的城市里随便找个咖啡馆,我只是喜欢每隔几个小时换一换环境,而不是整天坐在办公桌前。我已经将近10年没有使用Windows作为我的主要操作系统了。但是,由于Windows10(仍然)附带了RDP和WSL2,RDP在性能上比VNC更好,WSL2提供了“真正的”和良好集成的Linux体验,我很好奇是否可以创建一个在新机器上远程工作的设置。它还会给我一个调试Windows特定问题的环境,这对我的副业项目(如Babashka和CLJ-Kondo)应该很有用。如果不起作用,我总是可以使用Ubuntu作为主开发操作系统进行双引导,如果我需要做任何图形化的事情,可以使用VNC。不管怎样,这里有一份我经历过的设置过程的报告。

一台新电脑的原始气味和美感与我家混乱的现实形成了鲜明对比。Pic.twitter.com/3zLIzYg4XB。

-(λ.。Borkdud)(@borkdud)2020年7月8日。

因为我家里没有其他的Windows机器,所以我试着根据这篇博客文章在MacOS中创建一个USBWindows安装驱动器。无论我尝试什么,在安装过程结束时,Windows都会抱怨。

Windows安装遇到意外错误。验证安装源是否可访问,然后重新启动安装。

在新PC上安装Ubuntu。安装程序出人意料地流畅,可以检测到我的wifi,甚至显然还能检测到nvidia显卡。而Windows类似于pic.twitter.com/FQNzeJ6V2X。

-(λ.。Borkdud)(@borkdud)2020年7月8日。

一位好朋友提供了帮助,并在他的Windows Home安装上使用Rufus创建了一个安装驱动器,确实起到了作用。

一旦安装了Windows,我就启用了RDP,并安装了WSL2、Ubuntu 20.04、Windows Terminal和Docker Desktop for WSL2。

为了能够运行WSL2,我必须先在BIOS中启用虚拟化选项。

我打算在这台机器上使用Ubuntu WSL2作为我的主要开发环境,因此调整终端配置以默认打开Ubuntu而不是PowerShell是有意义的。我发现终端中的Ubuntu启动于Windows home目录(/mnt/c/Users/borkdud)很烦人,所以我在Ubuntu配置文件中设置了";startingDirectory";:";//wsl$/Ubuntu-20.04/home/borkdude";。

我在MacOS上使用zsh作为我的默认shell,并希望在WSL2中也是如此,所以我安装了使用sudo apt update&;&;sudo apt安装zsh,然后使用chsh-s$(Whichzsh)。我还安装了ohmyzsh并启用了我日常使用的仅有的两个插件:GIT和JUMP。

然后我开始移植我在MacBook上使用的dev设置,主要由Docker映像、几个Clojure项目和一些bash脚本组成。我使用几个shell脚本来设置所有的开发环境变量和别名,以便轻松设置ssh隧道。仅做了几处调整(例如,以太网卡在MacOS和WSL2中的Ubuntu中的名称不同),就可以正常工作了(例如,以太网卡在MacOS中的名称与在WSL2中的Ubuntu不同)。当然,我需要安装git来克隆我的工作项目。为了运行Clojure项目,我通过APT安装了OpenJDK版本8和11。我使用jenv在项目基础上管理Java版本,这非常有效:

我还安装了boot、Clojure构建工具和Clojure CLI,它们在Linux中都得到了很好的支持。

在运行我的工作项目之前,我想使用rsync从我的MacBook复制一个PostgreSQL数据库和其他数据。在此之前,我需要在Ubuntu中启用ssh。我发现我可以通过运行sudo service sshstart来做到这一点,但我仍然无法从MacBook登录。原来您还必须转发并打开Windows防火墙中的端口。我找到了这个PowerShell脚本,它可以让您做到这一点。正如评论所建议的那样,我还创建了一个在Windows登录时运行此脚本的计划任务。对于使用wsl-u root sudo服务ssh start运行ssh服务,我执行了相同的操作。确保选择使用最高权限运行。我确信在WSL2中有一种更好的方法可以通过systemd来实现这一点,但是这个方法对我来说很有效。所以现在我可以将数据从MacOS重新同步到WSL2。我启动了Docker Containers和Clojure项目,它成功了!作为堆栈的一部分,我们有一个相当密集的I/O进程,这似乎在WSL2中执行得很好。

在WSL中启用SSH还允许我在笔记本电脑上使用Emacs,并使用Tramp模式在远程机器上编辑文件。伊朗在这件事上有一个问题。由于我在zsh中使用了非标准提示符,emacstramp无法解析来自远程shell的输出。因此,我添加了这条黑客命令,我将其添加到了Tomy~/.zshc中:

当使用tramp打开文件时,Emacs将TERM设置为";umb";。在这种情况下,我只调用bash,而不是继续使用zsh。也许有更好的解决方案,但这是可行的。

当然,我也希望能够在机器本身上运行Emacs。我首先尝试在Windows本机运行Emacs,但我在某处读到不推荐直接从Windows编辑WSL2文件。此外,您可能会遇到结束Windows和Linux/MacOS之间差异的行。我决定稳妥行事,使用apt在WSL2中安装emacs。如果您确实决定使用Windows原生Emacs,并且在查找emacs需要配置文件的位置时遇到困难,您可以使用M-xDescribe-Variable user-init-file找到它。在我的机器上,那是C:\Users\borkdude\AppData\Roaming\.config\emacs\init.el..。要获得从WSL2开始的emacs的图形UI,我需要在Windows上安装X-server。有很多免费和开源的解决方案可供选择,但我选择了以9.99美元的价格购买X4100,而不是49.99美元。它似乎正在积极地工作,并且有很好的文档。为了在Windows启动时自动启动X410,我按照以下说明操作。启动时,托盘中有一个X图标,您可以在其中修改X410的设置。我已经启用了窗口应用程序、允许公共访问、DPIScaling(高质量)和共享剪贴板。要为WSL2中的GUI应用程序导出正确的显示值,我的.zshenv中包含以下内容:

然后使用zsh会话中的setsid emacs运行emacs(我在.zshenv中为此创建了一个别名)。

我使用的emacs配置与在MacOS上使用的完全相同,它基于@bbatsov的前奏。它看起来和感觉上都和onmacOS一样,尽管现在我可能不得不学习“真正的”emacs键绑定强制复制(M-w)和粘贴(C-y),而不是使用MacOS键绑定,这实际上可能是这个实验的一个很好的副作用。

即使用苹果酒连接到nREPL服务器,从mylaptop也能正常工作,前提是我如上所述在Windows防火墙中转发并打开端口。

WSL2的内存使用存在一个已知问题。由于Linux使用未分配的内存进行文件系统缓存,因此Windows认为该内存已真正使用。随着时间的推移,Windows最终可能会将所有系统内存分配给WSL2。为了对此进行限制,我在C:\Users\borkdud\.wslconfig中使用此配置:

我的PC有惊人的128 GB内存,所以这仍然给Windows留下了36 GB的内存。

因为我将主要使用这台电脑来工作,所以我在晚上和周末都会把它关掉。为了回到我离开的地方,而不是从头开始我所有的开发过程,我使用Hibernateset。

我使用Tailscale在我的笔记本和Windows机器之间设置VPN,这样当我出门时就可以通过RDP、emacs tramp和/或nREPL进行连接。

对于RDP,我使用Microsoft Remote Desktop.app。因为我有视网膜屏幕,所以我启用了“针对视网膜显示进行优化”设置,该设置提供了更好的分辨率。

作为奖励,我可以为我正在使用的onmacOS:Beyond Compare和Acronis True Image应用程序重复使用我已经拥有的一些许可证。

我对WSL2、终端应用程序和Docker集成感到惊喜。我使用这个设置只有一周的时间,但到目前为止还不错。

新机器(Ryzen 3950X)上Windows上WSL2中的#Babashka启动时间相当不错:平均4ms@graalvm pic.twitter.com/TKPPoeFZlL。

-(λ.。Borkdud)(@borkdud)2020年7月10日