使用纱线工作区在monorepo中可重复构建Lambda层

问题描述

我有一个很大的monorepo,完全由Yarn Workspaces(没有Lerna)管理。其中一个程序包(“工作区”)包含一组第三方shared layer用作Lambda函数的第三方NodeJS程序包,在此程序包的dependencies中以package.json的形式收集。该软件包的构建脚本应该将所有依赖项收集在一个zip文件中,该文件随后将由terraform发布。不幸的是,Yarn无法从monorepo构建单个工作区,因此我们必须直接使用NPM。

当前,我们大致执行以下操作-

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

这种方法的主要问题(除了混合使用构建工具外)是构建不可重复-每次运行npm install时,我们可能会获得任何相关软件包的较新兼容版本,因为该版本已“锁定” “”由顶级yarn.lock文件中的Yarn组成,而NPM(显然)对此并不了解。

我很确定我们在这条船上并不孤单。有没有更好的方法

解决方法

看来,虽然Yarn 提升到顶层工作空间的node_modules的所有依赖项,you can explicitly opt-out from this behavior却存在某些依赖项-在我的情况下是所有依赖项。

之前的纱线工作区配置:

"workspaces": [
  "packages/*"
]

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

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

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

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