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

求详解部署脚本中检测代码变更并触发构建的Bash命令逻辑

Bash命令逻辑详解

原命令

(git diff -s --exit-code web/builder/ && test -d web/dist/js -a -d web/dist/css) || npm --prefix=web/builder run build_${SITE}

逐段逻辑拆解

Bash中&&为逻辑与(前序命令执行成功才会执行后续命令),||为逻辑或(前序命令执行失败才会执行后续命令),括号用于将内部命令作为一个整体判断执行结果,整体执行逻辑如下:

1. 括号内第一部分:变更检测命令 git diff -s --exit-code web/builder/

各参数含义:

  • git diff:Git自带的差异对比命令,默认对比工作区与暂存区的内容差异
  • -s:静默模式,关闭所有差异输出,只返回退出码
  • --exit-code:自定义退出码规则,无差异时返回0(执行成功),有差异时返回1(执行失败)
  • web/builder/:指定只检测该目录下的内容变更
    这部分执行成功的唯一条件:当前web/builder目录下没有任何未提交的内容变更

2. 括号内第二部分:产物目录检测命令 test -d web/dist/js -a -d web/dist/css

各参数含义:

  • test:Shell内置的条件判断命令
  • -d 路径:判断指定路径存在且为目录,符合则返回0(成功)
  • -a:逻辑与运算符,要求前后两个判断条件都成立
    这部分执行成功的唯一条件:web/dist/js和web/dist/css两个构建产物目录都已存在

3. 括号整体逻辑

因为两部分用&&连接,只有两部分都执行成功(无变更+产物目录都存在),整个括号的命令组才会返回成功(退出码0),否则返回失败。

4. 后续构建命令 npm --prefix=web/builder run build_${SITE}

  • --prefix=web/builder:指定npm的工作目录为web/builder,无需提前切换目录
  • run build_${SITE}:执行package.json中定义的、前缀为build_+SITE环境变量值的构建脚本,对应不同站点的构建任务

整体执行逻辑总结

  • 只要出现「web/builder目录有变更」或「构建产物目录不存在」任意一种情况,括号组就会返回失败,自动触发对应站点的构建命令
  • 只有同时满足「web/builder目录无变更」和「产物目录都已存在」两个条件,才会跳过构建步骤

常见异常原因

  • 差异对比基准错误:如果部署环境的代码所有变更都已提交到本地仓库,默认git diff只会对比工作区和暂存区,不会对比当前版本和上次构建的版本,会出现有变更但检测不到、不触发构建的问题
  • 环境变量缺失:SITE环境变量未正确赋值,导致npm找不到对应名称的构建脚本
  • 执行路径错误:命令执行时的工作目录不是项目根目录,导致路径判断、git检测、npm执行全部失效
  • 产物目录配置不符:构建输出的js、css目录路径和命令中判断的web/dist/js、web/dist/css不一致,会导致就算构建成功,下次判断仍然不通过,重复触发构建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:04