public static executeCordovaCommand()

in src/utils/cordovaCommandHelper.ts [26:99]


    public static executeCordovaCommand(projectRoot: string, command: string, useIonic: boolean = false): Promise<void> {
        let telemetryEventName: string = CordovaCommandHelper.CORDOVA_TELEMETRY_EVENT_NAME;
        let cliCommandName: string = CordovaCommandHelper.CORDOVA_CMD_NAME;
        let cliDisplayName: string = CordovaCommandHelper.CORDOVA_DISPLAY_NAME;

        if (useIonic) {
            telemetryEventName = CordovaCommandHelper.IONIC_TELEMETRY_EVENT_NAME;
            cliCommandName = CordovaCommandHelper.IONIC_CMD_NAME;
            cliDisplayName = CordovaCommandHelper.IONIC_DISPLAY_NAME;
        }

        return CordovaCommandHelper.selectPlatform(projectRoot, command, useIonic)
            .then((platform) => {
                TelemetryHelper.generate(telemetryEventName, (generator) => {
                    generator.add("command", command, false);
                    let logger = OutputChannelLogger.getMainChannel();
                    let commandToExecute;
                    if (useIonic && ["run", "prepare"].indexOf(command) > -1) {
                        commandToExecute = `${cliCommandName} cordova ${command}`;
                    } else {
                        commandToExecute = `${cliCommandName} ${command}`;
                    }

                    if (platform) {
                        commandToExecute += ` ${platform}`;
                        // Workaround for dealing with new build system in XCode 10
                        // https://github.com/apache/cordova-ios/issues/407
                        if (platform === "ios") {
                            commandToExecute += " --buildFlag='-UseModernBuildSystem=0'";
                        }
                    }

                    const runArgs = CordovaCommandHelper.getRunArguments(projectRoot);
                    if (runArgs.length) {
                        commandToExecute += ` ${runArgs.join(" ")}`;
                    }

                    logger.log(localize("Executing", "########### EXECUTING: {0} ###########", commandToExecute));
                    const env = CordovaProjectHelper.getEnvArgument({
                        env: CordovaCommandHelper.getEnvArgs(projectRoot),
                        envFile: CordovaCommandHelper.getEnvFile(projectRoot),
                    });

                    const execution = new Promise((resolve, reject) => {
                        const process = child_process.exec(commandToExecute, { cwd: projectRoot, env });

                        process.on("error", (err: any) => {
                            // ENOENT error will be thrown if no Cordova.cmd or ionic.cmd is found
                            if (err.code === "ENOENT") {
                                window.showErrorMessage(localize("PackageNotFoundPleaseInstall", "{0} not found, please run \"npm install –g {1}\" to install {2} globally", cliDisplayName, cliDisplayName.toLowerCase(), cliDisplayName));
                            }
                            reject(err);
                        });

                        process.stderr.on("data", (data: any) => {
                            logger.append(data);
                        });

                        process.stdout.on("data", (data: any) => {
                            logger.append(data);
                        });

                        process.stdout.on("close", () => {
                            logger.log(localize("FinishedExecuting", "########### FINISHED EXECUTING: {0} ###########", commandToExecute));
                            resolve({});
                        });
                    });

                    return TelemetryHelper.determineProjectTypes(projectRoot)
                        .then((projectType) => generator.add("projectType", TelemetryHelper.prepareProjectTypesTelemetry(projectType), false))
                        .then(() => execution);
                });
            });
    }