使用 Yarn Workspaces 在 monorepo 中可重复构建 Lambda 层

Repeatable build for Lambda Layers in monorepo with Yarn Workspaces

我有相当大的 monorepo,由 Yarn Workspaces (no Lerna). One of the packages ("workspaces") contains a set of 3rd party NodeJS packages that we use as a shared layer 单独管理我们的 Lambda 函数,在这个包的 package.json 中收集为 dependencies。此包的构建脚本应该将所有依赖项收集在一个 zip 文件中,该文件稍后将由 Terraform 发布。不幸的是,Yarn 无法从 monorepo 构建 single 工作空间,因此我们必须直接使用 NPM。

目前我们做的大致如下-

  1. package.json 复制到 build 文件夹
  2. 运行 npm install --production 在此文件夹中
  3. 压缩生成的 node_modules

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

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

看起来,虽然 Yarn 提升了 对 top-level 工作空间的 node_modules 的所有依赖项,但 you can explicitly opt-out from this behavior 对于某些依赖项 - 或者,在我的例子中,对于给定工作区的 all 依赖项。

之前的 Yarn Workspaces 配置:

"workspaces": [
  "packages/*"
]

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

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

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

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