NodeJS npm package.json操作系统特定脚本

xcitsw88  于 2022-11-22  发布在  Node.js
关注(0)|答案(4)|浏览(220)

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

d6kp6zgx1#

有一个名为run-script-osNPM)的NPM包|GitHub),它不需要你写任何额外的文件,如果你想做的事情很简单,这会很方便。例如,在你的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,并在每一个上得到类似(或不同!)的结果。

w1e3prcc

w1e3prcc2#

您可以使用带有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;
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());
1tuwyuhd

1tuwyuhd3#

这绝对不是最可靠的方法,但是从技术上讲,您可以在一个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 )"
        }
}
cld4siwp

cld4siwp4#

这完全取决于您在脚本中尝试执行的操作,但您可以使用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上写的一篇文章,其中探讨了一些选项

相关问题