使用 npm 工作区时如何安装单个包的依赖项?

问题描述 投票:0回答:2

使用 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 的了解还不够,不知道这是否是一个好主意。

要求是:

  1. node_modules
    应仅包含所选包的生产依赖项
  2. 依赖版本应由
    package-lock.json
    确定。
npm npm-install npm-workspaces
2个回答
0
投票

node_modules
server/node_modules
之间的分裂是由于吊装造成的。如果有办法禁用提升,那么
server
的所有依赖项都将安装到
server/node_modules
。但是,当前版本的 npm 不提供禁用工作区提升的方法。

以下问题中有关于添加此类功能的讨论:


-1
投票

我会使用

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

在这种情况下,我建议结合使用

因此从工作区根目录:

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
。这是一个示例存储库,展示了如何组合这些依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.