实际行为
使用{{./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)
将ClojureScript的主版本和次版本显式地手动更改,但其增量版本(即修订号,即限定符)是作为每个构建的主要.minor以来提交的数量计算得出的。
- 然后,在{{pom.xml}}、{{src/main/clojure/cljs/util.cljc}}和{{src/main/cljs/cljs/core.cljs}}中更新ClojureScript版本。
- 在运行时无需特殊操作,版本已在源代码中硬编码,并可通过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进行比较
- 使用基于{{circleci/clojure:openjdk-8-tools-deps-node}}的docker镜像在linux上重复上述步骤,跳过{{./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}}何时开始起作用?注意,我没有对此处做任何修改。