NPM 工作区将包安装到工作区/node_modules 中

Sen*_*eep 6 npm

我已配置并运行工作区。

当我从根目录安装时,有时包会安装在根目录中,有时会安装在工作区node_modules中。

NPM 何时以及如何选择在 root/node_modules 与工作空间/node_modules 安装包?

Gez*_*zim 2

事实证明,当两个包依赖于依赖项中具有兼容版本号的同一模块时,npm(带有工作区)将root/node_modules. 否则,它将安装在node_modules软件包中。

\n

在此示例中,react-dom包之间共享相同的版本:

\n
customer-ui@1.0.0 /home/ubuntu/name/customer-ui\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac components@0.15.0 -> ./packages/components\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac react-cosmos@5.7.2\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac react-cosmos-shared2@5.7.1\n\xe2\x94\x82 \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac react-element-to-jsx-string@14.3.4\n\xe2\x94\x82 \xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2 deduped\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac react-modal@3.15.1\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2 deduped\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac react-to-print@2.14.7\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2 deduped\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac styled-components@5.3.5\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2 deduped\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\xac embedded@0.1.0 -> ./packages/embedded\n  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 react-dom@17.0.2 deduped\n
Run Code Online (Sandbox Code Playgroud)\n

npm 仅将其安装在root/node_modules目录中:

\n
\xe2\x9d\xaf ls node_modules/react-dom\nLICENSE    build-info.json  index.js      profiling.js       server.js       test-utils.js\nREADME.md  cjs              package.json  server.browser.js  server.node.js  umd\n\n\xe2\x9d\xaf ls packages/embedded/node_modules/react-dom\nls: cannot access 'packages/embedded/node_modules/react-dom': No such file or directory\n\n\xe2\x9d\xaf ls packages/components/node_modules/react-dom\nls: cannot access 'packages/components/node_modules/react-dom': No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n

但是,对于包之间版本不兼容的包,情况有所不同:

\n
\xe2\x9d\xaf npm ls argparse\ncustomer-ui@1.0.0 /home/ubuntu/name/customer-ui\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac @components@0.15.0 -> ./packages/components\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac eslint@8.17.0\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@4.1.0\n\xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@2.0.1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\xac embedded@0.1.0 -> ./packages/embedded\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac eslint@6.8.0\n  \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@3.14.1\n  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@1.0.10\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac jest-preset-preact@4.0.5\n  \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac babel-jest@27.5.1\n  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac babel-plugin-istanbul@6.1.1\n  \xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac @istanbuljs/load-nyc-config@1.1.0\n  \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@3.14.1\n  \xe2\x94\x82         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@1.0.10\n  \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac microbundle@0.12.4\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac cssnano@4.1.11\n    \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\xac cosmiconfig@5.2.1\n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@3.14.1\n    \xe2\x94\x82 \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@1.0.10\n    \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac cssnano-preset-default@4.0.8\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac postcss-svgo@4.0.3\n    \xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac svgo@1.3.2\n    \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@3.14.1\n    \xe2\x94\x82         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@1.0.10\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac rollup-plugin-postcss@2.9.0\n      \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac postcss-load-config@2.1.2\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac cosmiconfig@5.2.1\n          \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac js-yaml@3.14.1\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 argparse@1.0.10\n
Run Code Online (Sandbox Code Playgroud)\n

embedded包要求argparse@1.0.10embedded要求argparse@2.0.1

\n

对于这些,npm 将它们安装在多个位置:

\n
\xe2\x9d\xaf ls node_modules/argparse\nCHANGELOG.md  LICENSE  README.md  argparse.js  lib  package.json\n\n\xe2\x9d\xaf ls packages/components/argparse\nls: cannot access 'packages/components/argparse': No such file or directory\n\n\xe2\x9d\xaf ls packages/embedded/node_modules/argparse\nCHANGELOG.md  LICENSE  README.md  index.js  lib  package.json\n
Run Code Online (Sandbox Code Playgroud)\n

如果有帮助的话,这是一个片段root/package.json

\n
{\n  "name": "customer-ui",\n  "version": "1.0.0",\n  "workspaces": [\n    "packages/*"\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

感谢@Stf_F 在上面的评论中回答这个问题。

\n

  • 除了版本号之外,有没有办法强制它位于本地而不是工作区? (2认同)