npm脚本:使用在package.json中指定的版本重命名文件

4
在我的package.json文件的脚本部分,我正在尝试重命名目录中的一些文件,但是我想从package.json本身(版本)中注入一个值到命令行。
因此,在下面的情况下,对于build:rename脚本,我想在执行之前替换脚本中的一个令牌(somevalue)。
在这种情况下,我希望传入npm_package_version,以便它成为文件名的一部分。 我不知所措...
"scripts": {
    "build:copy": "mkdirp dist && cp src/*.js dist/",
    "build:rename": "renamer --regex --find '(.+)(.js)' --replace '$1**somevalue**$2' dist/*"
}

假设你的 npm_package_version 目前是 1.2.0,并且你已经将一些文件复制到了 dist 目录中,这些文件分别是 foo.jsbaz.jsquux.js。运行 build:rename 脚本后,这些文件会被重命名为 foo1.2.0.jsbaz1.2.0.jsquux1.2.0.js 吗?还是我漏掉了什么? - RobC
不,它没有... --replace参数需要一个带引号的字符串参数,我尝试过的所有方法都失败了,我试图让脚本替换npm_module_version中的值,这是node在package.json文件范围内提供的全局值。如果您看到我在原始问题中的示例,正则表达式正在创建两个可以在输出文件名的模板中使用的组,但我需要能够将版本号注入该输出文件名中。如果需要评估npm_package_version值而不是接受变量名为文字,则需要进行评估。 - Ronald Phillips
谢谢,我明白你的正则表达式的意图以及npm_package_version是什么。在我的上一条评论中,我只是提供了一个假设性的输入文件名和结果文件名的例子,以便更清楚地说明你想要的结果。所以,在我的上一条评论的背景下,baz.js应该重命名为baz1.2.0.js吗? - RobC
是的,回答您的问题。我正在尝试在package.json中使用版本号作为唯一定义它的地方,但可以在需要对文件进行标记或标识版本的任何地方使用它。我不想每次版本更改时都更新renamer npm脚本中--replacement值的文字部分。 - Ronald Phillips
1个回答

11

当前在package.json中指定的version可以通过以下package.json变量在脚本中引用:


bash

bash shell中使用以下语法 - (请注意美元符号$前缀)

$npm_package_version


Windows

cmd.exePowershell中使用以下语法 - (请注意百分号%前后缀)

%npm_package_version%


跨平台

为了实现跨平台,可以使用cross-var

$ npm i -D cross-var

build:rename脚本可以修改如下:

"scripts": {
  ...
  "build:rename": "cross-var \"renamer --regex --find '\\.js$' --replace '$npm_package_version.js' dist/*\""
},

注意: 当--replace值包含括号分组中的美元符参考($1, $2)时,--find正则表达式的额外更改似乎与cross-var不兼容。新的正则表达式仅匹配以.js结尾的文件/字符串部分。


示例目录

运行更新后的build:rename脚本(当package.json中的version0.3.0时),将会将dist目录中的.js文件重命名为:

.
├── dist
│   ├── a.html
│   ├── b.css
│   ├── foo.js
│   ├── bar.js
│   └── quux.js

...变成了这样:

.
├── dist
│   ├── a.html
│   ├── b.css
│   ├── foo0.3.0.js
│   ├── bar0.3.0.js
│   └── quux0.3.0.js

附加说明

build:copy 脚本中使用的 cp 命令也无法跨平台工作。可以用 copyfiles 包替换:

$ npm i -D copyfiles

... 然后将 build:copy 脚本替换为以下内容:

"scripts": {
  "build:copy": "copyfiles -u 1 \"src/*.js\" \"dist\"",
   ...
},

你的脚本中的 mkdirp dist && 部分将变得多余,因为 copyfiles 将创建必要的目录(即 dist)。

如果跨平台对你的使用情况不是必须的,那么只需保留 build:copy 脚本不变,并将 build:rename 脚本更改为:

"build:rename": "renamer --regex --find '\\.js$' --replace $npm_package_version'.js' dist/*"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接