如何在Nx monorepo的nx affected:test命令中排除指定库目录
问题分析
你遇到的核心问题是:lib-b下的assets文件夹内容变更后,npx nx affected:test错误触发了所有项目的测试。这是因为Nx的affected检测逻辑会结合git追踪的文件变更和项目配置中的输入文件来判断哪些项目受影响。即使你配置了.nxignore,如果git仍在追踪assets文件,或者lib-b的测试目标把assets列为输入,Nx还是会标记lib-b为变更,进而触发所有依赖它的项目测试。
解决方案
1. 同步配置.gitignore和.nxignore
Nx的affected检测依赖git的变更记录,如果assets文件夹的文件仍被git追踪,Nx会识别到变更。因此需要同时在.gitignore和.nxignore中添加规则,确保git和Nx都忽略该文件夹的内容:
在两个文件中添加:
libs/lib-b/assets/**
注意:使用
/**可以确保忽略文件夹下的所有子文件和子目录,避免遗漏。
2. 调整lib-b的project.json配置
即使忽略了git追踪,lib-b的测试目标如果默认包含了项目根目录下的所有文件作为输入,仍可能导致Nx误判。需要修改libs/lib-b/project.json,将assets文件夹排除在测试目标的输入范围外:
找到targets.test配置,修改inputs字段:
{ "targets": { "test": { "inputs": [ "default", "^default", "!{projectRoot}/assets/**" ], // 保留原有其他配置(如executor、options等) } } }
default:包含项目默认的输入文件(源码、配置等)^default:包含依赖项目的默认输入!{projectRoot}/assets/**:排除assets文件夹下的所有内容
3. 验证配置生效
执行以下命令查看当前变更是否会触发affected项目:
npx nx print-affected --base=HEAD~1 --head=HEAD
如果输出的affectedProjects为空数组,说明配置生效,此时再执行npx nx affected:test就不会触发任何测试了。
为什么忽略整个lib-b会生效?
当你在.nxignore中写libs/lib-b时,Nx会完全忽略整个lib-b的所有变更,自然不会将其标记为affected项目。但这是粗暴的方式,我们需要更精准地只忽略assets文件夹,上述方案就能实现这个需求。
内容的提问来源于stack exchange,提问作者Timur

