如何在NX Monorepo中结合自动生成代码配置nx affected的CI流程
NX Monorepo中GraphQL生成文件的CI配置方案与疑问解答
核心疑问解答
1. schema.graphql无变更时的处理逻辑
不管schema是否变更,CI流程中都必须先执行一次codegen命令生成文件——因为CI环境是全新的仓库克隆,本地没有预先生成的文件,不生成的话依赖该文件的组件会直接构建失败。
不过无需担心冗余操作:codegen工具本身会自动对比schema.graphql和已生成文件的内容差异,当schema无变更时,不会修改生成的文件,因此执行命令也不会产生额外的文件变更。
2. 未纳入版本控制的生成文件是否会导致构建失败
会。CI环境没有本地缓存的生成文件,若不在构建依赖组件前执行codegen生成文件,所有依赖data-access的库/应用都会因为找不到生成的TypeScript类型、接口或React Hooks而报错失败。因此这一步是CI流程的必选项。
3. 每次生成文件是否会触发nx affected检测
不会。nx affected是基于文件的哈希值变化来判断项目是否受影响的。当schema.graphql无变更时,codegen生成的文件内容与之前完全一致,文件哈希值不会改变,NX会判定data-access库没有变更,因此不会触发依赖它的组件的重新构建。
具体CI配置步骤
- 安装依赖:在CI环境中执行包管理器的安装命令,比如
pnpm install或npm install - 生成文件:执行
nx run data-access:codegen命令生成TypeScript类型与Hooks(无论schema是否变更都要执行) - 构建受影响项目:执行
nx affected:build --base=HEAD~1,NX会自动检测data-access的文件变更情况,仅当schema变更导致生成文件变化时,才会构建所有依赖的库和应用
额外优化建议
- 在
data-access库的project.json中配置专门的codegen目标,方便CI调用:
{ "targets": { "codegen": { "executor": "@graphql-codegen/cli:generate", "options": { "configFile": "libs/data-access/codegen.ts" } } } }
- 开启NX的远程缓存功能,可以进一步加快
codegen命令的执行速度——当schema无变更时,直接复用缓存的生成结果
内容的提问来源于stack exchange,提问作者Falci
相关产品推荐
相关产品推荐

