使用 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。
目前我们做的大致如下-
- 将
package.json
复制到 build
文件夹
- 运行
npm install --production
在此文件夹中
- 压缩生成的
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
数组应包含工作区 名称(包括适用的命名空间)而不是工作区文件夹。
我有相当大的 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。
目前我们做的大致如下-
- 将
package.json
复制到build
文件夹 - 运行
npm install --production
在此文件夹中 - 压缩生成的
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
数组应包含工作区 名称(包括适用的命名空间)而不是工作区文件夹。