2024年Clojure状态调查!分享你的想法。

欢迎!请参阅关于页面以了解更多关于这个网站如何运作的信息。

0
ClojureScript
实际行为

使用{{./script/build}}构建ClojureScript后,{{src/main/cljs/cljs/core.cljs}}和{{src/main/clojure/cljs/util.cljc}}会修改为ClojureScript版本号。避免提交这些版本号更改可能会导致一些不便,也会使新来者感到困惑。

期望行为

至少,这张工单将记录行为的文档并记录探索过程。最好,这将消除不便。

依赖项

CLJS-3098 - 我将首先解决Windows bash/sh问题,以便在这里进行全面验证。

Slack上的讨论

与dnolen在Slack上的聊天
1. 无作为并记录文档
1. 可能在一个单独的目录中构建
1. 看看Clojure是如何做的

当前行为的分析
Clojure是如何做的?
  1. Clojure版本是通过手动在https://github.com/clojure/clojure/blob/master/pom.xml(文本:pom.xml)中更改的。
  2. 构建过程将此信息传输到{{clojure/version.properties}}。
  3. 在运行时,将从{{clojure/version.properties}}解析版本信息,并通过https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/*clojure-version*(文本:*clojure-version*映射)和https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/clojure-version(文本:clojure-version函数(返回字符串))提供。
ClojureScript是如何做的?
  1. https://github.com/clojure/clojurescript/blob/master/script/build(文本:script/build)
    将ClojureScript的主版本和次版本显式地手动更改,但其增量版本(即修订号,即限定符)是作为每个构建的主要.minor以来提交的数量计算得出的。
    1. 然后,在{{pom.xml}}、{{src/main/clojure/cljs/util.cljc}}和{{src/main/cljs/cljs/core.cljs}}中更新ClojureScript版本。
  2. 在运行时无需特殊操作,版本已在源代码中硬编码,并可通过http://cljs.github.io/api/cljs.core/#STARclojurescript-versionSTAR(文本:*clojurescript-version*字符串)和内部的https://github.com/clojure/clojurescript/blob/d6f8896452b531a273f99f2716aaa08f09600063/src/main/clojure/cljs/util.cljc#L20(文本:*clojurescript-version*映射)和https://github.com/clojure/clojurescript/blob/d6f8896452b531a273f99f2716aaa08f09600063/src/main/clojure/cljs/util.cljc#L46(文本:clojurescript-version函数(返回字符串))获得。

其他感兴趣的内容
1. 如果您将ClojureScript本身作为Git依赖项使用,那么它将没有“硬编码”版本号的好处在它的源代码中强制使用。在这种情况下,使用源代码的散列来创建0.0.hash格式的版本号。虽然这可能与这个工单不相关,但在探索解决方案时仍值得记住。

方法

ClojureScript从运行时文件中解析版本的方法可能在clojure/cljs侧效果良好,但在cljs/cljs侧从文件中读取是最佳方案。我认为我们应该坚持目前在源代码中直接替换版本的方法。

我喜欢dnolen的想法,即从单独的目录构建,目前看到两个变体
1. 将整个源树复制到全新的目录中
1. 仅将添加了版本号的源复制到新的目录中,并确保在构建时首先在类路径中找到它

经过一些实验,我发现选项1的改变更温和,对构建配置的影响更小。

实现说明
  1. 在{{script/build}}和{{script/uberjar}}中,我们在{{src/main/cljs/cljs/core.aot.js}}和{{src/main/cljs/cljs/core.cljs.cache.aot.edn}}中修复版本,但仔细测试表明这些修复是无效的,因此已被删除。
  2. {{script/build}}和{{script/uberjar}}非常相似。我保留了这两个文件,但将代码合并到了{{script/build}}下。
  3. {{script/revision}}已过时,使用旧版本的算法,并编写为v1.9。我的假设是此文件未使用过,并且已经被删除。
假设
  1. CI服务器构建的{{cljs.jar}}是通过{{script/uberjar}}构建的,并且预期在{{target}}目录下找到。
  2. CI服务器构建的maven jar通过{{script/build}}部署
手动测试
  1. 将此工作的补丁应用到ClojureScript的新克隆版本中
  2. 在MacOS Mojave上,从项目根目录开始,按照cljs社区构建和测试指南进行,同时查看{{.travis.yml}},特别是

script/build lein test ./script/bootstrap ./script/test ./script/test-self-host ./script/test-self-parity ./script/uberjar ./script/test-cli browser ./script/test-cli node ./script/test-cli nashorn ./script/test-cli rhino (export PATH="$GRAALVM_HOME:$PATH"; ./script/test-cli graaljs) git status

  1. 核实{{git status}}报告没有修改
  2. 将上面的输出与没有此补丁的cljs源代码进行比较
  3. 将{{cljs.jar}}和maven部署的jar与没有此补丁的cljs jar进行比较
  4. 使用基于{{circleci/clojure:openjdk-8-tools-deps-node}}的docker镜像在linux上重复上述步骤,跳过{{./script/test-cli browser}}步骤。
  5. {{script/aot_core}}引用MinGW,我在CLSJ-1797中看到,这是为在Windows上使用“Git Bash”运行而添加的。我将探索在该环境下进行测试。相关:CLJS-3098。
需要CI团队进一步验证
  1. 在{{script/aot_core}}和{{script/build}}中,当{{HUDSON}}为真时条件运行的CI特定代码
  2. {{script/closure-library-release}}何时开始起作用?注意,我没有对此处做任何修改。

3 个答案

0

评论者:mfikes

嗨,李,版本号的另一个方面:如果你将ClojureScript本身作为Git依赖项使用,那么其在源码中即使存在“硬编码”的版本号也实际上没有被使用。在这种情况下,使用源码的散列值来创建版本号,形式为{{0.0.hash}}。

这不太可能影响或与此票有关的任何变更交互,但为了保险起见,还是提一下。

0

评论者:lread

谢谢迈克,知道了,我会将它添加到票务描述中。

0
...