Node.js中有没有跨平台的方式获取父进程的名称?
Is there a cross-platform way to get the name of the parent process in Node.js?
我正在开发一个 npm 包初始化程序,即当用户运行 npm init <my-package-initializer>
命令时运行的程序。
npm 不再是 Node.js 的唯一包管理器,yarn 也很流行,pnpm 是我个人最喜欢的,我想支持这三个。简单的方法是询问用户他们喜欢哪个包管理器或提供命令行开关,如 CRA does.
但是用户已经通过 运行 显示了他们的偏好,例如 yarn create
而不是 npm init
。感觉烦了再问。我们可以检查 yarn
或 pnpm
是否是我们的父进程。
是否有跨平台的方式来获取这些信息?
对于未来的谷歌员工,我最终使用了以下代码片段。我用它来选择默认选项,但我仍然明确询问用户他们的包管理器偏好,安全总比抱歉好。
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";
}
我正在开发一个 npm 包初始化程序,即当用户运行 npm init <my-package-initializer>
命令时运行的程序。
npm 不再是 Node.js 的唯一包管理器,yarn 也很流行,pnpm 是我个人最喜欢的,我想支持这三个。简单的方法是询问用户他们喜欢哪个包管理器或提供命令行开关,如 CRA does.
但是用户已经通过 运行 显示了他们的偏好,例如 yarn create
而不是 npm init
。感觉烦了再问。我们可以检查 yarn
或 pnpm
是否是我们的父进程。
是否有跨平台的方式来获取这些信息?
对于未来的谷歌员工,我最终使用了以下代码片段。我用它来选择默认选项,但我仍然明确询问用户他们的包管理器偏好,安全总比抱歉好。
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";
}