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

9

我正在运行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本地的,而不是其他操作系统的...

因此问题是:如何使它具有通用性和跨平台性?

谢谢!

1个回答

16

"我认为这不起作用,因为copy语句在Windows上是原生的,但在其他操作系统上不是"

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

在类UNIX平台(Linux、macOS等)上,cp命令类似于Windows上可用的copy命令。

为了实现跨平台兼容性,请考虑使用以下两种解决方案之一-两种解决方案都基本上使用node.js复制文件(个人建议选择“解决方案A”)。


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

使用shx包,其描述如下:

"shxShellJS Unix命令的包装器,在npm包脚本中提供了简单的类Unix跨平台命令的易用解决方案。"

  1. Firstly cd to your project directory and run the following command to install it:

    npm i -D shx
    
  2. Then redefine your copy script in the scripts section of your package.json as follows:

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

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


解决方案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);\""
}

这个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


顺便提一下,如果将来您想通过npm脚本递归地跨平台复制文件而不仅仅是单个文件,请参考我的答案这里 - 它基本上使用与上面“解决方案A”相同的shx包。 - RobC
它在我的Windows上完美运行!不过还得等待其他操作系统的用户尝试一下!谢谢:D - Pedro Accorsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接