#1431·PicGo

[功能]: 优点:完美内置npm方案,用户无需安装nodejs

作者: qiaolin-li创建于 2026年7月23日更新于 2026年7月24日
标签feature request

// The development and production environments use different npm paths: const APPLICATION_NPM_PATH_PREFIX = IS_DEVELOPMENT ? path.join(process.cwd(), 'node_modules/npm/') : path.join(process.resourcesPath, 'node_modules/npm/')

class NpmUtils {

async execCommand(command, args, where) {
    if (!command) {
        throw new Error('command is a must');
    }

    process.argv[0] = '';
    process.argv[1] = 'dist_electron';
    process.argv[2] = command;
    for (let i = 0; i < args.length; i++) {
        process.argv.push(args[i]);
    }

    const Npm = require(`${APPLICATION_NPM_PATH_PREFIX}/lib/npm.js`);

    class MyNpm extends Npm {

        constructor(localPrefix) {
            super();
            this.localPrefix = localPrefix;
        }

        // Ignore setting the title, which may affect the application's title.
        set title(t) {}
    }

    const npm = new MyNpm(where);
    const stdoutWrite = process.stdout.write;
    const stderrWrite = process.stderr.write;

    try {
        process.stdout.write = (...msg) => {
            npm.output(...msg);
        };

        process.stderr.write = (...msg) => {
            npm.outputError(...msg);
        };

        await npm.load();

        // You can set a faster repository.
        npm.config.set('registry', 'https://registry.npmmirror.com/');
        const cmd = npm.argv.shift();
        await npm.exec(cmd, npm.argv);
    } finally {
        process.stdout.write = stdoutWrite;
        process.stderr.write = stderrWrite;
    }

    return npm.message;
}

内容来源: Molunerfinn/PicGo