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

欢迎!请查看关于页面了解更多这个平台的信息。

0 投票
ClojureScript
背景

在处理CLJS-3079时,我发现{{script/aot_core}}中有一点点Windows对bash/sh脚本的兼容。这使得我想到应该在我现有的bash/sh脚本上验证Windows兼容性。

在CLJS-1797中为{{script/aot_core}}添加了Windows兼容性来实现Git Bash下的运行。Git Bash是Git for Windows的组成部分(链接:https://gitforwindows.org/ 文字:Git for Windows)。

在使用Git Bash测试时,我发现兼容性仅限于{{script/aot_core}},其他脚本缺乏兼容性。我在(a link: https://clojurians.slack.com/messages/C07UQ678E 文字:Slack #cls-dev)上询问是否有兴趣提高bash/sh脚本在Windows上的支持,得到了肯定的回答,因此有了这个JIRA问题。

实际行为

一些sh/bash脚本目前在Windows的Git Bash下失败。

期望行为

完善Windows下Git Bash中对sh/bash脚本的兼容性。

相关

CLJS-3075 - 更改重叠 - 将需要调整以支持Windows下的GraalVM。

Windows环境

Windows 10 Home v1903 64-bit,有6GB的RAM。
|工具|安装方法|
| :-- | :-- | :-- |
|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}}
|Google Chrome网页浏览器|手动下载和安装,并将其设置为默认浏览器|
|clj|按照 https://github.com/clojure/tools.deps.alpha/wiki/clj-on-Windows#install| 的说明进行安装|

范围

{{script/}}下有几个Windows PowerShell脚本。这项工作仅用于bash/sh脚本。我不会修改ps1脚本。
参见:以下观察部分。

分析
类路径格式

大多数脚本失败都是由于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. graaljs {{js}} 在 Windows 上是 {{js.cmd}}

方法
类路径格式

使用 Git Bash 中包含的 cygpath 解决类路径格式问题。在专用脚本中执行此操作,并从需要它的其他脚本中调用。

默认编码

必要时显式指定 UTF-8 编码。

工具

unzip 实用程序需要 } 来深度匹配文件(我们之前使用的是 )。这与 Unix/macOS 兼容。

script/test-cli.

在分析过程中发现的问题。除了 bash 脚本和 test-cli 工具代码外,我们还将要触摸 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}} 以运行所有脚本。为所有调用的脚本强制命令跟踪(set -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 功能。这也允许我的自定义验证脚本强制命令跟踪命令,这有助于验证。
测试说明
解决了环境问题
  1. {{script/benchmark}} 在 Windows 上的 Nashorn 失败
    {{OutOfMemoryError: Java heap space}}

    {{;; primitive array reduce 1000000 many ops}}
    将我的 Windows 虚拟机 RAM 从 4Gb 增加到 6Gb 解决了问题。
  2. {{script/benchmark}} 在 Linux 上的 Nashorn 失败
    {{OutOfMemoryError: GC overhead limit exceeded}}

    {{;;; vector equality}}
    将 Docker->Preferences->Advanced->Memory 从 2Gb 增加到 6Gb 解决了问题。
跨 OS 测试

测试是在 macOS 开发箱上进行的。Windows 测试是通过 ssh 到 Windows 10 虚拟机进行的。Linux 测试是通过 Docker 到基于 ubuntu 的容器进行的({{Dockerfile}} 附件)。

在 cljs-3098...zip 文件中附带了脚本测试和结果日志。这些脚本针对我的设置特定,但我包括用于 Linux 的 Dockerfile。入口点是 {{verify.sh}}。在以下变体上进行测试
- macos 未打补丁
- linux 未打补丁
- macos 打补丁
- linux 打补丁
- windows 打补丁

我运行了未打补丁的变体,以比较打补丁的变体结果。
特别注意验证类路径在 OS 之间保持一致。

注意,由于我使用的 Linux 版本中 file.encoding 不是 UTF-8,因此在 linux 未打补丁的情况下出现了一些失败。此补丁在 {{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 投票
参考:https://clojure.atlassian.net/browse/CLJS-3098(由 lread 报告)
...