237

在我做一个小版本并标记它之前,我想更新 package.json 以反映程序的新版本。

有没有办法package.json自动编辑文件?

会使用git pre-release hook帮助吗?

4

14 回答 14

206

正确答案

为此,只需npm version patch=)

我的旧答案

原来没有pre-release钩子git。至少,man githooks没有表现出来。

例如,如果您正在使用git-extrahttps://github.com/visionmedia/git-extras),您可以使用pre-release由它实现的钩子,如您在https://github.com/visionmedia/中所见git-extras/blob/master/bin/git-release。它只需要一个.git/hook/pre-release.sh可执行文件来编辑您的package.json文件。提交、推送和标记将由git release命令完成。

如果您不使用任何扩展名git,您可以编写一个 shell 脚本(我将命名它git-release.sh),然后您可以使用类似以下内容的别名git release

git config --global alias.release '!sh path/to/pre-release.sh $1'

您可以使用git release 0.4which 将执行path/to/pre-release.sh 0.4. 您的脚本可以编辑package.json、创建标签并将其推送到服务器。

于 2012-11-01T14:14:22.253 回答
113

npm version可能是正确的答案。只是为了提供替代方案,我推荐grunt-bump。它由 angular.js 中的一个人维护。

用法:

grunt bump
>> Version bumped to 0.0.2

grunt bump:patch
>> Version bumped to 0.0.3

grunt bump:minor
>> Version bumped to 0.1.0

grunt bump
>> Version bumped to 0.1.1

grunt bump:major
>> Version bumped to 1.0.0

如果您仍然使用 grunt,它可能是最简单的解决方案。

于 2013-03-07T07:24:41.523 回答
83

这是我通常对我的项目所做的:

npm version patch
git add *;
git commit -m "Commit message"
git push
npm publish

第一行,npm version patch,将在 中将补丁版本增加 1(xx1 到 xx2)package.json。然后添加所有文件——包括package.json当时已修改的文件。git commit然后,和往常一样git push,最后npm publish发布模块。

我希望这是有道理的...

默克。

于 2013-03-07T04:59:28.513 回答
39

作为补充,如果您想要版本提升但没有标签或新提交,npm version您可以使用该标志:--no-git-tag-version

npm --no-git-tag-version version patch

https://docs.npmjs.com/cli/version

于 2016-12-15T09:23:05.540 回答
38

提供更新的方法。

package.json

  "scripts": {
    "eslint": "eslint index.js",
    "pretest": "npm install",
    "test": "npm run eslint",
    "preversion": "npm run test",
    "version": "",
    "postversion": "git push && git push --tags && npm publish"
  }

然后你运行它:

npm version minor --force -m "Some message to commit"

这将:

  1. ...运行测试...

  2. 将您的更改package.json为下一个次要版本(例如:1.8.1 到 1.9.0)

  3. 推动你的改变

  4. 创建一个新的 git 标签版本和

  5. 发布你的 npm 包。

--force就是显示谁是老大!除了笑话,请参阅https://github.com/npm/npm/issues/8620

于 2016-09-08T17:29:18.973 回答
29

如果你使用纱线,你可以使用

yarn version patch

这将package.json通过 patch (0.0.x)、 commit 增加版本,并用 format 标记它v0.0.0

--minor同样,您可以使用or来增加次要或主要版本--major

推送到 git 时,请确保您还使用--follow-tags

git push --follow-tags

你也可以为它创建一个脚本

    "release-it": "yarn version --patch && git push --follow-tags"

只需键入即可运行它yarn release-it

于 2018-10-12T06:18:12.767 回答
14

我正在使用husky​​git-branch-is

从哈士奇 v1+ 开始:

// package.json
{
  "husky": {
    "hooks": {
      "post-merge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
    }
  }
}

在哈士奇 V1 之前:

"scripts": {
  ...
  "postmerge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
  ...
},

阅读有关npm 版本的更多信息

Webpack 或 Vue.js

如果您使用的是 webpack 或 Vue.js,您可以使用自动注入版本 - Webpack 插件在 UI 中显示它

NUXT

nuxt.config.js

var WebpackAutoInject = require('webpack-auto-inject-version');

module.exports = {
  build: {
    plugins: [
      new WebpackAutoInject({
        // options
        // example:
        components: {
          InjectAsComment: false
        },
      }),
    ]
  },
}

template例如在页脚中:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>
于 2018-07-19T08:01:52.907 回答
12

我想为这个问题得到的答案增加一些清晰度。

即使认为这里有一些正确解决问题并提供解决方案的答案,它们也不是正确的。这个问题的正确答案是使用npm version

有没有办法自动编辑文件 package.json?

