我们在大多数项目中都使用
npm
,除了一个私有模块,我们使用 yarn
来全局管理其他项目中依赖项的版本,这仅仅是因为 npm 没有“足够”地扁平化存储库(不完全像经典纱线那样)。
这是 npm 中的 node_modules 示例:
% npm list ajv
[email protected] /home/me/git/example
└─┬ [email protected]
└─┬ [email protected]
└─┬ [email protected]
└── [email protected]
现在看看纱线的结构:
% npm list ajv
[email protected] /home/me/git/example
├─┬ [email protected]
│ └─┬ [email protected]
│ └─┬ [email protected]
│ └── [email protected]
├── [email protected] extraneous
└─┬ [email protected] extraneous
└── [email protected] deduped
注意,yarn 愉快地将所有部门移动到根级别。
如果没有扁平化的文件结构,npx 中断和其他子模块只有在传递完整路径以在 node_modules 目录中查找它们时才能访问。
我们尝试过的事情:
npm install --legacy-peer-deps
npm install --prefer-dedupe
npm dedupe
npm install --install-strategy=hoisted
、嵌套、浅层或链接"flat": true
添加到 package.json为了保持一致性,我们想改用 npm,但我们无法使用 npm 获得正确的参数组合来获得与yarn classic相同的结果。
如果您的项目需要直接访问 npx 的某些可执行脚本,那么您的项目应该将该依赖项列为其自己的直接依赖项,而不是依赖它作为子依赖项安装。
这主要是设计使然。正如您所注意到的,依赖于
node_modules
中的特定目录结构是脆弱的。你必须让 npm
来管理这件事。