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.jsbaz.jsquux.js。运行build:rename 脚本是否会导致文件重命名为foo1.2.0.jsbaz1.2.0.jsquux1.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.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 值中带括号的子字符串/组。新的正则表达式只匹配以 .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/*"

【讨论】:

以上是关于npm 脚本使用 package.json 中指定的版本重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

yarn berry foreach 工作区未按 package.json 中指定的顺序构建包

在 package.json 中指定多个类型定义文件

在 aws 上部署应用程序时在 package.json 中指定节点 js 版本

Node.js 命令行工具的编写

sh 使用package.json(engines.node)中指定的节点版本。使用jq和nvm。如果要安装版本,则会在缺少版本时提示。

与 npm 和 yarn 一起使用的 package.json 脚本?