实际行为
通过使用{{./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做了什么?
- Clojure版本是通过手动在(链接:https://github.com/clojure/clojure/blob/master/pom.xml文本:pom.xml)中更改的。
- 构建过程将此信息传递到{{clojure/version.properties}}。
- 在运行时,版本信息是从{{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做了什么?
- 在(链接:https://github.com/clojure/clojurescript/blob/master/script/build文本:script/build)
#1. ClojureScript的主版本和次版本是手动更改的,但是它的增量版本(又称修订版本或限定符)是通过每个构建的主次版本后的提交次数计算出来的。
- 然后,ClojureScript版本在{{pom.xml}}、{{src/main/clojure/cljs/util.cljc}}和{{src/main/cljs/cljs/core.cljs}}中更新。
- 在运行时,不需要特别的动作,版本在源文件中是硬编码的,并通过(链接: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 使用单独的目录构建的想法,目前看到 2 种变体
1. 将整个源树复制到全新目录中
1. 只复制具有版本号的源,将其复制到全新目录中,并确保构建时首先在类路径中找到。
经过一些实验,我发现选项 1 对构建配置的影响较小,侵入性较小。
实现说明
- 在 {{script/build}} 和 {{script/uberjar}} 中,我们修复了 {{src/main/cljs/cljs/core.aot.js}} 和 {{src/main/cljs/cljs/core.cljs.cache.aot.edn}} 中的版本,但仔细测试显示这些修复是无效的,因此已删除。
- {{script/build}} 和 {{script/uberjar}} 十分相似。我保留了两个文件,但将在 {{script/build}} 下合并代码。
- {{script/revision}} 过时了,使用旧版本算法,并针对 v1.9 编码。我的假设是,此文件未使用过,已经被删除。
假设
- CI 服务器构建的 {{cljs.jar}} 通过 {{script/uberjar}} 构建,并且预计将位于 {{target}} 目录下。
- CI 服务器构建的 Maven JAR 文件通过 {{script/build}} 发布。
手动测试
- 将此工作的补丁应用到 clojurescript 的新克隆版本
- 在 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
- 验证 {{git status}} 报告没有修改
- 将上述结果与没有此补丁的 cljs 源代码进行比较。
- 将 {{cljs.jar}} 和 Maven 部署的 JAR 文件与没有此补丁的 cljs JAR 文件进行比较。
- 在 Linux 上重复上述步骤,使用基于 {{circleci/clojure:openjdk-8-tools-deps-node}} 的 Docker 图像,跳过 {{./script/test-cli browser}} 步骤。
- {{script/aot_core}} 引用了 MinGW,它在 CLSJ-1797 中被添加以支持在 Windows 上的“Git Bash”下运行。我将继续在该环境下进行测试。相关:CLJS-3098。
需要 CI 团队的进一步验证
- 当在 {{script/aot_core}} 和 {{script/build}} 中的 {{HUDSON}} 为真时才会执行的 CI 特定代码
- 何时 {{script/closure-library-release}} 介入?注意我对此处没有做出任何更改。