背景
在处理CLJS-3079时,我发现{{script/aot_core}}中对bash/sh脚本有一些Windows支持。这让我想到应该在Windows上验证我的bash/sh脚本更改。
在CLJS-1797中为{{script/aot_core}}增加Windows支持以支持在Git Bash下运行。Git Bash是Git for Windows的一部分(链接:https://gitforwindows.org/ 文字:Git for Windows)。
在用Git Bash测试时,我发现支持仅限于{{script/aot_core}},其他脚本方面存在不足。我在(链接:https://clojurians.slack.com/messages/C07UQ678E 文字:Slack #cls-dev)上询问是否有人对于提高Windows下bash/sh脚本的支持有兴趣,得到了肯定的答复,因此有了这个JIRA问题。
实际行为
一些sh/bash脚本目前在Git Bash下的Windows上失败。
预期行为
完善Windows下Git Bash对sh/bash脚本的支持。
相关
CLJS-3075 - 变更重叠 - 需要调整以支持Windows下的graaljs。
Windows环境
Windows 10 Home v1903 64位,6GB内存。
|工具|安装方式|
| :-- | :-- | :-- |
|Git for Windows v2.21.0|手动下载并从https://gitforwindows.org/ 安装
这为我们提供了Git Bash,我在那里进行了所有的bash/sh测试|
|java|{{scoop add bucket java}}
{{scoop install corretto8}}|
|JavaScript引擎|通过(链接:https://github.com/GoogleChromeLabs/jsvu 文字:jsvu)安装|
|maven|{{scoop install maven}}|
|leiningen|{{scoop install leiningen}}|
|node|{{scoop install nodejs}}|
|谷歌Chrome浏览器|手动下载并安装,并设置为默认浏览器|
|clj|按照https://github.com/clojure/tools.deps.alpha/wiki/clj-on-Windows#install| 安装
范围
{{script/}}下有几个Windows PowerShell脚本。这项工作仅针对bash/sh脚本。我不会触碰ps1脚本。
另见:下面的观察部分。
分析
classpath格式
大多数脚本失败是由于Windows与Linux/macOS之间java类路径格式的差异。
默认编码
一些测试失败是因为在Windows Git Bash下运行时,默认的java文件编码不是utf-8。(注意,我在使用Docker ubuntu镜像进行测试时也发现了这一点)。
工具
unzip在Windows上表现略有不同
script/test-cli
这里也有更多失败,但都是由于Linux/macOS与Windows之间的微小差异,以及上述原因
1. 命令行参数中嵌入的双引号需要在Windows中转义
1. 测试结果需要考虑Windows上的换行符差异
1. Windows路径需要为JavaScript转义(JavaScript会吃掉反斜杠)
1. Windows上的graaljs {{js}} 是 {{js.cmd}}
方法
classpath格式
使用Git Bash中包含的cygpath解决classpath格式问题。在专用脚本中执行此操作,并从需要它的其他脚本中调用。
默认编码
在必要时显式指定utf-8编码。
工具
unzip工具需要使用 } 进行深度匹配文件(我们之前使用的是 )。这与unix/macOS兼容。
script/test-cli.
在分析过程中发现问题。我们不仅需要在bash脚本和test-cli实用程序代码中触摸main graaljs和nahsorn clj repl代码,还需要解决这些问题。
实现说明
- Java类路径转换支持在新{{bin/classpath_conv}}中。我本想把它放在{{script}}下,但是因为{{bin/cljsc}}使用了它,所以放在{{bin}}下更合适。
- 只需要更改一个测试文件:{{src/test/cljs_cli/cljs_cli/test}} {{eval-test}}将{{nil}}作为命令行参数传递,这被转换为空字符串,在Windows上不工作。我假设测试实际上想传递nil,所以将参数更改为{{"nil"}}。测试文件的其他部分保持不变。
- 我添加了{{script/verify-scripts}}以运行所有脚本。这将强制所有调用的脚本的命令跟踪(设置-x),并以一种使与其他补丁/版本比较变得容易的方式保存输出。例如,在附加的{{verify.sh}}中。
- 我在{{bin/cljsc}}中将{{file.encoding}}显式设置为{{UTF-8}}。我认为这是合适的,但我确定如果它不适合,会有人让我知道。
- {{script/closure-library-release/closure-library-release.sh}} - 更新GitHub URL使用https:而不是git:以减少对开发者的设置负担。
- {{script/test-compile}}需要在未直接与此问题相关的更改下才能正常工作。它指定了一个过时的位置来放置closure jar。
- 所有脚本都从
#\!/bin/sh
切换到#\!/usr/bin/env bash
,以便我可以和其他维护人员放心使用bash功能。这也允许我强制自定义验证脚本中的命令echo-tracing,这有助于验证。
测试说明
已解决环境问题
- {{script/benchmark}}在Windows上的Nashorn中失败
{{OutOfMemoryError: Java heap space}}
at
{{;; primitive array reduce 1000000 many ops}}
将我Windows虚拟机上的RAM从4GB增加到6GB解决了这个问题。
- {{script/benchmark}}在Linux上的Nashorn中失败
{{OutOfMemoryError: GC overhead limit exceeded}}
at
{{;;; vector equality}}
将Docker->Preferences->Advanced->Memory从2GB增加到6GB解决了问题。
跨OS测试
测试是在macOS开发机上进行的。通过ssh到Windows 10虚拟机进行Windows测试。通过Docker进行Linux测试,以基于ubuntu的容器({{Dockerfile}}已附加)进行。测试结果和日志附加在clfjs-3098...zip文件中。这些脚本特定于我的设置,但包含用于Linux的Dockerfile。入口点是{{verify.sh}}。对不同以下几种版本进行了测试。
- macos未修改
- linux未修改
- macos已修改
- linux已修改
- windows已修改
- windows已修改
我运行了未修改的版本,以比较与修改后版本的结果。
特别注意验证跨操作系统类别路径保持一致。
请注意,在Linux未修改版本中由于我使用的Linux版本中的file.encoding不是utf-8,导致一些失败。这个补丁在{{cljsc}}中明确指定了utf-8,修复了这个问题。
现有问题
在macOS上运行时发现的一些现有问题(此问题的范围之外)
1. {{script/browser-repl}} 浏览器中的cljs-logo损坏 - 注意,
{{java -cp target/cljs.jar cljs.main -re browser}}
在浏览器中正确显示cljs-logo。
1. {{script/compile}}失败。脚本已过时?留作原样。
1. {{script/test-simple}}有一个错误,将在CLJS-3075中修复。测试时被跳过。
1. {{ast-ref/buildref.sh}} - 不确定这是什么,在macOS上没有成功运行。留作原样。