求详解部署脚本中检测代码变更并触发构建的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
相关产品推荐
相关产品推荐

