Clojure 2024年度调查中分享您的想法!

欢迎!请查阅关于页面了解有关此如何工作的更多信息。

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)
    1. ClojureScript的主版本和副版本是明确手动更改的,但它的增量版本(也称为修订版或限定符)是根据每个构建的主副版本之间的提交数量计算的。
    1. 然后,更新ClojureScript版本{{pom.xml}}、{{src/main/clojure/cljs/util.cljc}}和{{src/main/cljs/cljs/core.cljs}}。
  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. 重复上述步骤在 Linux 上使用基于{{circleci/clojure:openjdk-8-tools-deps-node}}的 Docker 镜像进行,跳过{{./script/test-cli browser}}步骤。
  5. {{script/aot_core}}引用了MinGW,这在我看到是在CLSJ-1797中添加的,以支持在“Git Bash”上运行Windows。我将检查在该环境下进行测试。相关:CLJS-3098。
需要由 CI 团队进行进一步验证
  1. {{script/aot_core}}和{{script/build}}中当{{HUDSON}}为真时的条件执行的 CI 特定代码
  2. {{script/closure-library-release}}何时生效?注意,我没有在这里进行任何更改。

3 答案

0投票
by

由:mfikes发表的评论

嗨李,版本号还有一个方面需要注意:如果你依赖ClojureScript本身作为Git依赖,那么在它的源代码中就不会使用“硬编码”的版本号。在这种情况下,源代码的哈希值被用来创建形如{{0.0.hash}}的版本号。

这很可能不会影响或与本次工单的任何更改相互作用,但提一下以防万一。

0投票

评论者:lread

感谢迈克,知道了这个,我会把它加到工单描述中。

0投票
参考: https://clojure.atlassian.net/browse/CLJS-3079(由 lread 报告)
...