设置 (.npmrc)
pnpm 从命令行、环境变量和 .npmrc
文件中获取其配置。
pnpm config
命令可用于更新和编辑 用户和全局 .npmrc
文件的内容。
四个相关文件分别为:
- 每个项目的配置文件(
/path/to/my/project/.npmrc
) - 每个工作区的配置文件(包含
pnpm-workspace.yaml
文件的目录) - 每位用户的配置文件(
~/.npmrc
) - 全局配置文件(
/etc/npmrc
)
所有 .npmrc
文件都遵循 INI-formatted 列表,包含 key = value
参数。
.npmrc
文件中的值可能包含使用 ${NAME}
语法的环境变量。 也可以使用默认值指定环境变量。 运行 ${NAME-fallback}
,如果 NAME
不存在,命令会输出 fallback
。 ${NAME:-fallback}
,会在 NAME
不存在或为空字符串时返回 fallback
。
依赖提升设置
hoist
- 默认值: true
- 类型: boolean
当为 true
时,所有依赖项都会被提升到 node_modules/.pnpm/node_modules
。 这使得 node_modules
中的所有包都可以访问未列出的依赖项。
hoist-workspace-packages
- 默认值: true
- 类型: boolean
当 true
时,工作区中的包将符号链接到 <workspace_root>/node_modules/.pnpm/node_modules
或 <workspace_root>/node_modules
,具体取决于其他提升设置(hoist-pattern
和 public-hoist-pattern
) 。
hoist-pattern
- 默认值: ['*']
- 类型: string[]
告诉 pnpm 哪些包应该被提升到 node_modules/.pnpm/node_modules
。 默认情况下,所有包都被提升 — 但是,如果你知道只有某些有缺陷的包具有幻影依赖,你可以使用此选项专门提升幻影依赖(推荐做法)。
例如:
hoist-pattern[]=*eslint*
hoist-pattern[]=*babel*
你还可以在模式前面添加 !
来避免提升。
例如:
hoist-pattern[]=*types*
hoist-pattern[]=!@types/react
public-hoist-pattern
- 默认值: []
- 类型: string[]
不同于 hoist-pattern
会把依赖提升到一个虚拟存储中的隐藏的模块目录中,public-hoist-pattern
将匹配的依赖提升至根模块目录中。 提升至根模块目录中意味着应用代码可以访问到幻影依赖,即使它们对解析策略做了不当的修改。
当处理一些不能正确解析依赖关系的有缺陷可插拔工具时,此设置很有用。
例如:
public-hoist-pattern[]=*plugin*
注意:设置 shamefully-hoist
为 true
与设置 public-hoist-pattern
为 *
是一样的。
你还可以在模式前面添加 !
来避免提升。
例如:
public-hoist-pattern[]=*types*
public-hoist-pattern[]=!@types/react
shamefully-hoist
- 默认值: false
- 类型:Boolean
默认情况下,pnpm 创建一个半严格的 node_modules
,这意味着依赖项可以访问未声明的依赖项,但 node_modules
之外的模块不行。 通过这种布局,生态系统中的大多数的包都可以正常工作。 但是,如果某些工具仅在提升的依赖项位于根目录的 node_modules
时才有效,你可以将其设置为 true
来提升它们。
Node 模块设置
modules-dir
- 默认值:node_modules
- 类型:path
将安装依赖项的目录(而不是 node_modules
)。
node-linker
- 默认值:isolated
- 类型: isolated, hoisted, pnp
定义应该使用什么链接器来安装 Node 包。
- isolated - 依赖项从虚拟存储
node_modules/.pnpm
中建立符号链接 - hoisted - 创建一个没有符号链接的扁平的
node_modules
。 与 npm 或 Yarn Classic 创建node_modules
一致。 当使用此设置时,Yarn 的一个库用于提升。 使用此设置的正当理由:- 你的工具无法很好地与符号链接配合使用。 React Native 项目很可能只有在你使用提升的
node_modules
才能工作。 - 你的项目会被部署到 serverless 服务提供商。 一些 serverless 提供商(例如 AWS Lambda)不支持符号链接。 此问题的另一种解决方案是在部署之前打包你的应用程序。
- 如果你想用
"bundledDependencies"
发布你的包。
- 你的工具无法很好地与符号链接配合使用。 React Native 项目很可能只有在你使用提升的