使用 npm 工作区 我有一个像这样的文件夹结构
+-- package.json
+-- package-lock.json
+-- client
| `-- package.json
+-- shared
| `-- package.json
`-- server
`-- package.json
通常,在为 Nodejs 应用程序创建生产构建时,我会运行
npm ci --only=production
,然后将 node_modules
复制到构建工件中。我不确定在使用工作区时如何做类似的事情。
如果我运行
npm ci --only=production --workspace server
,它会将依赖关系拆分到 ./node_modules
和 ./server/node_modules
之间。也许我应该将两个node_modules
复制(合并?)到构建工件中?
另一种选择是将
./package-lock.json
和 ./server/package.json
复制到新目录中并运行 npm ci --only=production
。它似乎确实有效,但我对 npm 的了解还不够,不知道这是否是一个好主意。
要求是:
node_modules
应仅包含所选包的生产依赖项package-lock.json
确定。node_modules
和server/node_modules
之间的分裂是由于吊装造成的。如果有办法禁用提升,那么 server
的所有依赖项都将安装到 server/node_modules
。但是,当前版本的 npm 不提供禁用工作区提升的方法。
以下问题中有关于添加此类功能的讨论:
install
配置选项的组合。
这里使用 Node v18.16.0 和 npm v9.7.2 是
npm install --help
的输出(需要 npm >= v9.7.2 才能正确省略开发依赖项):
$ npm install --help
Install a package
Usage:
npm install [<package-spec> ...]
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global]
[--install-strategy <hoisted|nested|shallow|linked>] [--legacy-bundling]
[--global-style] [--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]]
[--strict-peer-deps] [--no-package-lock] [--foreground-scripts]
[--ignore-scripts] [--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
[-ws|--workspaces] [--include-workspace-root] [--install-links]
aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall
Run "npm help install" for more info
在这种情况下,我建议结合使用
install-strategy
(nested
)omit
(dev
)workspace
(server
)因此从工作区根目录:
npm install --install-strategy=nested --omit=dev --workspace=server
您可能需要也可能不需要
-install-strategy
。
这应该在工作区的根目录中留下一个
node_modules
目录,仅包含 server
工作区的 package.json 文件中定义的依赖项,并省略 devDependencies
中定义的依赖项。您还可以 --omit=peer
从 peerDependencies
工作区中删除 server
。
注意:根据您的依赖关系图,这仍然可能会留下多个
node_modules
目录,需要组合起来才能创建工件,即 --install-strategy=nested
似乎无法在 npm 工作空间中正常工作。但是,已安装的 deps 应正确隔离到传入的工作区 --workspace
。这是一个示例存储库,展示了如何组合这些依赖项。