我使用copyfiles作为npm scirpt
copyfiles -u 2 /src/app/conf.dev.json dist/config/
,但最后我想将文件重命名为
您如何将输入文件重命名为conf.json
之类的?
我检查了文档,但发现copyfiles
不可能实现。
有什么想法吗?
更新:
我继续遵循此Rename file with NPM,但是在执行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 抛出新的ERR_INVALID_CALLBACK(); ^
TypeError [ERR_INVALID_CALLBACK]:回调必须是一个函数
答案 0 :(得分:2)
以下是成功满足您要求的几种解决方案:
如@vitorlui的回答所述,当使用内置fs.rename()的nodejs时,回调参数是必需的。
另外,当通过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!
您还可以考虑安装并利用renamer重命名文件。如果您的重命名要求变得比问题中提供的示例更复杂,或者您想要的内容比 Solution A 更为冗长,这可能会很有用。
cd
到您的项目目录,并通过运行以下命令安装renamer
:
npm i -D renamer
然后运行以下命令来检查安装的renamer
版本。
npm ls renamer
注意: 之所以要求您检查安装了哪个版本,是因为这将确定您应该使用以下哪个renamer
命令。如果安装的版本是<0.7.0或> = 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
选项,然后再次运行命令 ,即可更改实际文件名。
自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
和{ {1}}),以使说明清晰。但是,您可以使用rename
运算符链接这两个命令,而不是形成一个npm脚本-尽管单行会很长:)
对于解决方案B ,我经常使用&&
的{{1}}版本,因此我运行; 0.6.1
进行安装,因为通常需要支持较旧版本的nodejs。在这种情况下,我按照上述标题为“如果已安装的重命名程序的版本为<0.7.0” 的子节中的示例使用renamer
标志。
答案 1 :(得分:1)
您可以使用此库。 https://www.npmjs.com/package/move-file仅移动到“新名称”
答案 2 :(得分:1)
您必须定义回调函数:
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