【发布时间】:2012-10-15 03:06:02
【问题描述】:
在我做一个小版本并标记它之前,我想更新 package.json 以反映程序的新版本。
有没有办法自动编辑文件package.json?
会使用git pre-release hook 帮助吗?
【问题讨论】:
-
为什么不做一个shell脚本来编辑package.json,提交然后标记它?
-
是的,所以预发布挂钩会调用该脚本,对吗?
在我做一个小版本并标记它之前,我想更新 package.json 以反映程序的新版本。
有没有办法自动编辑文件package.json?
会使用git pre-release hook 帮助吗?
【问题讨论】:
正确答案
为此,只需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,创建标签并将其推送到服务器。
【讨论】:
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
npm version patch 或 npm version 0.3.1 将解决它!你能相应地更新你的答案吗?太棒了!
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,它可能是最简单的解决方案。
这是我通常对我的项目所做的:
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 commit 和git push,最后是npm publish 发布模块。
我希望这是有道理的......
佣兵。
【讨论】:
npm version patch 会自行提交;但是,要将标签推送到github,我认为您还需要git push --tags。
npm version patch 修改版本号并立即提交更改
npm version patch 没有为我做任何事情。
npm version 的完全相同的文件夹提交。
作为npm version 的补充,如果您想要版本提升但没有标签或新提交,您可以使用--no-git-tag-version 标志:
npm --no-git-tag-version version patch
【讨论】:
提供更新的方法。
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"
哪个会:
...运行测试...
将您的 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 :)
如果你使用纱线,你可以使用
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 即可运行它
【讨论】:
我正在使用husky 和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 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,但现在post-merge 在husky: {hooks:{}} 配置中。 git-branch-is 有什么问题?
首先,您需要了解升级版本号的规则。您可以在此处阅读有关semantic version 的更多信息。
每个版本都会有 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"
【讨论】:
我想澄清一下这个问题得到的答案。
即使认为这里有一些正确解决问题并提供解决方案的答案,它们也不是正确的。这个问题的正确答案是使用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 是正确答案的原因如下:
package.json,则他使用npm;如果他使用npm,他可以访问npm scripts。npm scripts,他就可以访问npm version 命令。 提出其他工具的其他答案不正确。
gulp-bump 有效,但需要另一个额外的包,这可能会产生长期问题(我回答的第 3 点)
grunt-bump 有效,但需要另一个额外的包,这可能会产生长期问题(我回答的第 3 点)
【讨论】:
您可以使用version-select 包:
npm i -D version-select
{
"name": "test",
"version": "1.0.0",
"scripts": {
"version-select": "version-select"
},
"devDependencies": {
"version-select": "^1.0.13"
}
}
【讨论】:
以防万一你想使用 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"
}
}
只需将major、minor、patch 参数与npm run version 一起传递。默认为patch。
示例:
npm run version 或 npm run verison patch 或 npm run verison minor 或 npm run version major
【讨论】:
与Husky:
{
"name": "demo-project",
"version": "0.0.3",
"husky": {
"hooks": {
"pre-commit": "npm --no-git-tag-version version patch && git add ."
}
}
}
【讨论】:
我创建了一个tool,它可以根据提交消息中的标签(称为更改类型)完成自动语义版本控制。这与 Angular Commit Message Convention 和 Semantic Versioning Specification 密切相关。
您可以使用此工具通过 npm CLI 自动更改 package.json 中的版本(描述为 here)。
此外,它可以从这些提交创建一个更改日志,并且还有一个菜单(带有一个用于提交消息的拼写检查器)用于根据更改类型创建提交。我强烈建议您查看它并阅读文档以了解使用它可以完成的所有工作。
我编写该工具是因为我找不到任何适合我的 CICD 管道自动化语义版本控制需求的工具。我宁愿关注实际的变化而不是版本应该是什么,这就是我的工具节省时间的地方。
有关该工具的原理的更多信息,请see this。
【讨论】: