51

我想创建一个package.json构建脚本,当从 Windows、Linux、Mac 运行时,它执行的命令集略有不同。

问题是我找不到一种方法将它放入package.json在每个系统上都可以正常运行的文件中。

这是我想要的一个例子:

"scripts" : {
    "build.windows" : "echo do windows specific stuff",
    "build.linux" : "echo do linux specific stuff",
    "build.mac" : "echo do mac specific stuff",
    "build" : "??????????????" <- what to put here to execute script designed for OS
                                  on which npm is running
}
4

4 回答 4

82

有一个名为run-script-os( NPM | GitHub ) 的 NPM 包,它不需要您编写任何额外的文件,如果您尝试做的事情非常简单,这会很方便。例如,在您的 中package.json,您可能有以下内容:

"scripts": {
    "test": "run-script-os",
    "test:darwin:linux": "export NODE_ENV=test && mocha",
    "test:win32": "SET NODE_ENV=test&& mocha"
}

然后,您可以npm test在 Windows、Mac 或 Linux 上运行,并在每一个上获得相似(或不同!)的结果。

于 2018-11-07T20:54:16.947 回答
33

您可以将脚本与node run-script命令一起使用。npm run是它的捷径。

包json:

"scripts" : {
    "build-windows" : "node build-windows.js",
    "build-linux" : "node build-linux.js",
    "build-mac" : "node build-mac.js",
    "build" : "node build.js"
}

命令行:

npm run build-windows

如果你不喜欢它,你可以在 node.js 中使用命令。

包json:

"scripts" : {
    "build" : "node build.js"
}

构建.js

var sys = require('sys');
var exec = require('child_process').exec;
var os = require('os');

function puts(error, stdout, stderr) { sys.puts(stdout) }

// Run command depending on the OS
if (os.type() === 'Linux') 
   exec("node build-linux.js", puts); 
else if (os.type() === 'Darwin') 
   exec("node build-mac.js", puts); 
else if (os.type() === 'Windows_NT') 
   exec("node build-windows.js", puts);
else
   throw new Error("Unsupported OS found: " + os.type());
于 2017-07-13T14:03:38.080 回答
2

这完全取决于您在脚本中尝试执行的操作,但您可能可以使用npm cli 包有效地将跨平台命令添加到任何 shell。

例如,如果你想删除一个目录,你可以为 windows 和 linux 使用不同的语法:

rm -rf _site     # bash
rd /s /q _site   # cmd

或者,您可以使用rimraf跨平台工作的 npm 包:

npx rimraf _site

以上面 Dave P 的示例为例,您可以cross-env像这样设置环境变量:

"scripts": {
    "test": "npx cross-env NODE_ENV=test mocha",
}

如果您不想使用npx实时安装脚本,您可以像这样提前全局安装它们:

npm i cross-env -g

这是我写的一篇关于使 NPM 脚本跨平台工作的文章,其中探讨了其中一些选项

于 2020-01-07T13:55:48.777 回答
1

绝对不是最可靠的方法,但从技术上讲,您可以在一个 npm 脚本中完成这一切:

{
    "scripts": {
        "build": "( Write-Output 'Powershell' && ./tools/build-ps.ps1 ) || 
                  ( CALL ./tools/build-cmd.bat ) || 
                  ( bash -c 'uname -a | grep -q -i Linux' && bash -c ./tools/build-linux.sh ) ||
                  ( bash -c 'uname -a | grep -q -i Darwin' && bash -c ./tools/build-mac.sh )"
        }
}
于 2021-08-26T07:37:27.957 回答