node.js - 有没有一种跨平台的方式来获取 Node.js 中父进程的名称?
问题描述
我正在开发一个 npm 包初始化程序,即在用户运行npm init <my-package-initializer>
命令时运行的程序。
npm 不再是 Node.js 的唯一包管理器,yarn 也很受欢迎,pnpm 是我个人的最爱,我想支持这三个。简单的方法是询问用户他们更喜欢哪个包管理器,或者像CRA 一样提供命令行开关。
但是用户已经通过运行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";
}
推荐阅读
- r - 如何从多个 lavaan 模型中提取一个特定系数?
- mongodb - 如何为 Mongoose 连接设置 TLS
- nginx - Nginx代理+CDN
- c++ - 如果可变参数模板中有这样的功能?
- docker - 如何将主机 IP 地址传递给 Docker Compose 文件?
- swagger - 从 JavaDoc 生成 OpenAPI 描述
- sql - SQL:获取某个日历周的所有工作日的值
- java - Spring Application 不会在 MySQL/PostgreSQL 中创建表
- python - http://localhost:9200/_cat/indices?v 为空
- python - Python列表问题:只想获取数据并删除字段的标题