ChatGPT解决这个技术问题 Extra ChatGPT

自动更新 package.json 版本

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

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

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

为什么不制作一个编辑 package.json、提交然后标记它的 shell 脚本?
是的,所以预发布挂钩会调用该脚本,对吗?

g
gustavotkg

正确答案

为此,只需 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 所示。它只需要一个用于编辑您的 package.json 文件的 .git/hook/pre-release.sh 可执行文件。提交、推送和标记将由 git release 命令完成。

如果您没有为 git 使用任何扩展,您可以编写一个 shell 脚本(我将其命名为 git-release.sh),然后您可以将其别名为 git release,例如:

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

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


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

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


如果您使用 gulpjs: gulp-bump :)
当 npm 内置此功能时,为什么要使用外部库?
使用这些而不是 npm version 有什么好处?
@ConAntonakos 是的。尝试类似 npm --no-git-tag-version version patch
@JohannPhilippStrathausen 可能人们投了反对票,因为即使它提到了npm version(这是问题的正确答案),它也提出了grunt,这不是正确的答案(我可以详细说明很长一段时间为什么它不是正确的答案但这可能比我在这里允许添加的字符更多)
j
jcollum

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

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

第一行 npm version patch 会将 package.json 中的补丁版本增加 1(xx1 到 xx2)。然后添加所有文件——包括此时已修改的 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 的完全相同的文件夹提交。
T
Tieme

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

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

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


J
Jonatas Walker

提供更新的方法。

包.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"

这将:

... 运行测试 ... 将您的 package.json 更改为下一个次要版本(例如:1.8.1 到 1.9.0) 推送您的更改 创建一个新的 git 标签版本并发布您的 npm 包。

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


您还可以添加像 "deploy-minor": "npm version minor --force -m \"version %s\"" 这样的脚本,所以您只需要记住 npm run deploy-minor :)
r
rmcsharry

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

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
A
Anima-t3d

我正在使用 huskygit-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 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,但它现在是 husky: {hooks:{}} 配置中的 post-merge。您对 git-branch-is 有什么问题?
它只会对我出错而不是运行。不过不用担心,我最终选择了这个选项:marketplace.visualstudio.com/…
@Phil 感谢您的跟进。我刚刚尝试了更新版本并且没有错误,也许您的合并后命令本身有问题。
M
Mnemo

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

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

x - 主要,当你有重大变化并且发生了巨大的变化差异时。 y - 次要,当你有新的功能或增强发生时。 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"


A
Alejandro Vales

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

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

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

是的,您可以做的是在需要时运行 npm version 命令,您可以阅读有关它的更多信息 here npm version,但基本用法是 npm version patch,它会在您的package.json 版本 (1.0.X)

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

您可以根据需要配置为在预发布挂钩上运行 npm version 命令,但这取决于您在 CD/CI 管道中是否需要,但没有 npm version 命令和 git pre-release钩子不能用 package.json “轻松”做任何事情

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

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

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

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

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


在这种情况下,这应该是最好的答案。
D
Dmitry Grinko

您可以使用 version-select 包:

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

https://i.stack.imgur.com/CfaLR.gif

Read more


我喜欢这种方法,因为它很容易实现。不过,我很难让它与一个哈士奇的预提交钩子一起工作。似乎抛出错误 TypeError: this.stream.setRawMode is not a function。我猜 version-select 不喜欢在另一个进程中运行还是什么?
@Stretch0 我不确定 husky 预提交钩子,但我的 version-select 实现是直截了当的。您可以在这里找到它 - github.com/dm-grinko/version-select/blob/master/index.js
B
Bhadresh Arya

以防万一您想使用 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


D
Duc Trung Mai

使用 Husky

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

在这种情况下,您必须每次都更改您的 package.json 文件,因为它不会总是“补丁”。
@DmitryGrinko“不会被修补”是什么意思???!!!我将它用于我的项目,每次提交都可以完美运行,并且在初始设置后我不必关心它
“补丁”更改只是一种选择。也有“小”和“大”的变化
我认为在这种情况下答案就足够了
D
Daniel Eagle

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

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

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

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

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


E
Emanuele Fricano

我知道这是一个老问题,但我希望这种方法可以帮助某人,以防您想自动更新不同位置的两个 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,

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


M
M. Sherbeeny

请检查我的 NodeAutoVersionPush 宏脚本。这是一个使用 Visual Studio Code API 自动设置新版本然后使用键盘快捷键提交和推送的宏。

新版本基于当前日期和提交总数。但是您可以根据自己的喜好或任何其他语言轻松调整代码。