是的,你可以做的是npm version在需要时运行命令,你可以在这里阅读更多关于它的信息 npm version,但基本用法是,它会在你的版本(1.0.X npm version patch添加第三位数字顺序package.json

使用 git 预发布挂钩会有所帮助吗?

您可以根据需要配置为npm version在预发布挂钩上运行命令,但这取决于您的 CD/CI 管道中是否需要该命令,但如果没有该npm version命令,git pre-release挂钩将无法“轻松”执行任何操作与package.json

正确答案的原因npm version如下:

  1. package.json如果用户正在使用他正在使用的文件夹结构,npm如果他正在使用npm,他可以访问npm scripts.
  2. 如果他有权访问,则npm scripts他有权访问该npm version命令。
  3. 使用此命令,他不需要在他的计算机或 CD/CI 管道中安装更多东西,从长远来看,这将减少项目的可维护性工作,并有助于设置

提出其他工具的其他答案是不正确的。

gulp-bump有效,但需要另一个额外的软件包,这可能会产生长期问题(我的回答的第 3 点)

grunt-bump有效,但需要另一个额外的软件包,这可能会产生长期问题(我的回答的第 3 点)

于 2019-02-20T14:04:15.840 回答
12

首先,您需要了解升级版本号的规则。您可以在此处阅读有关语义版本的更多信息。

每个版本都有 xyz 版本,它为不同的目的定义,如下所示。

  1. x - 主要,当你有重大变化并且发生了巨大的变化差异时。
  2. y - 次要,当你有新的功能或增强发生时。
  3. z - 补丁,当您修复了错误或恢复早期版本的更改时,将其更新。

要运行脚本,您可以在 package.json 中定义它。

"script": {
    "buildmajor": "npm version major && ng build --prod",
    "buildminor": "npm version minor && ng build --prod",
    "buildpatch": "npm version patch && ng build --prod"
}

在您的终端中,您只需要根据您的需要运行 npm run,例如

npm run buildpatch

如果在 git repo 中运行它,默认的 git-tag-version 为 true,如果您不希望这样做,您可以在脚本中添加以下命令:

--no-git-tag-version

例如:"npm --no-git-tag-version version major && ng build --prod"

于 2019-05-03T06:55:01.037 回答
5

您可以使用该version-select软件包:

npm i -D version-select
{
    "name": "test",
    "version": "1.0.0",
    "scripts": {
        "version-select": "version-select"
    },
    "devDependencies": {
        "version-select": "^1.0.13"
    }
}

在此处输入图像描述

阅读更多

于 2020-12-07T19:11:51.767 回答
4

以防万一您想使用 npm 包semver 链接执行此操作

let fs = require('fs');
let semver = require('semver');

if (fs.existsSync('./package.json')) {
    var package = require('./package.json');
    let currentVersion = package.version;
    let type = process.argv[2];
    if (!['major', 'minor', 'patch'].includes(type)) {
        type = 'patch';
    }

    let newVersion = semver.inc(package.version, type);
    package.version = newVersion;
    fs.writeFileSync('./package.json', JSON.stringify(package, null, 2));

    console.log('Version updated', currentVersion, '=>', newVersion);
}

package.json应该看起来像,

{
  "name": "versioning",
  "version": "0.0.0",
  "description": "Update version in package.json using npm script",
  "main": "version.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "version": "node version.js"
  },
  "author": "Bhadresh Arya",
  "license": "ISC",
  "dependencies": {
    "semver": "^7.3.2"
  }
}

只需通过major, minor,patch参数npm run version。默认为patch.

例如: npm run versionnpm run verison patchnpm run verison minornpm run version major

Git 回购

于 2020-08-19T19:18:27.950 回答
4

赫斯基

{
  "name": "demo-project",
  "version": "0.0.3",
  "husky": {
    "hooks": {
      "pre-commit": "npm --no-git-tag-version version patch && git add ."
    }
  }
}
于 2020-11-21T04:00:08.820 回答
1

我创建了一个工具,可以根据提交消息中的标签(称为更改类型)完成自动语义版本控制。这与 Angular Commit Message Convention 和 Semantic Versioning Specification 密切相关。

您可以使用此工具通过 npm CLI 自动更改 package.json 中的版本(此处对此进行了描述)。

此外,它可以从这些提交创建一个变更日志,并且还有一个菜单(带有用于提交消息的拼写检查器)用于根据变更类型创建提交。我强烈建议检查它并阅读文档以查看可以使用它完成的所有内容。

我编写了这个工具是因为我找不到任何适合我的 CICD 管道自动化语义版本控制需求的东西。我宁愿关注实际的变化,而不是版本应该是什么,这就是我的工具节省时间的地方。

有关该工具的基本原理的更多信息,请参阅此

于 2020-02-14T05:53:57.370 回答
0

我知道这是一个老问题,但我希望这种方法可以帮助某人,以防您想自动更新不同位置的两个 package.json 以使用相同的版本。

首先,将这些行添加到您的主要 pakcage.json 脚本部分:

"new-version": "npm version --git-tag-version=false",
"version": "echo 'starting postversion script'",
"postversion": "LAST_VERSION=$(npm pkg get version | sed 's/\"//g') && echo $LAST_VERSION && cd projects/ngx-timeline && sed -i.bak \"s/\\\"version\\\": \\\"[0-9]\\.[0-9]\\.[0-9]\\\"/\\\"version\\\": \\\"$LAST_VERSION\\\"/g\" package.json && rm package.json.bak && git commit -am \"Release $LAST_VERSION\" && git tag v$LAST_VERSION"

然后运行例如 npm run new-version minor,

  1. 第一个脚本将运行带有次要版本的 npm 版本和避免标签的选项
  2. 版本脚本将在默认命令之后运行您需要的命令(在我的情况下只是一个回显)
  3. 在带有 sed 的 postversion 脚本中,我可以覆盖我的子 package.json 中的版本,修改提交(默认情况下,版本脚本已经创建了一个提交),然后创建一个标签。
于 2022-02-04T03:05:35.420 回答