我正在将我的项目(由许多相互依赖的软件包组成)迁移到Lerna的monorepo中。在开发过程中,我们遵循类似Gitflow workflow的方式。主要概念是在develop
分支以及从develop
创建并合并回到npm publish
的所有其他分支(功能,错误修正等)中进行所有源代码更改。只要包的新版本准备就绪,我们就可以通过yarn publish
或master
对其进行发布,然后将其合并到$ git checkout develop
分支中,并通过以下方式手动对其进行标记:
$ git add -A
$ git commit -m "Make some changes and version bump."
$ git checkout master
$ git merge --no-ff develop -m "Version 0.14.1."
$ git tag -a 0.14.1 -m "Version 0.14.1."
对源代码进行一些更改,包括版本变更...
develop
现在,我想用Lerna来管理所有软件包,实现相同的目的。在查看文档时,我指出publish命令依赖于version命令,而该命令又在后台使用changed命令来检测自最新版本以来软件包中所做的更改:
列出自上一个标记版本以来已更改的本地软件包
请考虑在一个包中的@geoapps/layout
分支(例如$ lerna changed
)中进行了一些更改
info cli using local version of lerna
lerna notice cli v3.13.1
lerna info Assuming all packages changed
@geoapps/angle
@geoapps/camera-scene-mode-switcher
...
@geoapps/tracer
@geoapps/vector
lerna success found 39 packages ready to publish
说所有软件包都已更改(不是我所期望的):
develop
我猜这是由于Lerna在master
分支中查找带标记的提交进行比较而导致的,但是在此找不到任何内容。如果我提交了将源代码更改到@geoapps/layout
分支
然后Lerna在单个$ git checkout master
$ lerna changed
包中正确检测到它们:
info cli using local version of lerna
lerna notice cli v3.13.1
lerna info Looking for changed packages since 0.14.1
@geoapps/layout
lerna success found 1 package ready to publish
master
但是在develop
分支中进行更改也不是我想要的。 include-merged-tags是我尝试使用的另一个选项,但似乎只有在标记提交也是$ git checkout develop
$ git merge --no-ff master -m "Sync with master."
分支历史的一部分时,它才有效:
$ lerna changed --include-merged-tags
info cli using local version of lerna
lerna notice cli v3.13.1
lerna info Looking for changed packages since 0.14.1
@geoapps/layout
lerna success found 1 package ready to publish
master
由于develop
分支中标记的所有源代码更改都存在于develop
分支中,所以我想知道是否可以强制Lerna比较master
分支中所做的更改而不与来自0.14.1^2
,但其父提交(develop
)也属于$ node --version
v10.15.0
$ npm --version
6.9.0
$ yarn --version
1.15.2
$ lerna --version
3.13.1
。有可能吗?
环境:
import signal, os
os.kill(os.getpid(), signal.SIGINT)
答案 0 :(得分:0)
Lerna的核心开发人员says认为Lerna不适合与Gitflow工作流程一起使用。进一步说,prohibited是发布程序包,以检测特定提交(在另一个分支中标记为提交)的更改。带最新标签的发行版应属于进行更改的同一分支。
保留它并希望我们牢记Gitflow,因此我决定修补Lerna,以实现所需的行为。只需created git patch,然后使用Lerna将其放在我项目的根目录中即可。
lerna-version-since.patch
selected_offer
如果Item
中发生了某些变化,那么我们可能会更新补丁。为了应用补丁,应该运行以下命令:
diff --git a/commands/version/command.js b/commands/version/command.js
index da9b1c00..3c5e19e2 100644
--- a/commands/version/command.js
+++ b/commands/version/command.js
@@ -104,6 +104,11 @@ exports.builder = (yargs, composed) => {
requiresArg: true,
defaultDescription: "alpha",
},
+ since: {
+ describe: "Look for changes since specified commit instead of last tagged release",
+ type: "string",
+ requiresArg: true,
+ },
"sign-git-commit": {
describe: "Pass the `--gpg-sign` flag to `git commit`.",
type: "boolean",
对Lerna进行了修补,现在可以在commands/version/command.js
分支中进行发布,并在$ git apply -p3 --directory node_modules/@lerna/version lerna-version-since.patch
中标记发布。为了简化操作,我编写了一个名为develop
的脚本,该脚本可以自动完成所有操作。这是master
的脚本部分:
lerna-gitflow.js
所有这些package.json
和"scripts": {
"publish:major": "./lerna-gitflow.js publish major",
"publish:minor": "./lerna-gitflow.js publish minor",
"publish:patch": "./lerna-gitflow.js publish patch",
"changes": "./lerna-gitflow.js changes",
"postinstall": "./lerna-gitflow.js patch"
}
命令应从开发分支运行(默认为publish:*
)。
changes
命令仅显示自发布分支(默认为develop
以来的最新发布标记以来,开发分支(changes
)中已更改的软件包。
develop
命令有两件事:
master
文件,根publish
和package.json
中的版本,并将它们提交到本地的package.json
分支中(可以通过单独运行来完成例如lerna.json
); develop
分支发布到npm注册表,然后将更改合并到./lerna-gitflow.js version patch
分支而无需快速转发并在那里标记新版本(也可以通过运行{{1}来单独完成})。 develop
脚本尝试在任何master
或./lerna-gitflow.js publish --skip-version
调用中修补Lerna,否则必须进行更改才能使所有工作正常进行。
lerna-gitflow.js
postinstall