<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vercel on 米雞嘻嘻</title><link>https://migi.cc/tags/vercel/</link><description>Recent content in Vercel on 米雞嘻嘻</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Tue, 03 Mar 2026 20:17:00 +0800</lastBuildDate><atom:link href="https://migi.cc/tags/vercel/index.xml" rel="self" type="application/rss+xml"/><item><title>解決 Vercel + Hugo + Git Submodule 部署失敗的問題</title><link>https://migi.cc/p/fix-vercel-hugo-submodule-deploy/</link><pubDate>Tue, 03 Mar 2026 20:17:00 +0800</pubDate><guid>https://migi.cc/p/fix-vercel-hugo-submodule-deploy/</guid><description>&lt;h2 id="問題現象"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e7%8f%be%e8%b1%a1" class="header-anchor"&gt;&lt;/a&gt;問題現象
&lt;/h2&gt;&lt;p&gt;把 Hugo 部落格推到 GitHub 後，Vercel 的 Git 自動部署一直失敗，Dashboard 上全部顯示紅色的 Error。&lt;/p&gt;
&lt;p&gt;但奇怪的是，用 &lt;code&gt;vercel --prod&lt;/code&gt; 手動部署卻完全正常。&lt;/p&gt;
&lt;p&gt;連續好幾次推送都失敗，只有 CLI 手動部署成功。到底怎麼了？&lt;/p&gt;
&lt;h2 id="排查過程"&gt;&lt;a href="#%e6%8e%92%e6%9f%a5%e9%81%8e%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;排查過程
&lt;/h2&gt;&lt;h3 id="第一步確認問題範圍"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e7%a2%ba%e8%aa%8d%e5%95%8f%e9%a1%8c%e7%af%84%e5%9c%8d" class="header-anchor"&gt;&lt;/a&gt;第一步：確認問題範圍
&lt;/h3&gt;&lt;p&gt;先用 CLI 看看所有部署的狀態：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vercel ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;結果一目瞭然：所有 Git 觸發的部署都是 &lt;code&gt;Error&lt;/code&gt;，只有手動的是 &lt;code&gt;Ready&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="第二步嘗試從-cli-查看-build-log"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%98%97%e8%a9%a6%e5%be%9e-cli-%e6%9f%a5%e7%9c%8b-build-log" class="header-anchor"&gt;&lt;/a&gt;第二步：嘗試從 CLI 查看 build log
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vercel inspect &amp;lt;deployment-url&amp;gt; &lt;span class="c1"&gt;# 只顯示 status: Error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vercel logs &amp;lt;deployment-url&amp;gt; &lt;span class="c1"&gt;# 只有 runtime log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CLI 竟然看不到 build 階段的錯誤訊息 😩 這是一個坑——&lt;strong&gt;Vercel CLI 的 logs 指令只顯示 runtime log，不顯示 build log&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="第三步從-dashboard-找到真正的錯誤"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e5%be%9e-dashboard-%e6%89%be%e5%88%b0%e7%9c%9f%e6%ad%a3%e7%9a%84%e9%8c%af%e8%aa%a4" class="header-anchor"&gt;&lt;/a&gt;第三步：從 Dashboard 找到真正的錯誤
&lt;/h3&gt;&lt;p&gt;進入 Vercel Dashboard → Deployments → 點開失敗的部署，終於看到了：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;code&gt;The 'vercel.json' schema validation failed with the following message: 'build' should NOT have additional property 'command'&lt;/code&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;原來是 &lt;strong&gt;&lt;code&gt;vercel.json&lt;/code&gt; 的格式寫錯了&lt;/strong&gt;！&lt;/p&gt;
&lt;h2 id="根本原因"&gt;&lt;a href="#%e6%a0%b9%e6%9c%ac%e5%8e%9f%e5%9b%a0" class="header-anchor"&gt;&lt;/a&gt;根本原因
&lt;/h2&gt;&lt;p&gt;我原本的 &lt;code&gt;vercel.json&lt;/code&gt; 長這樣：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;framework&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo --gc --minify&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;public&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;environment&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;HUGO_VERSION&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.156.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個巢狀的 &lt;code&gt;build&lt;/code&gt; 物件是&lt;strong&gt;舊版格式&lt;/strong&gt;，現代 Vercel 的 schema 已經不接受了。&lt;/p&gt;
&lt;h3 id="為什麼-cli-部署卻成功"&gt;&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc-cli-%e9%83%a8%e7%bd%b2%e5%8d%bb%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;為什麼 CLI 部署卻成功？
&lt;/h3&gt;&lt;p&gt;因為 &lt;code&gt;vercel --prod&lt;/code&gt; 走的是「上傳檔案 → 建置」的流程，它的解析邏輯和 Git 觸發部署用的 schema validation 不完全一樣，所以 CLI 繞過了驗證錯誤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;這也是最容易中招的地方&lt;/strong&gt;：你會以為設定沒問題（CLI 都成功了啊），但實際上是 CLI 比較寬容。&lt;/p&gt;
&lt;h2 id="解決方法"&gt;&lt;a href="#%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解決方法
&lt;/h2&gt;&lt;h3 id="1-修正-verceljson"&gt;&lt;a href="#1-%e4%bf%ae%e6%ad%a3-verceljson" class="header-anchor"&gt;&lt;/a&gt;1. 修正 vercel.json
&lt;/h3&gt;&lt;p&gt;用頂層屬性取代巢狀物件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;framework&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;buildCommand&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo --gc --minify&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;outputDirectory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;public&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;installCommand&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;git submodule update --init --recursive&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;重點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;build.command&lt;/code&gt; → &lt;code&gt;buildCommand&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build.output&lt;/code&gt; → &lt;code&gt;outputDirectory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;installCommand&lt;/code&gt; 處理 Git Submodule&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-環境變數改用-cli-設定"&gt;&lt;a href="#2-%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8%e6%94%b9%e7%94%a8-cli-%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. 環境變數改用 CLI 設定
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vercel env add HUGO_VERSION production
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 輸入 0.156.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;把 Hugo 版本從 &lt;code&gt;vercel.json&lt;/code&gt; 移到 Vercel 的環境變數管理，更乾淨也更安全。&lt;/p&gt;
&lt;h3 id="3-推送驗證"&gt;&lt;a href="#3-%e6%8e%a8%e9%80%81%e9%a9%97%e8%ad%89" class="header-anchor"&gt;&lt;/a&gt;3. 推送驗證
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這次 Git 觸發的自動部署終於成功了！✅&lt;/p&gt;
&lt;h2 id="關於-git-submodule"&gt;&lt;a href="#%e9%97%9c%e6%96%bc-git-submodule" class="header-anchor"&gt;&lt;/a&gt;關於 Git Submodule
&lt;/h2&gt;&lt;p&gt;如果你的 Hugo 主題是用 Git Submodule 管理的（像大多數 Hugo 教學建議的），Vercel 在 clone 你的 repo 時&lt;strong&gt;預設不會初始化 submodule&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以一定要在 &lt;code&gt;vercel.json&lt;/code&gt; 裡加上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;installCommand&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;git submodule update --init --recursive&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;沒加的話，Hugo 會找不到主題而 build 失敗。&lt;/p&gt;
&lt;h2 id="重點整理"&gt;&lt;a href="#%e9%87%8d%e9%bb%9e%e6%95%b4%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;重點整理
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;踩到的坑&lt;/th&gt;
 &lt;th&gt;正確做法&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;build.command&lt;/code&gt; 巢狀寫法&lt;/td&gt;
 &lt;td&gt;用頂層 &lt;code&gt;buildCommand&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;build.output&lt;/code&gt; 巢狀寫法&lt;/td&gt;
 &lt;td&gt;用頂層 &lt;code&gt;outputDirectory&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CLI 成功 ≠ 設定正確&lt;/td&gt;
 &lt;td&gt;要看 Git 觸發的部署結果&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CLI &lt;code&gt;vercel logs&lt;/code&gt; 看不到 build 錯誤&lt;/td&gt;
 &lt;td&gt;去 Dashboard 看部署詳情&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Submodule 沒被 init&lt;/td&gt;
 &lt;td&gt;加 &lt;code&gt;installCommand&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;環境變數寫在 json 裡&lt;/td&gt;
 &lt;td&gt;改用 &lt;code&gt;vercel env&lt;/code&gt; 管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;希望這篇能幫到同樣踩坑的人 🕳️&lt;/p&gt;</description></item></channel></rss>