使用通过环境变量提供的选项运行 gulp 在 Windows 上不起作用



我一直在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;
}

最新更新