首页 > 解决方案 > 有没有一种跨平台的方式来获取 Node.js 中父进程的名称?

问题描述

我正在开发一个 npm 包初始化程序,即在用户运行npm init <my-package-initializer>命令时运行的程序。

npm 不再是 Node.js 的唯一包管理器,yarn 也很受欢迎,pnpm 是我个人的最爱,我想支持这三个。简单的方法是询问用户他们更喜欢哪个包管理器,或者像CRA 一样提供命令行开关。

但是用户已经通过运行yarn create而不是npm init. 再问就觉得烦。我们可以检查是否yarn或者pnpm是我们的父进程。

是否有跨平台的方式来获取这些信息?

标签: node.jsnpmyarnpkgpnpm

解决方案


对于未来的谷歌人,我最终使用了以下代码段。我用它来选择默认选项,但我仍然明确询问用户他们的包管理器偏好,比抱歉更安全。

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

推荐阅读