npm 脚本使用 package.json 中指定的版本重命名文件
Posted
技术标签:
【中文标题】npm 脚本使用 package.json 中指定的版本重命名文件【英文标题】:npm script to rename files with the version specified in package.json 【发布时间】:2017-08-21 03:24:16 【问题描述】:在我的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.js
、baz.js
和 quux.js
。运行build:rename
脚本是否会导致文件重命名为foo1.2.0.js
、baz1.2.0.js
和quux1.2.0.js
?还是我错过了什么?
不,它没有...... --replace 参数采用带引号的字符串参数,我尝试的所有操作都失败了,我试图让脚本替换 npm_module_version 中的值,这是一个全局值在 package.json 文件范围内提供的节点。如果您在原始问题中看到我的示例,则正则表达式正在创建两个组,我可以在输出文件名的模板中使用它们,但我需要能够在该输出文件名中注入版本号。如果需要评估 npm_package_version 值而不是接受变量名作为文字。
谢谢,我明白你的正则表达式想要达到什么目的,以及npm_package_version
是什么。在我之前的评论中,我只是提供了一个输入文件名和结果文件名的假设示例,以准确说明您想要的结果是什么。那么,在我之前的评论中,baz.js
是否应该重命名为 baz1.2.0.js
?
是的,你的问题。我正在尝试将 package.json 中的版本号用作唯一且仅定义它的位置,但能够在任何需要标记或标识具有版本的文件的地方使用它。我宁愿不必在每次版本更改时更新 renamer npm 脚本中 --replacement 值的文字部分。
【参考方案1】:
package.json
中指定的当前version
可以通过使用package.json vars 的脚本引用如下:
重击
在 bash 中使用语法 - (注意美元 $
前缀):
$npm_package_version
Windows
在cmd.exe和Powershell中使用语法-(注意百分比%
前缀和后缀):
%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
值中带括号的子字符串/组。新的正则表达式只匹配以 .js
结尾的文件/字符串部分。
示例目录
运行更新后的build:rename
脚本(当package.json
中的version
为0.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/*"
【讨论】:
以上是关于npm 脚本使用 package.json 中指定的版本重命名文件的主要内容,如果未能解决你的问题,请参考以下文章
yarn berry foreach 工作区未按 package.json 中指定的顺序构建包
在 aws 上部署应用程序时在 package.json 中指定节点 js 版本
sh 使用package.json(engines.node)中指定的节点版本。使用jq和nvm。如果要安装版本,则会在缺少版本时提示。