npm package.json OS特定脚本

时间:2017-07-13 13:50:05

标签: node.js npm package.json npm-scripts

我想创建一个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
}

3 个答案:

答案 0 :(得分:14)

您可以将脚本与 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"
}

Build.js

var sys = require('sys')
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }

var os = require('os');
//control OS
//then run command depengin 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());

答案 1 :(得分:11)

有一个名为run-script-osNPM | GitHub的NPM程序包,它不需要您编写任何其他文件,如果要尝试的话,这样做会很方便。要做的很简单。例如,在您的package.json中,您可能会有类似的内容:

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

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

答案 2 :(得分:1)

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

例如,如果要删除目录,则可以对Windows和Linux使用单独的语法:

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

或者在Insead中,您可以使用跨平台使用的npm软件包rimraf

npx rimraf _site

以上面的Dave P为例,您可以使用cross-env设置环境变量,如下所示:

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

如果您不想使用npx实时安装脚本,则可以像下面这样在全球范围内提前安装它们:

npm i cross-env -g

这是我在making NPM scripts work cross platform上写的一篇帖子,其中探讨了其中一些选项