1

我有相当大的 monorepo,完全由Yarn Workspaces(没有 Lerna)管理。其中一个包(“工作区”)包含一组第 3 方 NodeJS 包,我们将它们用作Lambda 函数的共享层dependencies,在package.json此包中收集。该包的构建脚本应该将所有依赖项收集到一个 zip 文件中,该文件稍后将由 Terraform 发布。不幸的是,Yarn 无法从 monorepo 构建单个工作区,因此我们必须直接使用 NPM。

目前我们大致做了以下工作——

  1. 复制package.jsonbuild文件夹
  2. npm install --production在这个文件夹中运行
  3. 压缩生成的node_modules

我对这种方法的主要问题(除了混合构建工具)是构建不可重复 - 每次我们运行时,npm install我们可能会获得任何依赖包的更新兼容版本,因为该版本被 Yarn 在顶层“锁定”yarn.lock文件和 NPM(显然)不知道它。

我很确定我们并不孤单。有没有更好的方法可用?

4

1 回答 1

2

看起来,虽然 Yarn将所有依赖项提升node_modules到顶级工作区的 ,但您可以为某些依赖项显式选择退出此行为- 或者在我的情况下,对于给定工作区的所有依赖项。

之前的 Yarn Workspaces 配置:

"workspaces": [
  "packages/*"
]

更改后的 Yarn Workspaces 配置,假设 Lambda 层依赖项收集在common-lambda工作空间下:

"workspaces": {
  "packages": [
    "packages/*"
  ],
  "nohoist": [
    "common-lambda/**"
  ]
}

在此更改之后,packages/common-lambda/node_modules将包含要打包为 Lambda 层的所有依赖项的正确版本。

请注意,nohoist数组应包含工作区名称(包括适用的命名空间)而不是工作区文件夹。

于 2020-08-21T18:51:23.317 回答