从一个分支推送版本并发布软件包,但将标记保留在另一个分支

时间:2019-04-04 18:40:42

标签: npm lerna

我正在将我的项目(由许多相互依赖的软件包组成)迁移到Lerna的monorepo中。在开发过程中,我们遵循类似Gitflow workflow的方式。主要概念是在develop分支以及从develop创建并合并回到npm publish的所有其他分支(功能,错误修正等)中进行所有源代码更改。只要包的新版本准备就绪,我们就可以通过yarn publishmaster对其进行发布,然后将其合并到$ 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)

1 个答案:

答案 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文件,根publishpackage.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