function installAndRun()

in common/scripts/install-run.js [391:437]


function installAndRun(packageName, packageVersion, packageBinName, packageBinArgs) {
    const rushJsonFolder = findRushJsonFolder();
    const rushCommonFolder = path.join(rushJsonFolder, 'common');
    const rushTempFolder = _getRushTempFolder(rushCommonFolder);
    const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`);
    if (!_isPackageAlreadyInstalled(packageInstallFolder)) {
        // The package isn't already installed
        _cleanInstallFolder(rushTempFolder, packageInstallFolder);
        const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');
        _syncNpmrc(sourceNpmrcFolder, packageInstallFolder);
        _createPackageJson(packageInstallFolder, packageName, packageVersion);
        _installPackage(packageInstallFolder, packageName, packageVersion);
        _writeFlagFile(packageInstallFolder);
    }
    const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`;
    const statusMessageLine = new Array(statusMessage.length + 1).join('-');
    console.log(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL);
    const binPath = _getBinPath(packageInstallFolder, packageBinName);
    const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');
    // Windows environment variables are case-insensitive.  Instead of using SpawnSyncOptions.env, we need to
    // assign via the process.env proxy to ensure that we append to the right PATH key.
    const originalEnvPath = process.env.PATH || '';
    let result;
    try {
        // Node.js on Windows can not spawn a file when the path has a space on it
        // unless the path gets wrapped in a cmd friendly way and shell mode is used
        const shouldUseShell = binPath.includes(' ') && os.platform() === 'win32';
        const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath;
        process.env.PATH = [binFolderPath, originalEnvPath].join(path.delimiter);
        result = childProcess.spawnSync(platformBinPath, packageBinArgs, {
            stdio: 'inherit',
            windowsVerbatimArguments: false,
            shell: shouldUseShell,
            cwd: process.cwd(),
            env: process.env
        });
    }
    finally {
        process.env.PATH = originalEnvPath;
    }
    if (result.status !== null) {
        return result.status;
    }
    else {
        throw result.error || new Error('An unknown error occurred.');
    }
}