如何使用 npm postbuild 脚本通用复制文件

How to generic copy a file with npm postbuild script

我是 运行 yarn run build,这将重新创建我项目的目录 build。问题是:每当完成此操作时,我都会丢失一个必须包含在 build/ 中的文件,我手动将其复制并粘贴到那里。

所以,很自然地,我在 package.json 中创建了以下脚本,以便自动完成:

  "scripts": { 
    "build": "react-scripts build",
    "postbuild": "npm run copy", 
    "copy": "copy Staticfile build"
  },

现在的问题是:它能在 Mac 上运行吗? Linux?我只有一个 Windows,所以我不知道也无法测试,但我认为它不会工作,因为 copy 语句在 windows 上是原生的,但在其他 OS...

所以问题是:如何使它通用且OS-独立?

谢谢!

"I assume that it wouldn't work since copy statement is native on windows but not on other OS"

是的,你的假设是正确的。

在类 UNIX 平台上 (Linux、macOS 等...) cp command is analogous to the copy 命令可在 Windows 上使用。

为了跨平台兼容性考虑使用以下两种解决方案中的任何一种 - 两者本质上都是使用 node.js 来复制文件 (我个人会选择 "解决方案 A ").


解决方案 A:使用第三方包

利用shx包,其描述如下:

"shx is a wrapper around ShellJS Unix commands, providing an easy solution for simple Unix-like, cross-platform commands in npm package scripts."

  1. 首先cd到你的项目目录然后运行下面的命令安装它:

    npm i -D shx
    
  2. 然后在 package.json 的脚本部分重新定义 copy 脚本,如下所示:

    "scripts": {
      ...
      "copy": "shx cp Staticfile build"
    }
    

注意:还有其他软件包也可以满足您的跨平台要求,例如; copyfiles.


解决方案 B:使用 node.js 内置

或者,如果您想避免向项目添加更多依赖项,您可以考虑使用 node.js 内置 fs module. For example the following script utilizes the fs.readFileSync() and fs.writeFileSync() 方法。

"scripts": {
  ...
  "copy": "node -e \"const fs = require('fs'); const data = fs.readFileSync('Staticfile'); fs.writeFileSync('build/Staticfile', data);\""
}

这个 copy 脚本(上面)利用 node.js 命令行选项 -e 评估内联 JavaScript 如下:

const fs = require('fs');
const data = fs.readFileSync('Staticfile');
fs.writeFileSync('build/Staticfile', data);

注意:如果您想采用与前面示例类似的方法,即在 npm 脚本中执行自定义 node.js,您应该考虑改用 fs.copyFile() 方法。我刚刚提供了一个使用 fs.readFileSync()fs.writeFileSync() 的示例,因为我知道这些方法适用于 node.js 上的早期版本——不像 fs.copyFile() 需要 node.js >=8.5.0