在 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 中使用更多脚本。
要真正提高软件包的版本,这里有一个简单的方法:安装这个 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"
},
...
}
为了清楚起见:
- “sync-version”:从主 package.json 复制版本并将其粘贴到库 package.json
- “预防”:清理工作区
- “版本”:同步版本、构建库、提交更改
- "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 版本的节点,这可能会影响您在构建过程中使用工作区的能力。
构建 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 中使用更多脚本。
要真正提高软件包的版本,这里有一个简单的方法:安装这个 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"
},
...
}
为了清楚起见:
- “sync-version”:从主 package.json 复制版本并将其粘贴到库 package.json
- “预防”:清理工作区
- “版本”:同步版本、构建库、提交更改
- "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 版本的节点,这可能会影响您在构建过程中使用工作区的能力。