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

Ped*_*rsi 9 npm-scripts

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

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

  "scripts": { 
    "build": "react-scripts build",
    "postbuild": "npm run copy", 
    "copy": "copy Staticfile build"
  },
Run Code Online (Sandbox Code Playgroud)

现在的问题是:它能在 Mac 上运行吗?Linux?我只有 Windows,所以我不知道也无法测试,但我认为它不起作用,因为copy语句在 Windows 上是本机的,但在其他操作系统上却不是......

那么问题是:如何使其通用且独立于操作系统?

谢谢你!

Rob*_*obC 17

“我认为它不起作用,因为copy该语句在 Windows 上是本机的,但在其他操作系统上则不然”

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

在类 UNIX 平台(Linux、macOS 等)上,该cp命令类似于copyWindows 上的命令。

为了跨平台兼容性,请考虑使用以下两种解决方案之一 - 两者本质上都使用 node.js 来复制文件(我个人会选择“解决方案 A”


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

使用shx描述如下的包:

“是ShellJSshx Unix 命令的包装器,为 npm 包脚本中的简单类 Unix、跨平台命令提供简单的解决方案。”

  1. 首先cd到您的项目目录并运行以下命令来安装它:

    npm i -D shx
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后在package.jsoncopy的脚本部分中重新定义脚本,如下所示:

    "scripts": {
      ...
      "copy": "shx cp Staticfile build"
    }
    
    Run Code Online (Sandbox Code Playgroud)

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


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

或者,如果您想避免向项目添加更多依赖项,您可以考虑使用node.js内置fs模块。例如,以下脚本使用fs.readFileSync()fs.writeFileSync()方法。

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

copy脚本(上图)利用 node.js 命令行选项-e来评估内联 JavaScript,如下所示:

const fs = require('fs');
const data = fs.readFileSync('Staticfile');
fs.writeFileSync('build/Staticfile', data);
Run Code Online (Sandbox Code Playgroud)

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