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

时间:2019-06-06 21:25:21

标签: angular npm angular-cli angular-library ng-packagr

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

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

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

在Angular中构建库时,还有其他人遇到过这种情况吗?如果是的话,您如何处理呢?

谢谢

4 个答案:

答案 0 :(得分:6)

我见过人们对vsavkin(Nrwl / Nx花花公子)问同样的问题,他的回答相当git sub-module approach

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


一个更简单的选择是,如您已经提到的,将所有库都保留在与根package.json相同版本的monorepo中,这类似于Angular monorepo同时更改其所有Angular软件包的版本。

这可以在node或bash / shell中轻松完成,只需添加一些脚本即可。

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


要实际更改软件包的版本,这是一种简单的方法:安装此npm package(一个用于编辑json文件的不错的CLI)并阅读In-Place editing section。现在,您应该拥有所需的所有工具!


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

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

答案 1 :(得分:1)

对于我的Angular库,我被迫修改项目package.json文件中的版本,子版本不是父级工作空间。因此,我需要更新父工作区package.json文件中的version属性。

├── 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

答案 2 :(得分:0)

我使用sync-json和“发布前版本”脚本的组合来帮助解决此问题。

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复制版本并将其粘贴到lib package.json
  2. “预防”:清理工作区
  3. “版本”:同步版本,构建lib,提交更改
  4. “ postversion”:git push一切

答案 3 :(得分:0)

npm 7 支持 workspaces

在 npm 7 中,您可以使用带有 npm version 的工作区

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

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

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

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

"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 版本的节点,这可能会影响您在构建过程中使用工作区的能力。