在angular库项目中保持版本号同步的方法——package.json文件

23
在构建Angular Library应用程序时,是否有自动化的方法来在使用npm版本命令时保持根级别package.json和库应用程序的package.json(例如在projects/my-library下)文件版本同步?
当我使用该命令时,仅会增加根级别package.json的版本号,是否有特殊命令或任何其他方法可以将版本号传播到库package.json文件?
我已经看到一些解决方案,例如在ng build后运行脚本以读取根级别package.json版本号并将其写入库中,但我不确定这是否是最佳方法。
是否有其他人在构建Angular库时遇到过这个问题,如果是,你们是如何处理的?
5个回答

11

我看到有人向vsavkin(Nrwl / Nx的开发者)问同样的问题,他的回答是一个相当复杂的git子模块方法

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


一个更简单的替代方案是,如您所提到的,将所有库保持在monorepo中,与根package.json的版本相同-类似于Angular monorepo如何同时更新所有Angular包的版本。

这可以很容易地在node中完成,或者在bash / shell中使用一些脚本来完成。

这里有一个gist,其中包含从根package.json中提取版本的node、bash和shell示例。


要实际升级软件包的版本,这里是一个简单的方法:安装这个npm包(一个用于编辑json文件的好用CLI),并阅读In-Place编辑部分。现在你应该拥有所有你需要的工具!


这里有一个使用node的bash脚本示例:

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

在我的情况下,我被迫提升项目package.json文件中的版本,而不是父工作区的子文件。我不知道为什么这两个文件中有两个版本属性。现在我正在尝试使用您的脚本和bash find命令查找package.json文件并从中读取版本属性。 - Stephane

3
我使用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. "prevention": 清理工作区
  3. "version": 同步版本,构建 lib,提交更改
  4. "postversion": 推送所有更改到 git

2

npm 7支持工作区

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

2

针对我的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

0
我制作了以下解决方案:
流程:
在库构建完成后应立即执行create-tarball。这意味着当执行ng build时,自动执行precreate-tarball
然后执行create-tarball
最后,postcreate-tarball也会自动执行。
命令说明: precreate-tarball:更新工作区路径中的软件包版本(在我的情况下是演示应用程序和库分发文件夹)。这是因为最好在ng构建成功后立即更新版本。 create-tarball:构建分发文件夹(tarball)的包。 postcreate-tarball:它使演示或父级package.json和库package json同步。
  {
     "build":"ng build",
     "postbuild": "npm run create-tarball"
     "precreate-tarball": "npm version prerelease --workspaces=true --no-git-tag-version --force",
     "create-tarball": "cd dist/my-library && npm pack",
     "postcreate-tarball": "sync-json -v --property version --source package.json projects/my-library/package.json",
  },
  "workspaces": [
    "./",
    "dist/my-library"
  ],

你可以从npm安装sync-json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接