自动更新package.json版本


181

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

有没有一种方法可以package.json自动编辑文件?

需要git pre-release hook帮助吗?


1
为什么不制作一个shell脚本来编辑package.json,提交并标记它呢?
gustavotkg

是的,所以预发行版挂钩会调用该脚本,对吗?
tUrG0n 2012年

Answers:


93

npm version可能是正确的答案。只给一个替代我建议咕噜凸点。它由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,那可能是最简单的解决方案。


11
如果您使用的是gulpjsgulp -bump :)
GabLeRoux,2015年

我为此编写了Vik,一举爆破
Wildhoney

8
当npm内置此功能时,为什么要使用外部库?
linuxdan

8
用完这些有npm version什么好处?
Steve Bennett

3
@ConAntonakos是的。尝试类似的东西npm --no-git-tag-version version patch
Tong Shen

164

正确答案

为此,只需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,创建标签并将其推送到服务器。


您能否分享脚本外观的代码片段?:D
tUrG0n 2012年


我实际上使用了视觉媒体的git-extra回购。但git release不相应地更新的package.json ... github.com/visionmedia/git-extras/issues/150 d:
tUrG0n

因此,只需创建.git/hooks/pre-release.sh包含:echo -e "{\n\"version\": "$1"\n}" > package.json并尝试使用git release $version
gustavotkg,2012年

5
如评论在这里 npm version patchnpm version 0.3.1 将解决!您能相应地更新答案吗?ty!
tUrG0n 2012年

75

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

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 commitgit push,最后npm publish发布该模块。

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

Merc。


9
据我所知,npm version patch提交本身是否完成?但是,要将标签推送到github,我认为您也需要这样做git push --tags
ChrisV 2015年

@ChrisV是正确的- 更改npm version patch版本号并立即提交更改
Dan Esparza 2015年

2
@DanEsparza这可能是一个设置。npm version patch不会为我做任何事情。
Mordred

@Mordred Hmmm ...可能。我在npm config文档中没有看到任何关于此的信息,但是可能是因为您的路径中没有git或什么东西吗?
Dan Esparza 2015年

@DanEsparza git绝对在我从运行的同一文件夹提交的路径中npm version
Mordred 2015年

28

给出最新的方法。

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 tag版本,并

  5. 发布您的npm软件包。

--force是为了表明谁是老板!除了笑话,请参阅https://github.com/npm/npm/issues/8620


3
您还可以添加一个脚本,"deploy-minor": "npm version minor --force -m \"version %s\""这样您需要记住的就是npm run deploy-minor:)
Kristofor Carle


17

如果您使用纱线,则可以使用

yarn version --patch

这将package.json通过patch更新版本(0.0.x),提交并用格式标记它v0.0.0

同样,您可以使用--minor或更改次要或主要版本--major

推送到git时,请确保同时推送标签 --follow-tags

git push --follow-tags

您也可以为其创建脚本

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

只需输入以下内容即可运行 yarn release-it


10

我正在使用沙哑git-branch-is

从husky 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插件在用户界面中显示此内容

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>

我最喜欢这个沙哑的选项,尽管我认为它不再像以前那样工作了。我不认为存在“后合并”,“预推”可能是最好的选择。并且'git-branch-is'结果并没有真正起作用,因为它们会出错并且基本上使整个帖子崩溃(因为它同时检查了master和dev,因此将其中一个出错)
Phil

@Phil您仍然可以使用postmerge,但是它现在post-merge位于husky: {hooks:{}}配置文件中。您有什么问题git-branch-is
Anima-t3d

它只会为我出错而不是运行。不过不用担心,我最终选择了这个选项:marketplace.visualstudio.com/…–
Phil

1
@Phil感谢您的跟进。我只是尝试使用更新的版本,但没有错误,也许您的合并后命令本身有问题。
Anima-t3d

5

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

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

有没有一种方法可以自动编辑文件package.json?

是的,你可以做什么来实现这一目标,即运行npm version在需要时命令,你可以阅读更多关于它在这里NPM版本,但基本的用法是npm version patch,它会在您添加的第三个数字顺序package.json版本(1.0 X

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

您可以根据需要配置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点)


2

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

每个版本都有xyz版本,其中定义了不同的用途,如下所示。

  1. x-major,当您有重大更改且发生更改的差异很大时,请向上移动。
  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

npm run buildpatch

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

--no-git-tag-version

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


0

我创建了一个工具,该工具可以基于提交消息中的标记(称为更改类型)来完成自动语义版本控制。这紧随Angular Commit消息约定以及语义版本控制规范。

您可以使用此工具来使用故宫CLI中的package.json自动更改版本(这被描述在这里)。

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

我写这个工具是因为找不到适合我的CICD管道自动化语义版本控制需求的东西。我宁愿把重点放在实际的更改上,而不是版本上,这是我的工具节省时间的地方。

有关该工具原理的更多信息,请参见this

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.