将 package.json 脚本从 mac 更改为 windows

change package.json script from mac to windows

我有一个基于MAC的项目,package.json脚本如下:

  "scripts": {
    "copyindex": "cp src/index.html build",
    "copycss": "cp src/cds.css build",
    "copyimages": "cp src/assets/images/** build/assets/images",
    "copyfonts": "cp src/fonts/** build/fonts",
    "copywc": "cp -r node_modules/@webcomponents/webcomponentsjs/bundles build && cp node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js build",
    "build": "rm -rf build && mkdir build && npm run copyindex && npm run copycss && mkdir build/assets && mkdir build/assets/images && npm run copyimages && mkdir build/fonts && npm run copyfonts && npm run copywc && rollup -c",
    "start": "serve build"
  },

当 运行 npm start 时 运行 在 MAC 上正常运行。我正在使用 windows 但它不 运行 我的电脑。我将大部分命令更改为 windows 命令,如下所示。但是,它仍然不起作用。还有什么我需要做的吗? 我收到错误,因为无法识别命令。

Error: 'rm' is not recognized as an internal or external command,
operable program or batch file.
  "scripts": {
    "copyindex": "copy src/index.html build",
    "copycss": "copy src/cds.css build",
    "copyfonts": "copy src/fonts/** build/fonts",
    "copywc": "copy -r node_modules/@webcomponents/webcomponentsjs/bundles build && copy node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js build",
    "build": "rm -rf || rmdir /s build && mkdir build && npm run copyindex && npm run copycss && mkdir build/fonts && npm run copyfonts && npm run copywc && rollup -c",
    "start": "serve build"
  },

我不想删除 MAC 命令。我希望 npm 脚本在 windows 和 MAC

中工作

挑战在于脚本需要能够在 Mac 或 Windows 上工作,但不知道它在前面是哪一个。由于 cmd.exethe default shell used by npm run under windows 中的脚本似乎非常有限,并且 cmd.exe/bin/sh(Mac 下的默认语言)所理解的语言的交叉点似乎几乎是空的,我认为您最好的选择是直接进入 node 编写脚本。这是一个如何工作的例子:

{
 ...
 "build_win32": "rmdir /s && build && ...",
 "build_darwin": "rm -rf && build && ...",
 "build": "node -e \"child_process.exec(`npm run build_${os.platform()}`)\""
}

最简单的实现方式可能是使用 shx,它可以在任何平台上 运行 Unix 命令。

"scripts": {
  "copyindex": "shx cp src/index.html build"
  // ...
},
"devDependencies": {
  "shx": "latest"
}

或者,您也可以安装提供单个命令的单独软件包,例如 copyfiles for cp, rimraf for rm -rf 等。它们有很多。

另一种方法是直接在 Javascript 中编写这些脚本,然后 运行 使用 Node.js 编写这些脚本。当您的脚本变得很长时,这可以说是一个更好的解决方案。它也不需要你依赖任何额外的包来 运行 你的脚本。

copyindex 示例:

#!/usr/bin/env node

const fs = require("fs")
fs.copyFileSync("src/index.html", "build/index.html")

在你的package.json中:

"scripts": {
  "copyindex": "node scripts/copyindex.js",
  // ...
}