在 angular 个库项目 package.json 个文件中保持版本号同步

Keeping version numbers in sync in angular library project package.json files

构建 Angular 库应用程序时,是否有一种自动方式来保留根级别 package.json 和库应用程序的 package.json(例如,在 projects/my-library 下)文件使用 npm version 命令时版本是否同步?

当我使用该命令时,它只会增加根级别 package.json,是否有特殊命令或任何其他方式将版本号向下传播到库 package.json 文件?

我看过一些解决方案,例如 运行 ng build 之后的脚本,用于读取根级别 package.json 版本号并将其写入库一,但我不确定这是最好的方法。

有没有其他人在 Angular 中构建图书馆时遇到过这个问题?如果遇到过,您是如何处理的?

我见过有人向 vsavkin(Nrwl/Nx 老兄)问同样的问题,他的回答相当复杂 git sub-module approach

虽然此工作流程有点复杂,但它确实允许共享库单独进行版本控制,同时将它们保持在同一父级 git-repo。


正如您已经提到的,一个更简单的替代方法是让 monorepo 中的所有库与根 package.json 保持相同的版本 - 类似于 Angular monorepo 提升其所有版本的方式同时 Angular 个包。

这可以在节点中轻松完成,或者在 bash/shell 中使用更多脚本。

Here's a gist with node, bash & shell examples of how to extract the version from the root package.json.


要真正提高软件包的版本,这里有一个简单的方法:安装这个 npm package (a nice CLI for editing json files) and read the In-Place editing section。您现在应该拥有所需的所有工具!


这是一个使用节点的示例 bash 脚本:

cd libs/my-library && json -I -f package.json this.version=$(node -pe \"JSON.stringify(require('../../package.json').version)\")

对于我的 Angular 库,我被迫更改项目 package.json 文件中的版本,子版本不是父工作区版本。所以我需要更新父工作区 package.json 文件中的版本 属性。

├── package.json
└── projects
    └── lib-pwa
        └── package.json

为此,我在 ~/dev/commands/ng.sh 文件中创建了 bash ng-version-sync-parent 命令:

#!/bin/bash
ng-version-sync-parent() {
  version=`find ./projects -name package.json -exec cat {} + | jq --raw-output '.version'`;
  echo 'Project package version: '$version;
  jq --arg version $version ".version = \"$version\"" package.json | sponge package.json
  version=`cat package.json | jq --raw-output '.version'`;
  echo 'Workspace package version: '$version;
}

然后我在我的工作区目录中使用了它:

source ~/dev/commands/ng.sh
11:29 $ ng-version-sync-parent 
Project package version: 0.1.4
Workspace package version: 0.1.4

我结合使用 sync-json 和“post 之前的版本”脚本来帮助解决这个问题。

npm i -D sync-json

这是我的 package.json 的样子:

{
  ...,
  "scripts": {
    "build:lib": "ng build --prod my-lib",
    "sync-version": "sync-json -v --property version --source package.json projects/my-lib/package.json",
    "preversion": "rm -rf ./dist",
    "version": "npm run sync-version && npm run build:lib && git add -A && git commit -m \"bump up\"",
    "postversion": "git push && git push --tags"
  },
  ...
}

为了清楚起见:

  1. “sync-version”:从主 package.json 复制版本并将其粘贴到库 package.json
  2. “预防”:清理工作区
  3. “版本”:同步版本、构建库、提交更改
  4. "post版本": git 推送所有内容

npm 7 支持 workspaces

在 npm 7 中,您可以将工作区与 npm version

一起使用

您可以像这样将工作区添加到 package.json:

{
   "name":"parent",
   "workspaces":[
      "projects/child-a",
      "projects/child-b"
   ]
}

使用工作区时,npm version 不会创建提交或标记(可能存在版本名称冲突)。

如果您可能想要添加更改的文件,提交它们并为每个工作区自动创建一个标签,您可以使用版本脚本。

"scripts": {
    "version": "git add . && git commit -m \"Version $npm_package_version\" && git tag v$npm_package_version",
    "postversion": "git push && git push --tags"
  },

请记住,标签名称必须是唯一的。您可能希望将工作区的名称作为标签的前缀。

然后运行

npm version major --workspaces=true

请注意 Angular 仅支持 LTS 版本的节点,这可能会影响您在构建过程中使用工作区的能力。