实际行为
在用{{./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关于从独立目录构建的想法,目前有两种变体
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中添加的,以支持在“Git Bash”上运行Windows。我将检查在该环境下进行测试。相关:CLJS-3098。
需要由 CI 团队进行进一步验证
- {{script/aot_core}}和{{script/build}}中当{{HUDSON}}为真时的条件执行的 CI 特定代码
- {{script/closure-library-release}}何时生效?注意,我没有在这里进行任何更改。