1

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

如:

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

但我找不到要写什么而不是$version.

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

4

3 回答 3

6

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

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

解释:

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

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

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

"preversion": "echo %npm_package_version%"

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

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

提示:如果您cd进入项目目录并运行npm run env它,它将列出npm_*npm 创建的所有带前缀的环境变量。

于 2020-02-06T15:04:11.017 回答
0

文档

具体执行顺序如下:

[...]

  1. 运行preversion脚本。这些脚本可以访问 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 文件复制到另一个目录,运行npm version minor并打印新版本。问题是硬编码npm version minor的,例如,当您运行时,它不会给您正确的结果,npm version 1.0.1并且无法获得触发此脚本的相同命令(至少我不知道有任何方法)并在它之前再次运行它完成的。

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

于 2020-02-06T10:55:36.933 回答
0

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

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

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

于 2020-11-30T23:37:39.307 回答