如何使用 npm 脚本重命名文件
How to rename file with npm script
我正在使用 copyfiles 作为 npm scirpt
copyfiles -u 2 /src/app/conf.dev.json dist/config/
但最后我想将文件重命名
如何将输入文件重命名为 conf.json
之类的名称?
我查看了文档,没有发现可以用 copyfiles
实现。
有什么想法吗?
更新:
我跟进这个 但在执行 npm run copy
:
时出现错误
"copy": "copyfiles -u 2 /src/app/conf.dev.json dist/config/ && node -e require('fs').rename('dist/config/conf.prod.json','dist/config/conf.json')"
fs.js:137
throw new ERR_INVALID_CALLBACK();
^
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
你可以使用这个库。
https://www.npmjs.com/package/move-file 如果移动到 "new name"
您必须定义回调函数:
fs.rename('oldFile.txt', 'newFile.txt', (err) => {
if (err) throw err;
console.log('Rename complete!');
});
类似的东西:
"copy": "copyfiles -u 2 /src/app/conf.dev.json dist/config/ && node -e require('fs').rename('dist/config/conf.prod.json','dist/config/conf.json' , (err) => { (err? console.log(err) : console.log('Rename complete!') ) } )"
@见https://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback
以下是成功满足您要求的几个解决方案:
解决方案 A
如 @vitorlui's answer the callback parameter is mandatory when using the nodejs built-in fs.rename() 中所述。
此外,当通过 npm 脚本使用 node -e
命令时,有必要将脚本包装在 JSON 转义双引号中进行计算,即 \"...\"
.
例如,将 package.json 的 scripts
部分配置如下:
"scripts": {
"rename": "node -e \"require('fs').rename('dist/config/conf.dev.json', 'dist/config/conf.json', function(err) { if (err) console.log(err); console.log('File successfully renamed!') })\"",
"copy": "copyfiles -u 2 \"src/app/conf.dev.json\" \"dist/config/\"",
"copy-and-rename": "npm run copy && npm run rename"
},
然后运行以下npm命令:
npm run copy-and-rename
成功完成后,您应该会在复制并重命名文件后看到以下内容记录到控制台:
File successfully renamed!
解决方案 B
您也可以考虑安装并使用 renamer 来重命名文件。如果您的重命名要求变得比您的问题中提供的示例更复杂,或者如果您想要比 解决方案 A 更简洁的内容,这可能是有益的。
安装并检查版本:
cd
到您的项目目录并通过 运行 执行以下命令安装 renamer
:
npm i -D renamer
然后运行下面的命令检查renamer
安装的是哪个版本
npm ls renamer
注意: 我之所以要求您检查安装的是哪个版本,是因为这将决定您应该使用以下哪些 renamer
命令利用。如果安装的版本是 <0.7.0 或 >=0.7.0 则略有不同:
如果安装的 renamer 版本是 <0.7.0
将 package.json 的 scripts
部分设置为以下内容:
"scripts": {
"rename": "renamer --dry-run -f --regex \"^conf.dev.json$\" -r \"conf.json\" \"dist/config/*\"",
"copy": "copyfiles -u 2 \"src/app/conf.dev.json\" \"dist/config/\"",
"copy-and-rename": "npm run copy && npm run rename"
},
然后运行下面的npm
命令:
npm run copy-and-rename
您应该会看到如下内容记录到您的控制台;
√ dist\config\conf.dev.json -> dist\config\conf.json
指示更改了哪个路径名。
您还会注意到复制文件的实际文件名没有改变,这是因为我们包含了 --dry-run
选项。只需 省略脚本中的 --dry-run
选项并再次 运行 命令 即可更改实际文件名。
如果安装的重命名器版本>=0.7.0
自 v0.7.0 以来发生了重大变化,其中包括删除了 --regex
选项 (有关详细信息,请参阅 here)。从这个版本开始,现在提供了一个正则表达式文字。
对 API 的更改导致 rename
脚本(如前所示)需要重新定义如下:
"rename": "renamer -f \"/^conf.dev.json$/\" -r \"conf.json\" \"dist/config/*\"",
^ ^
注意: --regex
选项已被省略,正则表达式现在是文字,即它现在包含在前导和尾随正斜杠中。此外,在此示例中,删除了 --dry-run
选项,因此出于测试目的恢复它。
补充说明
对于解决方案 A 和 解决方案 B,复制和重命名逻辑已添加到单独的 npm 脚本中, (分别为 copy
和 rename
)为了解释清楚。但是,您可以使用 &&
运算符链接这两个命令,而不是形成一个 npm 脚本 - 虽然单行会相当长:)
对于解决方案B,我经常使用renamer
的版本0.6.1
,所以我运行; npm i -D renamer@0.6.1
安装,因为我通常要支持旧版本的 nodejs。在这种情况下,我根据上述小节中显示的示例使用 --regex
标志:"If the version of renamer installed is <0.7.0".
我正在使用 copyfiles 作为 npm scirpt
copyfiles -u 2 /src/app/conf.dev.json dist/config/
但最后我想将文件重命名
如何将输入文件重命名为 conf.json
之类的名称?
我查看了文档,没有发现可以用 copyfiles
实现。
有什么想法吗?
更新:
我跟进这个 npm run copy
:
"copy": "copyfiles -u 2 /src/app/conf.dev.json dist/config/ && node -e require('fs').rename('dist/config/conf.prod.json','dist/config/conf.json')"
fs.js:137 throw new ERR_INVALID_CALLBACK(); ^
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
你可以使用这个库。 https://www.npmjs.com/package/move-file 如果移动到 "new name"
您必须定义回调函数:
fs.rename('oldFile.txt', 'newFile.txt', (err) => {
if (err) throw err;
console.log('Rename complete!');
});
类似的东西:
"copy": "copyfiles -u 2 /src/app/conf.dev.json dist/config/ && node -e require('fs').rename('dist/config/conf.prod.json','dist/config/conf.json' , (err) => { (err? console.log(err) : console.log('Rename complete!') ) } )"
@见https://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback
以下是成功满足您要求的几个解决方案:
解决方案 A
如 @vitorlui's answer the callback parameter is mandatory when using the nodejs built-in fs.rename() 中所述。
此外,当通过 npm 脚本使用 node -e
命令时,有必要将脚本包装在 JSON 转义双引号中进行计算,即 \"...\"
.
例如,将 package.json 的
scripts
部分配置如下:"scripts": { "rename": "node -e \"require('fs').rename('dist/config/conf.dev.json', 'dist/config/conf.json', function(err) { if (err) console.log(err); console.log('File successfully renamed!') })\"", "copy": "copyfiles -u 2 \"src/app/conf.dev.json\" \"dist/config/\"", "copy-and-rename": "npm run copy && npm run rename" },
然后运行以下npm命令:
npm run copy-and-rename
成功完成后,您应该会在复制并重命名文件后看到以下内容记录到控制台:
File successfully renamed!
解决方案 B
您也可以考虑安装并使用 renamer 来重命名文件。如果您的重命名要求变得比您的问题中提供的示例更复杂,或者如果您想要比 解决方案 A 更简洁的内容,这可能是有益的。
安装并检查版本:
cd
到您的项目目录并通过 运行 执行以下命令安装renamer
:npm i -D renamer
然后运行下面的命令检查
renamer
安装的是哪个版本npm ls renamer
注意: 我之所以要求您检查安装的是哪个版本,是因为这将决定您应该使用以下哪些 renamer
命令利用。如果安装的版本是 <0.7.0 或 >=0.7.0 则略有不同:
如果安装的 renamer 版本是 <0.7.0
将 package.json 的
scripts
部分设置为以下内容:"scripts": { "rename": "renamer --dry-run -f --regex \"^conf.dev.json$\" -r \"conf.json\" \"dist/config/*\"", "copy": "copyfiles -u 2 \"src/app/conf.dev.json\" \"dist/config/\"", "copy-and-rename": "npm run copy && npm run rename" },
然后运行下面的
npm
命令:npm run copy-and-rename
您应该会看到如下内容记录到您的控制台;
√ dist\config\conf.dev.json -> dist\config\conf.json
指示更改了哪个路径名。
您还会注意到复制文件的实际文件名没有改变,这是因为我们包含了
--dry-run
选项。只需 省略脚本中的--dry-run
选项并再次 运行 命令 即可更改实际文件名。
如果安装的重命名器版本>=0.7.0
自 v0.7.0 以来发生了重大变化,其中包括删除了 --regex
选项 (有关详细信息,请参阅 here)。从这个版本开始,现在提供了一个正则表达式文字。
对 API 的更改导致 rename
脚本(如前所示)需要重新定义如下:
"rename": "renamer -f \"/^conf.dev.json$/\" -r \"conf.json\" \"dist/config/*\"",
^ ^
注意: --regex
选项已被省略,正则表达式现在是文字,即它现在包含在前导和尾随正斜杠中。此外,在此示例中,删除了 --dry-run
选项,因此出于测试目的恢复它。
补充说明
对于解决方案 A 和 解决方案 B,复制和重命名逻辑已添加到单独的 npm 脚本中, (分别为
copy
和rename
)为了解释清楚。但是,您可以使用&&
运算符链接这两个命令,而不是形成一个 npm 脚本 - 虽然单行会相当长:)对于解决方案B,我经常使用
renamer
的版本0.6.1
,所以我运行;npm i -D renamer@0.6.1
安装,因为我通常要支持旧版本的 nodejs。在这种情况下,我根据上述小节中显示的示例使用--regex
标志:"If the version of renamer installed is <0.7.0".