我一直在macOS上编程,因此我的package.json
看起来像这样:
[...]
"scripts": {
"build": "NODE_TARGET=electron NODE_CONFIGURATION=development gulp",
"watch": "NODE_TARGET=electron NODE_CONFIGURATION=development gulp watch",
"build:web": "NODE_TARGET=web NODE_CONFIGURATION=development gulp",
"watch:web": "NODE_TARGET=web NODE_CONFIGURATION=development gulp watch",
"release": "NODE_TARGET=electron NODE_CONFIGURATION=production gulp",
"release:web": "NODE_TARGET=web NODE_CONFIGURATION=production gulp",
"clean": "gulp clean",
"start": "electron ."
}
[...]
起初,我尝试通过命令行参数以gulp --web
的形式提供这些参数,但我没有找到任何正确解析这些参数的库。因此,我在调用之前使用环境变量并访问gulpfile.babel.js
中的变量,如下所示:
const targetPlatform = {
isElectron: process.env.NODE_TARGET === "electron",
isWeb: process.env.NODE_TARGET === "web"
};
不幸的是,我没有考虑到Windows实际上无法处理npm脚本提供的命令/变量。我想知道如何使这些呼叫在Windows和macOS上可移植。
我的一个朋友建议使用cross-env
它基本上解决了我遇到的问题。
在使用该包之前,我只是使用以下代码解析了process.argv
数组:
const commandLineArguments = (argumentList => {
let parsedArguments = {}, index, option, thisOption, currentOption;
for (index = 0; index < argumentList.length; index++) {
thisOption = argumentList[index].trim();
option = thisOption.replace(/^-+/, '');
if (option === thisOption) {
if (currentOption) {
parsedArguments[currentOption] = option;
}
currentOption = null;
} else {
currentOption = option;
parsedArguments[currentOption] = true;
}
}
return parsedArguments;
})(process.argv);
使用像gulp --target electron --configuration development
这样的调用,我可以像这样访问这些参数:
const targetPlatform = {
isElectron: commandLineArguments.target === "electron",
isWeb: commandLineArguments.target === "web"
};
// Default setting if no option was supplied
if (!targetPlatform.isElectron && !targetPlatform.isWeb) {
targetPlatform.isElectron = true;
}