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/*"
}
4

1 回答 1

11

可以使用package.json 变量version通过脚本引用in 中指定的电流,如下所示:package.json


重击

bash shell 中使用语法 - (注意美元$前缀)

$npm_package_version


视窗

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/*\""
},

注意:当值包含对值中带括号的子字符串/组的美元引用 ( , ) 时,对--find正则表达式的附加更改cross-var似乎效果不佳。新的正则表达式只匹配以结尾的文件/字符串部分。--replace$1$2--find.js


示例目录

运行更新后的build:rename脚本(当versioninpackage.json为时0.3.0),将从以下重命名目录.js中的文件dist

.
├── 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

附加说明

脚本中使用的cp命令build:copy也不能跨平台工作。这可以用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/*"
于 2017-03-29T14:56:43.003 回答