npm package.json OS 具体脚本
npm package.json OS specific script
我想创建一个 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
}
您可以通过 node 运行-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;
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());
有一个名为 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
,并在每个上获得相似(或不同!)的结果。
这完全取决于您要在脚本中执行的操作,但您很可能可以使用 npm cli packages 有效地将跨平台命令添加到任何 shell.
例如,如果您想删除一个目录,您可以对windows和linux使用单独的语法:
rm -rf _site # bash
rd /s /q _site # cmd
或者,您可以使用跨平台工作的 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 上写的 post,其中探讨了其中一些选项
绝对不是最可靠的方法,但从技术上讲,您可以在一个 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 )"
}
}
我想创建一个 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
}
您可以通过 node 运行-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;
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());
有一个名为 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
,并在每个上获得相似(或不同!)的结果。
这完全取决于您要在脚本中执行的操作,但您很可能可以使用 npm cli packages 有效地将跨平台命令添加到任何 shell.
例如,如果您想删除一个目录,您可以对windows和linux使用单独的语法:
rm -rf _site # bash
rd /s /q _site # cmd
或者,您可以使用跨平台工作的 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 上写的 post,其中探讨了其中一些选项
绝对不是最可靠的方法,但从技术上讲,您可以在一个 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 )"
}
}