NX无法使用缓存运行根级别prettier脚本问题求助
解决NX Monorepo根级别Prettier脚本缓存配置报错问题
错误原因
运行nx prettier时报错Error: Both project and target have to be specified,是因为NX的nx <target>命令默认要求指定具体项目,你目前仅在nx.json的targetDefaults里定义了prettier的默认配置,没有明确指定执行该目标的项目,也未采用NX支持的根级任务执行方式。
直接跑pnpm prettier能成功,是因为这是直接调用Prettier CLI,完全绕开了NX的任务调度系统,自然不需要指定项目,但也无法利用NX的缓存功能。
可行解决方案
方案1:用nx run-many执行所有项目的Prettier检查
修改package.json里的脚本:
"prettier:nx": "nx run-many --target=prettier --all"
这个命令会遍历仓库内所有项目,执行每个项目的prettier目标(基于nx.json的targetDefaults配置自动继承),同时自动启用NX缓存。
方案2:配置根级项目的Prettier任务
若想直接在根目录执行整个仓库的Prettier检查,需在根目录创建project.json(未存在的话),添加根级任务配置:
{ "name": "root", "targets": { "prettier": { "executor": "nx:run-commands", "options": { "command": "prettier --check **/*.{ts,js,cjs,json,yaml}" }, "inputs": ["**/*.{ts,js,cjs,json,yaml}"], "outputs": [] } } }
再修改package.json的脚本:
"prettier:nx": "nx prettier root"
运行pnpm prettier:nx即可执行根项目的prettier任务,同时利用NX缓存。
方案3:用nx exec直接执行命令并启用缓存
最简单的方式是用nx exec包裹Prettier命令,让NX接管缓存逻辑:
"prettier:nx": "nx exec -- prettier --check **/*.{ts,js,cjs,json,yaml}"
这种方式无需额外配置项目或目标,NX会根据nx.json里cacheableOperations中的prettier配置自动处理缓存,效果和直接跑Prettier一致,但能享受到NX的缓存功能。
内容的提问来源于stack exchange,提问作者Tal Rofe
相关产品推荐
相关产品推荐

