You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置NX仅当指定输出文件不存在时执行对应Target?

解决NX中仅当Output文件不存在时才执行Prepare Target的问题

这个问题其实是NX缓存策略的典型应用场景,我们可以通过两种方式来解决,一种是贴合NX的缓存机制(更推荐),另一种是在脚本层面做条件判断:

方法一:配置NX Prepare Target的Inputs(推荐)

NX的缓存逻辑是基于inputs和outputs来判断是否需要重新执行Target的。默认情况下,如果没有明确设置inputs,NX会把项目的所有源文件都当作输入,这就导致只要修改了任意源文件,NX就会认为Prepare的输入发生了变化,从而重新执行它。

我们可以给Prepare Target指定仅依赖必要的输入(比如生成配置文件所需的环境变量),这样只有当这些输入变化时,NX才会重新执行Prepare;如果输入没变化且firebase.config.json已存在,NX会直接跳过执行,复用已有的输出文件。

修改你的package.json中的NX配置:

{
  ...,
  "nx": {
    "targets": {
      "prepare": {
        "outputs": ["firebase.config.json"],
        "inputs": ["env:FIREBASE_APP_ID_SHOP"]
      },
      "build": {
        "outputs": ["dist"],
        "dependsOn": [
          {
            "target": "prepare",
            "projects": "self"
          }
        ]
      }
    }
  },
  ...
}

这里的env:FIREBASE_APP_ID_SHOP表示Prepare Target仅依赖环境变量FIREBASE_APP_ID_SHOP,只有当这个变量的值变化时,NX才会重新执行Prepare。

方法二:在Prepare脚本中添加条件判断

如果你想快速解决问题,也可以直接在Prepare脚本里加一个文件存在性检查,只有当firebase.config.json不存在时,才执行生成命令:

修改package.json中的scripts配置:

{
  ...,
  "scripts": {
    "prepare": "[ -f firebase.config.json ] || firebase apps:sdkconfig web $FIREBASE_APP_ID_SHOP --json | jq .result.sdkConfig > firebase.config.json",
    "build": "VITE_FIREBASE_CONFIG=$(cat ./firebase.config.json) vite build"
  },
  ...
}

这个shell命令的逻辑很简单:先用[ -f firebase.config.json ]检查文件是否存在,如果不存在(||表示或),才执行后面的生成命令。这样即使NX触发了Prepare脚本,也只会在文件缺失时才真正执行生成操作。

两种方法的结合

你可以同时使用这两种方法,既通过NX的缓存机制避免不必要的执行,又在脚本层面做兜底检查,确保在任何情况下都不会重复生成已存在的配置文件。

内容的提问来源于stack exchange,提问作者zanona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:12:41