我有一个使用 npm 工作区的 monorepo,安装后,它看起来像这样:
/
package.json
node_modules/
packages/
lambda/
node_modules/
package.json
package-lock.json
<source code>
cdk-stacks/
node_modules/
package.json
package-lock.json
<source code>
我需要创建一个
.zip
文件,该文件可以作为 Lambda 处理程序上传到 AWS,该文件是根据 ./packages/lambda
中的代码创建的。然而,一些依赖项被提升到顶层node_modules
。
有没有一种方法,除了将文件复制到 monorepo 之外的新目录之外,还可以进行安装,使所有
node_modules
都安装在特定包的根目录下,这样 .zip
存档就不会丢失任何内容依赖关系?
我有同样的问题,很惊讶我找不到答案。这是我如何让它发挥作用的;无可否认,这有点老套(更多内容见下文)。
关键在于 NPM 工作区提升所有依赖项,并且不会创建每个工作区
package-lock.json
或 node_modules/
。此外,当一个包引用另一个包时(例如 lambda
依赖于 cdk-stacks
),NPM 工作区会使用符号链接。以下步骤允许我仅安装该工作区的依赖项,并在准备存档时保留符号链接。
仅为一个工作区安装依赖项
npm ci --production --workspace=packages/lambda
npm ci
是“全新安装”,删除非产品依赖项。仅包含 packages/lambda/package.json
和 root package.json
指定的依赖项;所有其他的都被删除。如果被 cdk-stacks
引用,则可能包括 lambda
;但因为它是一个工作区,所以它将被符号链接。
复制节点模块
cp -RL node_modules packages/lambda/
将
node_modules
复制到 lambda
工作区,我认为这是您要构建的工作区。 -RL
选项确保符号链接被重定向。 NPM 工作区的提升使用符号链接来引用其他工作区包 - 在您的情况下为 cdk-stacks
。由于您要移动目录,因此需要符号链接指向其旧目标 - packages/cdk-stacks/
。
注意:这些选项适用于 Mac,尚未在其他操作系统上尝试过。
创建 Zip 存档
zip -r my-zipfile-name.zip packages/lambdas/
Zip(至少在 Mac 上)将符号链接的目标目录完全复制到存档中。此 Zipfile 可以发布到 S3 并由 lambda 引用。
一般想法/担忧
令我有点惊讶的是,NPM Workspaces 不支持创建开箱即用的可存档包。看起来它相当适合
nom publish
,这不适用于创建 Zip 存档。 lambda 需要 Zip,所以我有点惊讶没有内置更好的工作流程。
请注意,有一些 RFC 用于改进此工作流程。例如: https://github.com/npm/rfcs/issues/287