在我做一个小版本并标记它之前,我想更新 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 所示。它只需要一个用于编辑您的 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.4
的 git release 0.4
。您的脚本可以编辑 package.json
、创建标签并将其推送到服务器。
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(xx1 到 xx2)。然后添加所有文件——包括此时已修改的 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
https://docs.npmjs.com/cli/version
提供更新的方法。
包.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:
从哈士奇 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
,但它现在是 husky: {hooks:{}}
配置中的 post-merge
。您对 git-branch-is
有什么问题?
首先,您需要了解升级版本号的规则。您可以在此处阅读有关 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"
我想为这个问题得到的答案增加一些清晰度。
即使认为这里有一些正确解决问题并提供解决方案的答案,它们也不是正确的。此问题的正确答案是使用 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 点)
您可以使用 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
TypeError: this.stream.setRawMode is not a function
。我猜 version-select
不喜欢在另一个进程中运行还是什么?
version-select
实现是直截了当的。您可以在这里找到它 - github.com/dm-grinko/version-select/blob/master/index.js
以防万一您想使用 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。
我知道这是一个老问题,但我希望这种方法可以帮助某人,以防您想自动更新不同位置的两个 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 中的版本,修改提交(默认情况下,版本脚本已经创建了一个提交),然后创建一个标签。
请检查我的 NodeAutoVersionPush 宏脚本。这是一个使用 Visual Studio Code API 自动设置新版本然后使用键盘快捷键提交和推送的宏。
新版本基于当前日期和提交总数。但是您可以根据自己的喜好或任何其他语言轻松调整代码。
git release
没有相应地更新 package.json ... github.com/visionmedia/git-extras/issues/150 :Decho -e "{\n\"version\": "$1"\n}" > package.json
的.git/hooks/pre-release.sh
并尝试使用git release $version
npm version patch
或npm version 0.3.1
将解决它!你能相应地更新你的答案吗?泰!!