Существует ли кроссплатформенный способ получить имя родительского процесса в Node.js?

#node.js #npm #yarnpkg #pnpm

Вопрос:

Я работаю над инициализатором пакета npm, то есть программой, которая запускается, когда пользователь выполняет npm init <my-package-initializer> команду.

npm-не единственный менеджер пакетов для Node.js в любом случае, пряжа также довольно популярна, и pnpm-мой личный фаворит, и я хочу поддержать всех троих. Самый простой способ-спросить пользователя, какой менеджер пакетов он предпочитает, или предоставить переключатель командной строки, как это делает CRA.

Но пользователь уже показал свои предпочтения, запустив, скажем, yarn create вместо npm init . Это раздражает, когда я спрашиваю снова. Мы могли бы просто проверить yarn , является ли pnpm наш родительский процесс или нет.

Существует ли кросс-платформенный способ получения этой информации?

Ответ №1:

Для будущих гуглеров я использовал следующий фрагмент кода. Я использую его для выбора варианта по умолчанию, но я все равно явно спрашиваю пользователя о предпочтениях менеджера пакетов, лучше перестраховаться, чем сожалеть.

 function getPackageManager() {
    // This environment variable is set by npm and yarn but pnpm seems less consistent
    const agent = process.env.npm_config_user_agent;

    if (!agent) {
        // This environment variable is set on Linux but I'm not sure about other OSes.
        const parent = process.env._;

        if (!parent) {
            // No luck, assume npm
            return "npm";
        }

        if (parent.endsWith("pnpx") || parent.endsWith("pnpm")) return "pnpm";
        if (parent.endsWith("yarn")) return "yarn";

        // Assume npm for anything else
        return "npm";
    }

    const [program] = agent.split("/");

    if (program === "yarn") return "yarn";
    if (program === "pnpm") return "pnpm";

    // Assume npm
    return "npm";
}