#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";
}