以下是几种成功满足您要求的解决方案:
方案A
如@vitorlui的答案中所述,使用内置的nodejs 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
成功完成后,文件被复制并重命名后,您应该在控制台上看到以下内容:
文件已成功重命名!
解决方案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
选项并再次运行命令,即可更改实际文件名。
如果安装的renamer版本>=0.7.0
自v0.7.0以来,发生了破坏性变化,其中包括删除--regex
选项(有关详细信息,请参见此处)。自此版本起,提供了一个正则表达式字面量。
对API的此更改导致rename
脚本(如先前所示)需要重新定义如下:
"rename": "renamer -f \"/^conf.dev.json$/\" -r \"conf.json\" \"dist/config/*\"",
^ ^
注意: --regex
选项已被省略,正则表达式现在是文字,即现在用前向和后向斜杠包裹。此外,在此示例中,已删除 --dry-run
选项,因此请为测试目的重新启用它。
附加说明
对于 Solution A 和 Solution B,复制和重命名逻辑已添加到单独的 npm 脚本中(分别为 copy
和 rename
),以便更清晰地解释。但是,您也可以使用 &&
运算符将两个命令链接在一起,形成一个 npm 脚本 - 不过单行代码可能会很长 :)
对于 Solution B,我经常使用版本 0.6.1
的 renamer
,因此我运行以下命令进行安装:npm i -D renamer@0.6.1
,因为我通常需要支持较早版本的nodejs。在这种情况下,我使用 --regex
标志,就像前面提到的子部分标题为: "If the version of renamer installed is <0.7.0" 的示例一样。
shelljs
,但用于npm包脚本中的命令,因此它是可移植/跨平台的。看起来你可以用一个单一的shx mv ....
命令完成它。非常简洁;) - RobC