在构建Angular Library应用程序时,有没有一种自动的方法来使根级别的package.json和库应用程序的package.json(例如,在projects/my-library
下)的文件版本在使用npm version
时保持同步命令?
当我使用该命令时,它仅增加根级别package.json,是否有特殊命令或其他任何方式将版本号向下传播到package.json文件库?
我已经看到了一些解决方案,例如在ng build
之后运行脚本以读取根级别package.json版本号并将其写入库中,但是我不确定这是最好的方法。
在Angular中构建库时,还有其他人遇到过这种情况吗?如果是的话,您如何处理呢?
谢谢
答案 0 :(得分:6)
我见过人们对vsavkin(Nrwl / Nx花花公子)问同样的问题,他的回答相当git sub-module approach。
虽然此工作流程有些复杂,但它确实允许对共享库进行单独版本控制,同时将它们保留在同一父git-repo中。
一个更简单的选择是,如您已经提到的,将所有库都保留在与根package.json相同版本的monorepo中,这类似于Angular monorepo同时更改其所有Angular软件包的版本。
这可以在node或bash / shell中轻松完成,只需添加一些脚本即可。
要实际更改软件包的版本,这是一种简单的方法:安装此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"
},
...
}
为清楚起见:
答案 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 版本的节点,这可能会影响您在构建过程中使用工作区的能力。