更新包。Json自动版本

在我做一个小的发布和标记它之前,我想更新这个包。Json来反映程序的新版本。

是否有自动编辑文件package.json的方法?

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

197091 次浏览

正确的答案

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

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

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可能是正确答案。只是为了提供一个替代方案,我推荐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,这可能是最简单的解决方案。

提供一个最新的方法。

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

作为npm version的附加,如果你想要一个版本碰撞但没有标记或一个新的提交,你可以使用--no-git-tag-version标志:

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

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

我正在使用沙哑的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)",
}
}
}

在husky 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插件在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>

如果你用的是纱线,你可以用

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来运行它

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

尽管这里有一些答案可以正确地解决问题并提供解决方案,但它们并不是正确的答案。这个问题的正确答案是使用npm version

是否有编辑文件包的方法。json自动吗?

是的,你能做的就是在需要时运行npm version命令来实现这一点,你可以阅读更多关于它的这里是NPM版本,但基本用法将是npm version patch,它将在你的package.json版本(1.0.X)上添加第三位数字顺序。

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

你可以根据需要配置在预释放钩子上运行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点)

首先,您需要了解升级版本号的规则。你可以在这里阅读更多关于语义版本的内容。

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

  1. x - major,当你有重大变化时,它是巨大的 发生了不一致的变化。李< / >
  2. y -小调,当你有 出现了新的功能或增强。李< / >
  3. z - patch, up this when 您修复了错误或恢复了早期版本上的更改

要运行脚本,可以在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"

我已经创建了一个工具,它可以根据提交消息中的标记(称为更改类型)完成自动语义版本控制。这紧跟Angular提交消息约定和语义版本规范。

您可以使用此工具自动更改包中的版本。json使用npm CLI(描述为在这里)。

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

我编写了这个工具,因为我找不到任何可以满足CICD Pipeline自动化语义版本控制需求的工具。我宁愿关注实际的更改是什么,而不是版本应该是什么,这就是我的工具解决问题的地方。

有关该工具基本原理的更多信息,请看到这个

以防万一,如果你想使用npm包semver 链接

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

只需要传递带有npm run versionmajorminorpatch参数。默认值为patch

< p >的例子: npm run version or npm run verison patch or npm run verison minor or npm run version major

Git Repo

沙哑的:

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

你可以使用version-select包:

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


enter image description here

阅读更多内容

我知道这是一个老问题,但我希望这种方法可以帮助某人,以防你想自动更新两个包。Json放在不同的位置,以便使用相同的版本。

首先,把这些线添加到你的主包中。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,

  1. 第一个脚本将运行带有minor和避免标记的选项的NPM版本
  2. 版本脚本将在默认命令(在我的例子中只是一个echo)之后运行您需要的命令。
  3. 在带有sed的后版本脚本中,我可以覆盖子包中的版本。Json,修改提交(默认情况下版本脚本已经创建了一个提交),然后创建一个标签。
请检查我的NodeAutoVersionPush宏脚本。 这是一个宏,使用Visual Studio Code API来自动设置新版本,然后使用键盘快捷键进行提交和推送 新版本基于当前日期和总提交数。 但是你可以很容易地调整代码到你的偏好或任何其他语言

我的构建和发布脚本运行在一个无法访问git的docker映像中,所以我想要一些不修改我的存储库,但能够发布自动递增版本的方法。所以我在预发布脚本中添加了这个:

npm view `sed -nr 's/"name": "([^"]+).*/\1/p' package.json` version | awk -F'.' '{ cmd = "npm version v" $1 "." $2 "." $3+1 " --force --no-git-tag-version"; system(cmd)}'

它的作用:

  1. 用sed读取包名
  2. 要求最新发布的版本与NPM查看版本
  3. 调用NPM version——force——no-git-tag-version,其中version取自(2)并加1

有很多方法可以改进它,但至少它是有效的,而且是普遍的。

我最终编写了这个解决方案(将其添加到package.json)脚本。Yarn具有非常相似的功能。

"postversion": "git add package.json && git commit -m $npm_package_version && git tag $npm_package_version HEAD && git push --tags"

它更新版本字段,创建一个带有package.json的新提交,提交带有版本名,标记它并推送到分支。

然后,你可以运行npm version patch | npm version minor | npm version major来创建一个带有标签的版本化提交。