如何使用npm脚本重命名文件

时间:2019-01-30 10:46:06

标签: node.js npm npm-scripts

我使用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]:回调必须是一个函数

3 个答案:

答案 0 :(得分:2)

以下是成功满足您要求的几种解决方案:

解决方案A

@vitorlui的回答所述,当使用内置fs.rename()的nodejs时,回调参数是必需的。

另外,当通过npm脚本使用node -e命令时,有必要将脚本包装起来以JSON转义双引号(即\"...\")进行评估。

  1. 例如,如下配置 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"
    },
    
  2. 然后运行以下npm命令:

    npm run copy-and-rename
    
  3. 成功完成复制后,您应该在复制并重命名文件后看到以下内容记录到控制台:

      

    File successfully renamed!


解决方案B

您还可以考虑安装并利用renamer重命名文件。如果您的重命名要求变得比问题中提供的示例更复杂,或者您想要的内容比 Solution A 更为冗长,这可能会很有用。

安装并检查哪个版本:

  1. cd到您的项目目录,并通过运行以下命令安装renamer

    npm i -D renamer
    
  2. 然后运行以下命令来检查安装的renamer版本。

    npm ls renamer
    

注意: 之所以要求您检查安装了哪个版本,是因为这将确定您应该使用以下哪个renamer命令。如果安装的版本是<0.7.0或> = 0.7.0:

,则略有不同

如果安装的重命名器版本为<0.7.0

  1. 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"
    },
    
  2. 然后运行以下npm命令:

    npm run copy-and-rename
    
  3. 您应该看到类似以下内容的日志记录到控制台;

      

    √ dist\config\conf.dev.json -> dist\config\conf.json

    指示更改了哪个路径名。

  4. 您还将注意到复制文件的实际文件名没有更改,这是因为我们包含了--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和{ {1}}),以使说明清晰。但是,您可以使用rename运算符链接这两个命令,而不是形成一个npm脚本-尽管单行会很长:)

  • 对于解决方案B ,我经常使用&&的{​​{1}}版本,因此我运行; 0.6.1进行安装,因为通常需要支持较旧版本的nodejs。在这种情况下,我按照上述标题为“如果已安装的重命名程序的版本为<0.7.0” 的子节中的示例使用renamer标志。

    < / li>

答案 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