<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Aur on Tarragon</title><link>https://tarrragon.github.io/blog/tags/aur/</link><description>Recent content in Aur on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 03 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/aur/index.xml" rel="self" type="application/rss+xml"/><item><title>AUR 建置失敗的分層判讀</title><link>https://tarrragon.github.io/blog/linux/debug/aur-build-failure-triage/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/debug/aur-build-failure-triage/</guid><description>&lt;p>&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/aur/" data-link-title="AUR（Arch User Repository）" data-link-desc="教材裡叫你 paru -S 某個套件、或說某工具「官方 repo 沒有、要走 AUR」、想搞懂 AUR 是什麼、跟官方 repo 差在哪、build-from-source 的代價時讀">AUR&lt;/a> 套件的安裝是在本機從原始碼編譯，這讓它的失敗面比官方 repo 套件多出一整層：官方套件的失敗集中在「抓不抓得到」（網路、資料庫、簽章，見 &lt;a href="../../install/package-and-network-troubleshooting/">安裝期套件與網路故障排除&lt;/a>），AUR 套件在抓到之後還要在你的機器上 build 成功——編譯環境、函式庫版本、架構宣告都可能讓它斷在半路。本篇把一輪 ARM VM 實測踩到的建置失敗分層整理成判讀路由：每一層有不同的權威檢查，判對層就能避免「build 失敗就懷疑軟體不支援這平台」這種昂貴的誤判。&lt;/p>
&lt;h2 id="先排資源層build-中斷優先查磁碟">先排資源層：build 中斷優先查磁碟&lt;/h2>
&lt;p>一次大型編譯（上百步的 C++ 專案）停在中途，最廉價也最常見的解釋是資源耗盡。實測案例：一次 build 停在第 120/227 步，同一份原始碼在清出磁碟空間後接著編就過——中斷的根因是宿主磁碟寫滿，跟 aarch64 相容性完全無關。&lt;code>df -h&lt;/code> 加 &lt;code>free&lt;/code> 是 build 中斷後的第一組檢查，先排除掉廉價解釋再往下懷疑，完整的判讀紀律見 &lt;a href="../diagnosis-read-authoritative-state/">診斷心法&lt;/a>。&lt;/p>
&lt;h2 id="型態一預編二進位的版本半衰期-bin-套件">型態一：預編二進位的版本半衰期（&lt;code>-bin&lt;/code> 套件）&lt;/h2>
&lt;p>AUR 的 &lt;code>-bin&lt;/code> 套件是別人在某個時間點編好的二進位，它對「當時的系統函式庫」連結。rolling 發行版的函式庫 soname 輪替快，一次 &lt;code>pacman -Syu&lt;/code> 之後，預編二進位依賴的舊版函式庫可能已經被換掉——二進位還在、但載入直接失敗。實測案例：&lt;code>paru-bin&lt;/code> 的 aarch64 二進位連結 &lt;code>libalpm.so.15&lt;/code>，系統升級後 libalpm 已是 &lt;code>.so.16&lt;/code>，helper 自己就起不來。&lt;/p>
&lt;p>判讀訊號是 &lt;code>error while loading shared libraries: libxxx.so.N: cannot open shared object file&lt;/code>——注意這是「工具自己壞了」，跟它要裝的套件無關。兩條修法對應不同取捨：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>改用原始碼建置的 helper&lt;/strong>：&lt;code>yay&lt;/code> 從 AUR 以 makepkg 建置（Go 專案、編譯快），建置當下就對系統現有的 libalpm 連結，對這類 soname 漂移免疫。長期用 rolling 發行版時這條比較划算。&lt;/li>
&lt;li>&lt;strong>重建 &lt;code>-bin&lt;/code> 包&lt;/strong>：重跑一次該 &lt;code>-bin&lt;/code> 套件的安裝讓它抓新版二進位。前提是上游已經對新 soname 重新發布，時效上受制於維護者。&lt;/li>
&lt;/ul>
&lt;p>這條機制對所有 &lt;code>-bin&lt;/code> 後綴的 AUR 套件成立：&lt;code>-bin&lt;/code> 換到的是「省編譯時間」，付出的是「跟系統函式庫版本綁定的半衰期」。系統更新頻繁、或架構冷門（上游重發慢）時，半衰期會明顯縮短。&lt;/p>
&lt;h2 id="型態二建置設定烤入發行版套件makepkgconf-管不到的路徑">型態二：建置設定烤入發行版套件（&lt;code>makepkg.conf&lt;/code> 管不到的路徑）&lt;/h2>
&lt;p>編譯期叫到一個不存在的工具時，直覺是去 &lt;code>/etc/makepkg.conf&lt;/code> 找設定，但有一類路徑是&lt;strong>烤入發行版套件本身&lt;/strong>的：發行版建置自家套件時使用的工具鏈路徑，被序列化進了套件的建置中繼資料，之後所有透過該套件觸發的編譯都會沿用。實測案例：Arch Linux ARM 官方的 python 套件是用 distcc（分散式編譯）建的，&lt;code>CXX=/usr/lib/distcc/bin/g++&lt;/code> 被烤進 python 的 sysconfig；本機編任何 Python C++ extension（AUR 的 &lt;code>python-materialyoucolor&lt;/code>）都會去叫這個不存在的路徑，而 &lt;code>makepkg.conf&lt;/code> 的 &lt;code>!distcc&lt;/code> 完全管不到它——那個設定管的是 makepkg 自己的行為，管不了 python 轉手發起的編譯。&lt;/p>
&lt;p>權威判讀是直接問那個工具鏈自己記了什麼：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">python -c &lt;span class="s2">&amp;#34;import sysconfig; print(sysconfig.get_config_var(&amp;#39;CXX&amp;#39;))&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># /usr/lib/distcc/bin/g++ ← 烤入的路徑，不是 makepkg.conf 給的&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修法是在建置指令前用環境變數覆寫：&lt;code>CXX=g++ paru -S &amp;lt;套件&amp;gt;&lt;/code>。這層的通用判讀：&lt;strong>編譯叫錯工具時，先查路徑是誰給的&lt;/strong>——makepkg 設定、環境變數、還是烤入語言 runtime 的建置中繼資料，三個來源的修法各不相同。&lt;/p>
&lt;h2 id="型態三pkgbuild-架構宣告缺失">型態三：PKGBUILD 架構宣告缺失&lt;/h2>
&lt;p>makepkg 建置前會比對 PKGBUILD 的 &lt;code>arch&lt;/code> 陣列跟當前機器架構，沒列就拒建。這是 metadata 層的宣告缺失，跟「軟體真的不支援這個架構」是兩件事——很多 AUR 維護者只在 x86_64 測過、就只宣告 x86_64，程式本身可能完全可移植。判讀訊號是錯誤訊息明講架構不在清單（&lt;code>doesn't support the 'aarch64' architecture&lt;/code>），此時用 &lt;code>--mflags &amp;quot;-A&amp;quot;&lt;/code>（傳 &lt;code>--ignorearch&lt;/code> 給 makepkg）繞過宣告、讓它實際嘗試編譯：編得過且跑得動，就是純宣告缺失（值得回報維護者補宣告）；編譯在架構相關的程式碼上真的失敗，才是存在性層的問題——這條跟「工具打包了、依賴的專有二進位沒有這個架構」的判讀合流，見 &lt;a href="../../install/platform-divergence-map/">平台與發行版差異的判讀地圖&lt;/a> 的套件存在性段。&lt;/p>
&lt;h2 id="建置成功之後-git-版本與既有套件的衝突">建置成功之後：&lt;code>-git&lt;/code> 版本與既有套件的衝突&lt;/h2>
&lt;p>AUR 鏈還有一類失敗發生在建置成功、安裝階段：PKGBUILD 把依賴指名到 &lt;code>-git&lt;/code> 開發版（例如 depends 列 &lt;code>quickshell-git&lt;/code>），跟系統已裝的官方 repo 穩定版同名衝突。互動模式下 helper 會問你要不要移除舊版；&lt;code>--noconfirm&lt;/code> 的非互動流程則直接失敗、且已建好的包留在快取裡。修法是手動換裝：&lt;code>pacman -R &amp;lt;穩定版&amp;gt;&lt;/code> 再 &lt;code>pacman -U &amp;lt;快取裡建好的包&amp;gt;&lt;/code>。自動化腳本要把「AUR 依賴可能指名 &lt;code>-git&lt;/code> 版」納入預期，先查 PKGBUILD 的 depends 再決定要不要預先移除穩定版。&lt;/p></description><content:encoded><![CDATA[<p><a href="/blog/linux/dotfile/knowledge-cards/aur/" data-link-title="AUR（Arch User Repository）" data-link-desc="教材裡叫你 paru -S 某個套件、或說某工具「官方 repo 沒有、要走 AUR」、想搞懂 AUR 是什麼、跟官方 repo 差在哪、build-from-source 的代價時讀">AUR</a> 套件的安裝是在本機從原始碼編譯，這讓它的失敗面比官方 repo 套件多出一整層：官方套件的失敗集中在「抓不抓得到」（網路、資料庫、簽章，見 <a href="../../install/package-and-network-troubleshooting/">安裝期套件與網路故障排除</a>），AUR 套件在抓到之後還要在你的機器上 build 成功——編譯環境、函式庫版本、架構宣告都可能讓它斷在半路。本篇把一輪 ARM VM 實測踩到的建置失敗分層整理成判讀路由：每一層有不同的權威檢查，判對層就能避免「build 失敗就懷疑軟體不支援這平台」這種昂貴的誤判。</p>
<h2 id="先排資源層build-中斷優先查磁碟">先排資源層：build 中斷優先查磁碟</h2>
<p>一次大型編譯（上百步的 C++ 專案）停在中途，最廉價也最常見的解釋是資源耗盡。實測案例：一次 build 停在第 120/227 步，同一份原始碼在清出磁碟空間後接著編就過——中斷的根因是宿主磁碟寫滿，跟 aarch64 相容性完全無關。<code>df -h</code> 加 <code>free</code> 是 build 中斷後的第一組檢查，先排除掉廉價解釋再往下懷疑，完整的判讀紀律見 <a href="../diagnosis-read-authoritative-state/">診斷心法</a>。</p>
<h2 id="型態一預編二進位的版本半衰期-bin-套件">型態一：預編二進位的版本半衰期（<code>-bin</code> 套件）</h2>
<p>AUR 的 <code>-bin</code> 套件是別人在某個時間點編好的二進位，它對「當時的系統函式庫」連結。rolling 發行版的函式庫 soname 輪替快，一次 <code>pacman -Syu</code> 之後，預編二進位依賴的舊版函式庫可能已經被換掉——二進位還在、但載入直接失敗。實測案例：<code>paru-bin</code> 的 aarch64 二進位連結 <code>libalpm.so.15</code>，系統升級後 libalpm 已是 <code>.so.16</code>，helper 自己就起不來。</p>
<p>判讀訊號是 <code>error while loading shared libraries: libxxx.so.N: cannot open shared object file</code>——注意這是「工具自己壞了」，跟它要裝的套件無關。兩條修法對應不同取捨：</p>
<ul>
<li><strong>改用原始碼建置的 helper</strong>：<code>yay</code> 從 AUR 以 makepkg 建置（Go 專案、編譯快），建置當下就對系統現有的 libalpm 連結，對這類 soname 漂移免疫。長期用 rolling 發行版時這條比較划算。</li>
<li><strong>重建 <code>-bin</code> 包</strong>：重跑一次該 <code>-bin</code> 套件的安裝讓它抓新版二進位。前提是上游已經對新 soname 重新發布，時效上受制於維護者。</li>
</ul>
<p>這條機制對所有 <code>-bin</code> 後綴的 AUR 套件成立：<code>-bin</code> 換到的是「省編譯時間」，付出的是「跟系統函式庫版本綁定的半衰期」。系統更新頻繁、或架構冷門（上游重發慢）時，半衰期會明顯縮短。</p>
<h2 id="型態二建置設定烤入發行版套件makepkgconf-管不到的路徑">型態二：建置設定烤入發行版套件（<code>makepkg.conf</code> 管不到的路徑）</h2>
<p>編譯期叫到一個不存在的工具時，直覺是去 <code>/etc/makepkg.conf</code> 找設定，但有一類路徑是<strong>烤入發行版套件本身</strong>的：發行版建置自家套件時使用的工具鏈路徑，被序列化進了套件的建置中繼資料，之後所有透過該套件觸發的編譯都會沿用。實測案例：Arch Linux ARM 官方的 python 套件是用 distcc（分散式編譯）建的，<code>CXX=/usr/lib/distcc/bin/g++</code> 被烤進 python 的 sysconfig；本機編任何 Python C++ extension（AUR 的 <code>python-materialyoucolor</code>）都會去叫這個不存在的路徑，而 <code>makepkg.conf</code> 的 <code>!distcc</code> 完全管不到它——那個設定管的是 makepkg 自己的行為，管不了 python 轉手發起的編譯。</p>
<p>權威判讀是直接問那個工具鏈自己記了什麼：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">python -c <span class="s2">&#34;import sysconfig; print(sysconfig.get_config_var(&#39;CXX&#39;))&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># /usr/lib/distcc/bin/g++  ← 烤入的路徑，不是 makepkg.conf 給的</span></span></span></code></pre></div><p>修法是在建置指令前用環境變數覆寫：<code>CXX=g++ paru -S &lt;套件&gt;</code>。這層的通用判讀：<strong>編譯叫錯工具時，先查路徑是誰給的</strong>——makepkg 設定、環境變數、還是烤入語言 runtime 的建置中繼資料，三個來源的修法各不相同。</p>
<h2 id="型態三pkgbuild-架構宣告缺失">型態三：PKGBUILD 架構宣告缺失</h2>
<p>makepkg 建置前會比對 PKGBUILD 的 <code>arch</code> 陣列跟當前機器架構，沒列就拒建。這是 metadata 層的宣告缺失，跟「軟體真的不支援這個架構」是兩件事——很多 AUR 維護者只在 x86_64 測過、就只宣告 x86_64，程式本身可能完全可移植。判讀訊號是錯誤訊息明講架構不在清單（<code>doesn't support the 'aarch64' architecture</code>），此時用 <code>--mflags &quot;-A&quot;</code>（傳 <code>--ignorearch</code> 給 makepkg）繞過宣告、讓它實際嘗試編譯：編得過且跑得動，就是純宣告缺失（值得回報維護者補宣告）；編譯在架構相關的程式碼上真的失敗，才是存在性層的問題——這條跟「工具打包了、依賴的專有二進位沒有這個架構」的判讀合流，見 <a href="../../install/platform-divergence-map/">平台與發行版差異的判讀地圖</a> 的套件存在性段。</p>
<h2 id="建置成功之後-git-版本與既有套件的衝突">建置成功之後：<code>-git</code> 版本與既有套件的衝突</h2>
<p>AUR 鏈還有一類失敗發生在建置成功、安裝階段：PKGBUILD 把依賴指名到 <code>-git</code> 開發版（例如 depends 列 <code>quickshell-git</code>），跟系統已裝的官方 repo 穩定版同名衝突。互動模式下 helper 會問你要不要移除舊版；<code>--noconfirm</code> 的非互動流程則直接失敗、且已建好的包留在快取裡。修法是手動換裝：<code>pacman -R &lt;穩定版&gt;</code> 再 <code>pacman -U &lt;快取裡建好的包&gt;</code>。自動化腳本要把「AUR 依賴可能指名 <code>-git</code> 版」納入預期，先查 PKGBUILD 的 depends 再決定要不要預先移除穩定版。</p>
<h2 id="判讀總表">判讀總表</h2>
<table>
  <thead>
      <tr>
          <th>症狀</th>
          <th>層</th>
          <th>權威檢查</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>build 跑一半停住</td>
          <td>資源</td>
          <td><code>df -h</code>、<code>free</code>（宿主與 guest 兩側）</td>
          <td>清空間後同一份原始碼續編</td>
      </tr>
      <tr>
          <td>helper 報 <code>error while loading shared libraries</code></td>
          <td>二進位漂移</td>
          <td><code>ldd $(which &lt;helper&gt;)</code> 看斷的 soname</td>
          <td>換原始碼建置的 helper 或重建 <code>-bin</code></td>
      </tr>
      <tr>
          <td>編譯叫不存在的編譯器路徑</td>
          <td>烤入路徑</td>
          <td><code>sysconfig.get_config_var('CXX')</code> 之類</td>
          <td>環境變數覆寫（<code>CXX=g++</code>）</td>
      </tr>
      <tr>
          <td><code>doesn't support the '...' architecture</code></td>
          <td>宣告缺失</td>
          <td><code>--mflags &quot;-A&quot;</code> 實編驗證</td>
          <td>編過即宣告問題、編不過才是存在性問題</td>
      </tr>
      <tr>
          <td>建好了、安裝時跟穩定版衝突</td>
          <td>依賴衝突</td>
          <td>PKGBUILD 的 depends 是否指名 <code>-git</code></td>
          <td>手動 <code>-R</code> 舊版再 <code>-U</code> 裝建好的包</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>AUR 是什麼、跟官方 repo 的信任模型差異：<a href="/blog/linux/dotfile/knowledge-cards/aur/" data-link-title="AUR（Arch User Repository）" data-link-desc="教材裡叫你 paru -S 某個套件、或說某工具「官方 repo 沒有、要走 AUR」、想搞懂 AUR 是什麼、跟官方 repo 差在哪、build-from-source 的代價時讀">AUR 知識卡</a>。</li>
<li>抓套件階段（網路、資料庫、簽章）的失敗：<a href="../../install/package-and-network-troubleshooting/">安裝期套件與網路故障排除</a>。</li>
<li>「這個架構到底有沒有這個套件 / 二進位」的存在性判讀：<a href="../../install/platform-divergence-map/">平台與發行版差異的判讀地圖</a>。</li>
<li>build 環境整體的判讀紀律：<a href="../diagnosis-read-authoritative-state/">診斷心法</a>。</li>
</ul>
]]></content:encoded></item><item><title>AUR（Arch User Repository）</title><link>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/aur/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/aur/</guid><description>&lt;p>AUR（Arch User Repository）是 Arch 的社群自建套件庫：官方 repo 沒收的軟體，由使用者上傳一份叫 &lt;code>PKGBUILD&lt;/code> 的建置腳本，別人抓下來在自己機器上&lt;strong>從原始碼編譯&lt;/strong>成套件再安裝。它補的是官方 repo 的覆蓋缺口——冷門工具、專有軟體的封裝、開發版（&lt;code>-git&lt;/code>）套件，多半只在 AUR。&lt;/p>
&lt;p>跟官方 repo 的關鍵差別是「誰建置、誰背書」。官方 repo 的套件由 Arch 維護者預先編譯成二進位、簽章、掛在鏡像上，&lt;code>pacman -S&lt;/code> 直接下載裝好。AUR 只存 &lt;code>PKGBUILD&lt;/code> 腳本本身，不存編譯好的成品——你裝 AUR 套件是「抓腳本 → 在你機器上 build → 裝」，沒有官方簽章背書。所以 AUR 套件要自己看一眼 &lt;code>PKGBUILD&lt;/code> 在做什麼（社群審查、不是官方保證），且 build 需要時間與 build 依賴（&lt;code>base-devel&lt;/code>）。&lt;/p>
&lt;p>&lt;code>pacman&lt;/code> 本身不碰 AUR——它只管官方 repo。裝 AUR 套件靠 &lt;strong>AUR helper&lt;/strong>：&lt;code>paru&lt;/code>、&lt;code>yay&lt;/code> 是最常見的兩個，它們把「抓 PKGBUILD → 解 AUR 依賴 → build → 交給 pacman 裝」自動化成一句 &lt;code>paru -S &amp;lt;套件&amp;gt;&lt;/code>。所以教材寫 &lt;code>paru -S mutagen.io-bin&lt;/code> 而不是 &lt;code>pacman -S&lt;/code>，就是在說「這個套件在 AUR、要用 helper 裝」。&lt;/p>
&lt;p>判讀訊號：&lt;code>pacman -S &amp;lt;名字&amp;gt;&lt;/code> 找不到、或裝到一個名字像但功能無關的套件（例 &lt;code>pacman -S mutagen&lt;/code> 會裝到音訊 metadata 函式庫 &lt;code>python-mutagen&lt;/code>、不是同步工具 mutagen），代表你要的東西在官方 repo 沒有、該去 AUR 查正確的套件名（&lt;code>paru -Ss &amp;lt;關鍵字&amp;gt;&lt;/code> 搜）。build-from-source 的代價是：慢（大套件編譯要時間）、可能因上游改動或缺 build 依賴而建置失敗——建置失敗的分層判讀（資源 / 二進位漂移 / 烤入路徑 / 架構宣告）見 &lt;a href="https://tarrragon.github.io/blog/linux/debug/aur-build-failure-triage/" data-link-title="AUR 建置失敗的分層判讀" data-link-desc="paru / yay 裝 AUR 套件失敗——helper 自己載入不了、編譯叫不存在的編譯器、makepkg 說架構不符、或 build 跑一半停住時，定位是資源、二進位漂移、烤入路徑還是宣告缺失">AUR 建置失敗的分層判讀&lt;/a>。&lt;/p>
&lt;p>相關概念：&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/gnu-stow/" data-link-title="GNU Stow" data-link-desc="dotfile 管理文章裡提到 stow、symlink、package 看不懂時回來讀 — stow 的核心概念和常用指令">GNU Stow&lt;/a>（dotfile 部署、與套件管理正交）、&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/compositor/" data-link-title="Compositor（合成器）" data-link-desc="教材反覆出現 compositor / 合成器、想確認它到底負責什麼、跟 window manager 和桌面環境差在哪時讀 — Wayland 下把畫面合成與視窗管理合一的核心程式">Compositor&lt;/a>（Hyprland 等常以 &lt;code>-git&lt;/code> AUR 套件安裝）、&lt;a href="https://tarrragon.github.io/blog/linux/install/platform-divergence-map/" data-link-title="平台與發行版差異的判讀地圖" data-link-desc="跨 macOS / Linux 或跨發行版寫 bootstrap、某個 app 在 ARM/aarch64 裝不起來、或除錯時不確定該用哪個工具與套件名時回來讀">平台差異&lt;/a>（AUR 是 Arch 特有、其他發行版有各自的第三方套件來源）。&lt;/p></description><content:encoded><![CDATA[<p>AUR（Arch User Repository）是 Arch 的社群自建套件庫：官方 repo 沒收的軟體，由使用者上傳一份叫 <code>PKGBUILD</code> 的建置腳本，別人抓下來在自己機器上<strong>從原始碼編譯</strong>成套件再安裝。它補的是官方 repo 的覆蓋缺口——冷門工具、專有軟體的封裝、開發版（<code>-git</code>）套件，多半只在 AUR。</p>
<p>跟官方 repo 的關鍵差別是「誰建置、誰背書」。官方 repo 的套件由 Arch 維護者預先編譯成二進位、簽章、掛在鏡像上，<code>pacman -S</code> 直接下載裝好。AUR 只存 <code>PKGBUILD</code> 腳本本身，不存編譯好的成品——你裝 AUR 套件是「抓腳本 → 在你機器上 build → 裝」，沒有官方簽章背書。所以 AUR 套件要自己看一眼 <code>PKGBUILD</code> 在做什麼（社群審查、不是官方保證），且 build 需要時間與 build 依賴（<code>base-devel</code>）。</p>
<p><code>pacman</code> 本身不碰 AUR——它只管官方 repo。裝 AUR 套件靠 <strong>AUR helper</strong>：<code>paru</code>、<code>yay</code> 是最常見的兩個，它們把「抓 PKGBUILD → 解 AUR 依賴 → build → 交給 pacman 裝」自動化成一句 <code>paru -S &lt;套件&gt;</code>。所以教材寫 <code>paru -S mutagen.io-bin</code> 而不是 <code>pacman -S</code>，就是在說「這個套件在 AUR、要用 helper 裝」。</p>
<p>判讀訊號：<code>pacman -S &lt;名字&gt;</code> 找不到、或裝到一個名字像但功能無關的套件（例 <code>pacman -S mutagen</code> 會裝到音訊 metadata 函式庫 <code>python-mutagen</code>、不是同步工具 mutagen），代表你要的東西在官方 repo 沒有、該去 AUR 查正確的套件名（<code>paru -Ss &lt;關鍵字&gt;</code> 搜）。build-from-source 的代價是：慢（大套件編譯要時間）、可能因上游改動或缺 build 依賴而建置失敗——建置失敗的分層判讀（資源 / 二進位漂移 / 烤入路徑 / 架構宣告）見 <a href="/blog/linux/debug/aur-build-failure-triage/" data-link-title="AUR 建置失敗的分層判讀" data-link-desc="paru / yay 裝 AUR 套件失敗——helper 自己載入不了、編譯叫不存在的編譯器、makepkg 說架構不符、或 build 跑一半停住時，定位是資源、二進位漂移、烤入路徑還是宣告缺失">AUR 建置失敗的分層判讀</a>。</p>
<p>相關概念：<a href="/blog/linux/dotfile/knowledge-cards/gnu-stow/" data-link-title="GNU Stow" data-link-desc="dotfile 管理文章裡提到 stow、symlink、package 看不懂時回來讀 — stow 的核心概念和常用指令">GNU Stow</a>（dotfile 部署、與套件管理正交）、<a href="/blog/linux/dotfile/knowledge-cards/compositor/" data-link-title="Compositor（合成器）" data-link-desc="教材反覆出現 compositor / 合成器、想確認它到底負責什麼、跟 window manager 和桌面環境差在哪時讀 — Wayland 下把畫面合成與視窗管理合一的核心程式">Compositor</a>（Hyprland 等常以 <code>-git</code> AUR 套件安裝）、<a href="/blog/linux/install/platform-divergence-map/" data-link-title="平台與發行版差異的判讀地圖" data-link-desc="跨 macOS / Linux 或跨發行版寫 bootstrap、某個 app 在 ARM/aarch64 裝不起來、或除錯時不確定該用哪個工具與套件名時回來讀">平台差異</a>（AUR 是 Arch 特有、其他發行版有各自的第三方套件來源）。</p>
]]></content:encoded></item></channel></rss>