【问题标题】:update package.json version automatically自动更新 package.json 版本
【发布时间】:2012-10-15 03:06:02
【问题描述】:

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

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

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

【问题讨论】:

标签: git node.js npm githooks


【解决方案1】:

正确答案

为此,只需npm version patch =)

我的旧答案

原来git中没有pre-release钩子。至少,man githooks 没有显示出来。

例如,如果您使用git-extra (https://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.4,它将执行path/to/pre-release.sh 0.4。您的脚本可以编辑package.json,创建标签并将其推送到服务器。

【讨论】:

  • 你能分享一下脚本是什么样子的代码 sn-p 吗? :D
  • 我实际上使用了 visionmedia 的 git-extra repo。但是git release 并没有相应地更新 package.json ...github.com/visionmedia/git-extras/issues/150 :D
  • 所以,只需创建 .git/hooks/pre-release.sh 包含:echo -e "{\n\"version\": "$1"\n}" > package.json 并尝试使用 git release $version
  • 如评论 here npm version patchnpm version 0.3.1 将解决它!你能相应地更新你的答案吗?太棒了!
【解决方案2】:

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,它可能是最简单的解决方案。

【讨论】:

  • 如果你使用的是gulpjsgulp-bump :)
  • npm 内置了这个功能,为什么还要使用外部库?
  • 相比npm version,使用这些有什么好处?
  • @ConAntonakos 是的。试试npm --no-git-tag-version version patch
  • @JohannPhilippStrathausen 可能人们投了反对票,因为即使它提到了npm version(这是问题的正确答案)它提出了grunt,这不是正确的答案(我可以详细说明很长一段时间为什么它不是正确的答案,但这可能比我在这里允许添加的字符更多)
【解决方案3】:

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

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

第一行 npm version patch 会将 package.json 中的补丁版本增加 1(x.x.1 到 x.x.2)。然后添加所有文件——包括当时已修改的package.json。 然后是通常的git commitgit push,最后是npm publish 发布模块。

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

佣兵。

【讨论】:

  • 据我所知,npm version patch 会自行提交;但是,要将标签推送到github,我认为您还需要git push --tags
  • @ChrisV 是正确的 -- npm version patch 修改版本号并立即提交更改
  • @DanEsparza 这可能是一个设置问题。 npm version patch 没有为我做任何事情。
  • @Mordred 嗯……可能。我在 npm config 文档中没有看到任何关于此的内容,但可能是您的路径中没有 git 吗?
  • @DanEsparza git 肯定在路径中,因为我从运行 npm version 的完全相同的文件夹提交。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    提供更新的方法。

    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

    【讨论】:

    • 您也可以添加像"deploy-minor": "npm version minor --force -m \"version %s\"" 这样的脚本,所以您只需要记住npm run deploy-minor :)
    【解决方案6】:

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

    yarn version --patch
    

    这将通过补丁(0.0.x) 增加package.json 版本,提交并使用格式v0.0.0 标记它

    同样,您可以使用 --minor--major 来提升次要或主要版本

    当推送到 git 时,确保你也推送带有 --follow-tags 的标签

    git push --follow-tags
    

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

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

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

    【讨论】:

    • 纱线版本​​补丁不带 (--)。 docs
    【解决方案7】:

    我正在使用huskygit-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 version

    Webpack 或 Vue.js

    如果您使用的是 webpack 或 Vue.js,您可以使用 Auto inject version - Webpack plugin 在 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>
    

    【讨论】:

    • 我最喜欢这个沙哑的选项,尽管我认为它不再像现在这样工作了。我不认为“postmerge”存在,“pre-push”可能是最好的选择。并且 'git-branch-is' 结果并没有真正起作用,因为它们出错并且基本上使整个帖子崩溃(因为它同时检查 master 和 dev,它会在其中一个上出错)
    • @Phil 你仍然可以使用postmerge,但现在post-mergehusky: {hooks:{}} 配置中。 git-branch-is 有什么问题?
    • 它只会出错而不是运行。不过不用担心,我最终选择了这个选项:marketplace.visualstudio.com/…
    • @Phil 感谢您的跟进。我刚刚尝试了更新版本,我没有错误,也许你的合并后命令本身有问题。
    【解决方案8】:

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

    每个版本都会有 x.y.z 版本,它定义了不同的用途,如下所示。

    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 &amp;&amp; ng build --prod"

    【讨论】:

      【解决方案9】:

      我想澄清一下这个问题得到的答案。

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

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

      是的,你可以做的是在需要时运行npm version 命令,你可以阅读更多关于它的信息here npm version,但基本用法是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 点)

      【讨论】:

      • 这应该是这种情况下的最佳答案。
      【解决方案10】:

      您可以使用version-select 包:

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

      Read more

      【讨论】:

        【解决方案11】:

        以防万一你想使用 npm 包 semver link 来做到这一点

        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"
          }
        }
        

        只需将majorminorpatch 参数与npm run version 一起传递。默认为patch

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

        Git Repo

        【讨论】:

          【解决方案12】:

          Husky:

          {
            "name": "demo-project",
            "version": "0.0.3",
            "husky": {
              "hooks": {
                "pre-commit": "npm --no-git-tag-version version patch && git add ."
              }
            }
          }
          

          【讨论】:

          • 在这种情况下,您必须每次都更改您的 package.json 文件,因为它不会总是“补丁”。
          • @DmitryGrinko 你说的“不会打补丁”是什么意思???!!!我将它用于我的项目,每次提交都可以完美运行,并且在初始设置后我不必关心它
          • “补丁”更改只是一种选择。也有“小”和“大”的变化
          • 我觉得这个案例的答案就够了
          【解决方案13】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2021-12-17
            • 2016-04-27
            • 2021-09-29
            • 2010-09-05
            • 2017-08-17
            • 1970-01-01
            • 2020-05-10
            • 1970-01-01
            • 2017-12-26
            相关资源
            最近更新 更多