实际行为
使用{{./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的版本会通过手动在(link: https://github.com/clojure/clojure/blob/master/pom.xml text: pom.xml)中更改。
- 构建过程会将此信息传递到{{clojure/version.properties}}。
- 在运行时,版本信息会从{{clojure/version.properties}}中解析出来,并通过(link: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/*clojure-version* text: *clojure-version* map)和(link: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/clojure-version text: clojure-version函数(它返回字符串))提供给用户。
ClojureScript是如何做的?
- 在(link: https://github.com/clojure/clojurescript/blob/master/script/build text: script/build)
1. ClojureScript的主版本和次版本会通过手动更改,但它的增量版本(即修订号或修饰符)是在每个构建中基于自major.minor以来的提交数量计算的。
- 然后,ClojureScript版本将在{{pom.xml}}、{{src/main/clojure/cljs/util.cljc}}和{{src/main/cljs/cljs/core.cljs}}中更新。
- 在运行时,不需要特殊操作,版本已在源文件中硬编码,可以通过(link: http://cljs.github.io/api/cljs.core/#STARclojurescript-versionSTAR text: *clojurescript-version*字符串)和内部(link: https://github.com/clojure/clojurescript/blob/d6f8896452b531a273f99f2716aaa08f09600063/src/main/clojure/ cljs/util.cljc#L20 text: *clojurescript-version* map)和(link: https://github.com/clojure/clojurescript/blob/d6f8896452b531a273f99f2716aaa08f09600063/src/main/clojure/ cljs/util.cljc#L46 text: clojurescript-version函数(它返回字符串))访问。
其他相关信息
1. 如果您将 ClojureScript 本身作为 Git 依赖项,那么它将不会有源代码中的 "硬编码" 版本号。在这种情况下,使用源代码的哈希来生成版本号,形式为 0.0.hash。尽管这可能与当前问题单不太相关,但我们在探索解决方案时仍应加以注意。
方法
由于 ClojureScript 在运行时从文件解析版本的方法可能在 clojure/cljs 端表现良好,但在 cljs/cljs 端从文件读取则可能存在问题。我认为我们应该坚持当前的方案,即在源代码中直接替换版本号。
我喜欢 dnolen 的想法,即从不同的目录构建,目前看到两种变体
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}} 介入?请注意,我在这里没有进行任何更改。