使用预提交钩子更新 package.json 版本

4

我正在尝试自动化一个托管在私人github仓库上的Node.js项目的版本升级。

该项目旨在本地运行,因此未发布,也没有发布。组织中的人只需拉取main分支,并使用yarn && yarn start在他们的机器上运行它。

我的目标

我的目标是在预提交阶段对此项目的package.json进行版本升级(主要版本、补丁版本或次要版本),并与根据提交消息更改的代码一起提交。

我只想做的就是让我的PR包含package.json中的更改,而不必手动进行操作。我不需要发布或CI。

我成功的工作

我设置了Husky和commitlint以验证常规提交消息,并且它们可以正常工作。

我尝试过但失败了的方法

我尝试使用semantic-release和其他软件包来提供此功能,但它们都意味着某个地方存在CI构建或发布,因此我被卡住了。

有什么建议吗?


我假设您想根据常规提交的消息升级版本?例如,feat提交类型将仅升级次要版本等。 - Andrzej Smyk
@AndrzejSmyk 确实如此。 - napolux
3个回答

3

如果您有任何类型的CICD(持续集成和持续部署)管道,您可以使用gitversion cli

它支持每个提交消息正则表达式的版本自动升级。配置示例

major-version-bump-message: '\+semver:\s?(breaking|major)'
minor-version-bump-message: '\+semver:\s?(feature|minor)'
patch-version-bump-message: '\+semver:\s?(fix|patch)'
no-bump-message: '\+semver:\s?(none|skip)'

这意味着带有消息my commit msg +semver: fix的提交将触发一个补丁(patch)版本号的增加。

请参阅此文章以获取详细的设置说明。


2
请使用commit-msg钩子而不是pre-commitpre-commit钩子在提交消息之前被触发,但如果您使用commit-msg钩子,它将在提交消息后被触发。 该钩子将触发您的脚本,并且您的脚本将接收到提交消息本身作为第一个参数。
然后,您可以在提交消息的基础上编写任何逻辑。 您可以检查消息,并根据请求更新版本。 有很多方法来做这件事。
npm version major

-2

您可以使用updateCommitId模块编写自定义的Node JS代码,在pre-commit hook期间运行。示例工作代码可能如下所示。请根据需要进行升级。

{
  "version": "1.12.0",
  "dependencies": {},
  "pre-commit": ["updateCommitId"],
  "scripts": {
    "updateCommitId": "node updateVersion.js"
  },
  "devDependencies": {
    "pre-commit": "^1.2.2",
    "semver": "^7.3.5",
    "simple-git": "^3.2.6"
  }
}

const semver = require("semver");
const simpleGit = require("simple-git");

const options = {
  baseDir: process.cwd(),
  binary: "git",
  maxConcurrentProcesses: 6,
};

const git = simpleGit(options);

const json = require("./package.json");

function savePackage() {
  require("fs").writeFileSync(
    process.cwd() + "/package.json",
    JSON.stringify(json, null, 2)
  );
}
async function updateVersion() {
  try {
    if (json.version) {
      const version = semver.parse(json.version);
      version.inc("minor");
      json.version = version.toString();
      savePackage();
      await git.add("package.json");
      process.exit(0);
    }
  } catch (e) {
    console.log(e);
    process.exit(1);
  }
}

updateVersion();


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