【问题标题】:change package.json script from mac to windows将 package.json 脚本从 mac 更改为 windows
【发布时间】:2023-03-18 19:39:01
【问题描述】:

我有一个基于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,但它无法运行我的 PC。我将大部分命令更改为 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 中都可以工作

【问题讨论】:

  • “它仍然不起作用”——什么不起作用?你跑什么,你期望什么,你得到什么?
  • @ChristianFritz 对此感到抱歉。我编辑了这个问题。我正在尝试使用 npm start 运行 npm 脚本。但是,它不能在 Windows 上运行。在 MAC 中运行良好。我在 Windows 中将诸如“cp”之类的 MAC 命令更改为“复制”。但是,它仍然说大多数命令都无法识别。
  • 我不想删除 MAC 命令。我希望 npm 脚本在 windows 和 MAC 中都可以工作
  • @amar rm 是一个 unix 命令,Windows 不支持它。你最好的选择是使用terminal 而不是command prompt
  • 有趣的问题;对在 Windows 中执行的环境 npm 脚​​本了解不够,但您需要检测您所在的平台,然后相应地运行不同的脚本;您尝试的“或”不起作用。

标签: node.js json npm package.json


【解决方案1】:

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

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

或者,您也可以安装提供单个命令的单个包,例如copyfiles 用于cprimraf 用于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",
  // ...
}

【讨论】:

    【解决方案2】:

    挑战在于脚本需要能够在 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()}`)\""
    }
    

    【讨论】:

    • 太棒了。谢谢。那应该有帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多