我想创建一个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
}
答案 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-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"
}
然后,您可以在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上写的一篇帖子,其中探讨了其中一些选项