如何使用 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 转义双引号中进行计算,即 \"...\".

  1. 例如,将 package.jsonscripts 部分配置如下:

    "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 来重命名文件。如果您的重命名要求变得比您的问题中提供的示例更复杂,或者如果您想要比 解决方案 A 更简洁的内容,这可能是有益的。

安装并检查版本:

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

    npm i -D renamer
    
  2. 然后运行下面的命令检查renamer安装的是哪个版本

    npm ls renamer
    

注意: 我之所以要求您检查安装的是哪个版本,是因为这将决定您应该使用以下哪些 renamer 命令利用。如果安装的版本是 <0.7.0 或 >=0.7.0 则略有不同:


如果安装的 renamer 版本是 <0.7.0

  1. package.jsonscripts 部分设置为以下内容:

    "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 脚本中, (分别为 copyrename)为了解释清楚。但是,您可以使用 && 运算符链接这两个命令,而不是形成一个 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".