请在2024 Clojure状态调查!分享您的想法。

欢迎!请查看关于页面以了解更多关于此页面的信息。

0
ClojureScript
背景

在处理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代码,还需要解决这些问题。

实现说明
  1. Java类路径转换支持在新{{bin/classpath_conv}}中。我本想把它放在{{script}}下,但是因为{{bin/cljsc}}使用了它,所以放在{{bin}}下更合适。
  2. 只需要更改一个测试文件:{{src/test/cljs_cli/cljs_cli/test}} {{eval-test}}将{{nil}}作为命令行参数传递,这被转换为空字符串,在Windows上不工作。我假设测试实际上想传递nil,所以将参数更改为{{"nil"}}。测试文件的其他部分保持不变。
  3. 我添加了{{script/verify-scripts}}以运行所有脚本。这将强制所有调用的脚本的命令跟踪(设置-x),并以一种使与其他补丁/版本比较变得容易的方式保存输出。例如,在附加的{{verify.sh}}中。
  4. 我在{{bin/cljsc}}中将{{file.encoding}}显式设置为{{UTF-8}}。我认为这是合适的,但我确定如果它不适合,会有人让我知道。
  5. {{script/closure-library-release/closure-library-release.sh}} - 更新GitHub URL使用https:而不是git:以减少对开发者的设置负担。
    1. {{script/test-compile}}需要在未直接与此问题相关的更改下才能正常工作。它指定了一个过时的位置来放置closure jar。
  6. 所有脚本都从#\!/bin/sh切换到#\!/usr/bin/env bash,以便我可以和其他维护人员放心使用bash功能。这也允许我强制自定义验证脚本中的命令echo-tracing,这有助于验证。
测试说明
已解决环境问题
  1. {{script/benchmark}}在Windows上的Nashorn中失败
    {{OutOfMemoryError: Java heap space}}
    at
    {{;; primitive array reduce 1000000 many ops}}
    将我Windows虚拟机上的RAM从4GB增加到6GB解决了这个问题。
  2. {{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上没有成功运行。留作原样。

2 条回答

0

评论由:lread 制作

好吧,我觉得这条可以审核了。谢谢,并告诉我您的看法。

0
...