在 npm preversion 脚本中获取版本

Get version in npm preversion script

我正在尝试在 npm preversion 脚本中获取我正在创建的版本。

如:

{
    "scripts": {
        "preversion": "echo $version"
    }        
}

但是我找不到写什么可以代替$version

我想在 npm version <something> 时获得我正在创建的版本。例如,如果我做 npm version 1.0.1,我想得到 1.0.1。但是如果我在 1.0.0 版本时执行 npm version minor,我想得到 1.1.0.

来自docs

The exact order of execution is as follows:

[...]

  1. Run the preversion script. These scripts have access to the old version in package.json.

因此无法在 preversion 脚本中轻松获得未来版本,因为它 运行 版本实际更改之前。你可以想出一些 hacky 解决方案,例如:

"preversion": "mkdir ../ver && node -e \"const p = require('./package.json'); delete p.scripts.preversion; require('fs').writeFileSync('../ver/package.json', JSON.stringify(p), 'utf8')\" && cd ../ver && npm version minor && node -e \"console.log('new version is gonna be',require('./package.json').version);\" && cd -"

这基本上是将 package.json 文件复制到另一个目录 运行s npm version minor 并打印新版本。问题是硬编码的 npm version minor,当您 运行 例如 npm version 1.0.1 时,它不会给您正确的结果,并且无法获得触发此脚本的相同命令(至少我没有不知道有什么方法可以做到这一点)并 运行 在它完成之前再试一次。

我不知道您的要求,但我会使用 versionpostversion 脚本以便轻松获得新版本。或者您可以创建一些自定义脚本,它执行相同的操作但会在所有脚本启动之前生成新版本并且可以访问新版本。

重新定义您的 preversion 脚本如下:

"scripts": {
  "preversion": "echo $npm_package_version"
}

解释:

这将访问 package.json varsnpm_package_version 变量是 npm 创建的众多环境变量之一。

*nix 平台上 npm 运行s package.json 脚本通过 sh 通过默认。因此,您使用 $ 前缀在 npm 脚本中引用环境变量,即 $npm_package_version.

但是,在 Windows npm 运行s 脚本上默认使用 cmd。在这种情况下,您需要使用 %...% 语法在 npm 脚本中引用环境变量。例如:

"preversion": "echo %npm_package_version%"

如果需要跨平台支持,您可以通过使用 cross-var 来避免语法差异,即 $ 前缀 v 的 %...%。在这种情况下,您将需要重新定义 preversion 脚本,如下所示:

"scripts": {
  "preversion": "cross-var echo $npm_package_version"
}

提示:如果你cd你的项目目录和运行npm run env它会列出所有npm_*前缀npm 创建的环境变量。

如果您正在寻找以前的版本,这将有所帮助:

{
    "scripts": {
        "preversion": "node -p 'JSON.parse(fs.readFileSync(`package.json`)).version'"
    }        
}

其他方式只会让您获得新版本。