问题描述
我有一个很大的monorepo,完全由Yarn Workspaces(没有Lerna)管理。其中一个程序包(“工作区”)包含一组第三方shared layer用作Lambda函数的第三方NodeJS程序包,在此程序包的dependencies
中以package.json
的形式收集。该软件包的构建脚本应该将所有依赖项收集在一个zip文件中,该文件随后将由terraform发布。不幸的是,Yarn无法从monorepo构建单个工作区,因此我们必须直接使用NPM。
当前,我们大致执行以下操作-
这种方法的主要问题(除了混合使用构建工具外)是构建不可重复-每次运行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
数组应包含工作区名称(在适用时包括名称空间),而不是工作区文件夹。