<?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>Package-Manager on Tarragon</title><link>https://tarrragon.github.io/blog/tags/package-manager/</link><description>Recent content in Package-Manager on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/package-manager/index.xml" rel="self" type="application/rss+xml"/><item><title>Composer</title><link>https://tarrragon.github.io/blog/infra/knowledge-cards/composer/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/infra/knowledge-cards/composer/</guid><description>&lt;p>Composer 是 PHP 的套件管理工具，角色等同於 Node.js 的 npm、Python 的 pip、Go 的 go mod。它負責宣告專案需要哪些第三方套件、鎖定每個套件的確切版本、以及把套件安裝到專案目錄裡。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>接手 PHP 專案時，Composer 是判斷「專案依賴了什麼、版本有沒有已知漏洞」的入口。專案根目錄通常有三個 Composer 相關的檔案：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>檔案&lt;/th>
 &lt;th>角色&lt;/th>
 &lt;th>進 Git？&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>composer.json&lt;/code>&lt;/td>
 &lt;td>宣告依賴（套件名稱 + 版本範圍）&lt;/td>
 &lt;td>是&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>composer.lock&lt;/code>&lt;/td>
 &lt;td>鎖定確切版本（含所有 transitive 依賴）&lt;/td>
 &lt;td>是&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vendor/&lt;/code>&lt;/td>
 &lt;td>安裝的套件目錄&lt;/td>
 &lt;td>否（.gitignore 排除、由 &lt;code>composer install&lt;/code> 重建）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>接手專案時如果根目錄有 &lt;code>composer.json&lt;/code> 但沒有 &lt;code>vendor/&lt;/code>，代表需要先跑 &lt;code>composer install&lt;/code> 才能讓專案運作。如果連 &lt;code>composer.lock&lt;/code> 都沒有，代表套件版本沒有鎖定——每次安裝可能拿到不同版本。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>兩個常用指令的差別：&lt;/p>
&lt;ul>
&lt;li>&lt;code>composer install&lt;/code>：按 &lt;code>composer.lock&lt;/code> 安裝確切版本。用於部署和接手——確保每台機器安裝的版本一致。&lt;/li>
&lt;li>&lt;code>composer update&lt;/code>：重新解析 &lt;code>composer.json&lt;/code> 的版本範圍、更新到最新的符合版本、改寫 &lt;code>composer.lock&lt;/code>。用於主動升級依賴。&lt;/li>
&lt;/ul>
&lt;p>接手時的關鍵操作：&lt;/p>
&lt;ul>
&lt;li>&lt;code>composer audit&lt;/code>：掃描已安裝套件的已知安全漏洞&lt;/li>
&lt;li>&lt;code>composer outdated&lt;/code>：列出可更新的套件及其最新版本&lt;/li>
&lt;/ul>
&lt;h2 id="鄰卡">鄰卡&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/infra/knowledge-cards/dotenv/" data-link-title=".env" data-link-desc="存放環境變數的純文字檔案，把機密值從程式碼分離出來">.env&lt;/a>：Composer 管套件、.env 管設定值，兩者都是 PHP 專案的基礎設施&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/infra/knowledge-cards/php-ini/" data-link-title="php.ini / .user.ini" data-link-desc="PHP 的執行期設定檔，控制記憶體上限、上傳大小、錯誤報告等 runtime 行為">php.ini / .user.ini&lt;/a>：Composer 需要 PHP CLI 執行，php.ini 的 memory_limit 和 max_execution_time 會影響 Composer 能不能跑完&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Composer 是 PHP 的套件管理工具，角色等同於 Node.js 的 npm、Python 的 pip、Go 的 go mod。它負責宣告專案需要哪些第三方套件、鎖定每個套件的確切版本、以及把套件安裝到專案目錄裡。</p>
<h2 id="概念位置">概念位置</h2>
<p>接手 PHP 專案時，Composer 是判斷「專案依賴了什麼、版本有沒有已知漏洞」的入口。專案根目錄通常有三個 Composer 相關的檔案：</p>
<table>
  <thead>
      <tr>
          <th>檔案</th>
          <th>角色</th>
          <th>進 Git？</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>composer.json</code></td>
          <td>宣告依賴（套件名稱 + 版本範圍）</td>
          <td>是</td>
      </tr>
      <tr>
          <td><code>composer.lock</code></td>
          <td>鎖定確切版本（含所有 transitive 依賴）</td>
          <td>是</td>
      </tr>
      <tr>
          <td><code>vendor/</code></td>
          <td>安裝的套件目錄</td>
          <td>否（.gitignore 排除、由 <code>composer install</code> 重建）</td>
      </tr>
  </tbody>
</table>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>接手專案時如果根目錄有 <code>composer.json</code> 但沒有 <code>vendor/</code>，代表需要先跑 <code>composer install</code> 才能讓專案運作。如果連 <code>composer.lock</code> 都沒有，代表套件版本沒有鎖定——每次安裝可能拿到不同版本。</p>
<h2 id="設計責任">設計責任</h2>
<p>兩個常用指令的差別：</p>
<ul>
<li><code>composer install</code>：按 <code>composer.lock</code> 安裝確切版本。用於部署和接手——確保每台機器安裝的版本一致。</li>
<li><code>composer update</code>：重新解析 <code>composer.json</code> 的版本範圍、更新到最新的符合版本、改寫 <code>composer.lock</code>。用於主動升級依賴。</li>
</ul>
<p>接手時的關鍵操作：</p>
<ul>
<li><code>composer audit</code>：掃描已安裝套件的已知安全漏洞</li>
<li><code>composer outdated</code>：列出可更新的套件及其最新版本</li>
</ul>
<h2 id="鄰卡">鄰卡</h2>
<ul>
<li><a href="/blog/infra/knowledge-cards/dotenv/" data-link-title=".env" data-link-desc="存放環境變數的純文字檔案，把機密值從程式碼分離出來">.env</a>：Composer 管套件、.env 管設定值，兩者都是 PHP 專案的基礎設施</li>
<li><a href="/blog/infra/knowledge-cards/php-ini/" data-link-title="php.ini / .user.ini" data-link-desc="PHP 的執行期設定檔，控制記憶體上限、上傳大小、錯誤報告等 runtime 行為">php.ini / .user.ini</a>：Composer 需要 PHP CLI 執行，php.ini 的 memory_limit 和 max_execution_time 會影響 Composer 能不能跑完</li>
</ul>
]]></content:encoded></item><item><title>平台與發行版差異的判讀地圖</title><link>https://tarrragon.github.io/blog/linux/install/platform-divergence-map/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/install/platform-divergence-map/</guid><description>&lt;p>同一個工作環境要在多台機器上復現時，差異集中在四個層次：套件管理器、套件名稱、套件存在性、版本節奏。這四層決定了 bootstrap 腳本哪些部分能共用、哪些必須按平台獨立維護，也決定了除錯時要先確認自己站在哪個平台上——很多「工具行為不對」的問題，根因是把 A 平台的經驗直接套到 B 平台。&lt;/p>
&lt;h2 id="差異的四個層次">差異的四個層次&lt;/h2>
&lt;h3 id="套件管理器每個平台各有原生解">套件管理器：每個平台各有原生解&lt;/h3>
&lt;p>macOS 用 Homebrew、Arch 用 pacman、Debian/Ubuntu 用 apt、Fedora 用 dnf。安裝指令、確認旗標、資料庫同步模型都不同，其中兩個差異會直接咬到自動化腳本：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>非互動旗標不對稱&lt;/strong>：apt 的慣例是 &lt;code>-y&lt;/code>，pacman 是 &lt;code>--noconfirm&lt;/code>。腳本只寫了其中一邊，換平台就會卡在確認提示——非 TTY 環境下（SSH 一行式、CI、無人值守）沒人回答 &lt;code>[Y/n]&lt;/code>，pacman 直接以錯誤結束。&lt;/li>
&lt;li>&lt;strong>資料庫同步模型不同&lt;/strong>：Arch 是 rolling release 且鏡像不保留舊版檔案，裝機當下的套件資料庫幾天內就會指向已被輪替掉的檔名，安裝時收到 404（&lt;code>failed retrieving file&lt;/code>）。修法是安裝前先 &lt;code>pacman -Syu&lt;/code> 同步資料庫並全系統升級——只 &lt;code>-Sy&lt;/code> 不 &lt;code>-u&lt;/code> 會造成 partial upgrade（新資料庫裝新套件、舊系統缺新依賴）。Debian stable 的套件庫凍結、沒有這個時序問題，但代價是版本舊。&lt;/li>
&lt;/ul>
&lt;h3 id="套件名稱同一個工具各發行版各叫各的">套件名稱：同一個工具、各發行版各叫各的&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>Arch&lt;/th>
 &lt;th>Debian/Ubuntu&lt;/th>
 &lt;th>Fedora&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>fd&lt;/td>
 &lt;td>&lt;code>fd&lt;/code>&lt;/td>
 &lt;td>&lt;code>fd-find&lt;/code>（執行檔叫 &lt;code>fdfind&lt;/code>）&lt;/td>
 &lt;td>&lt;code>fd-find&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>bat&lt;/td>
 &lt;td>&lt;code>bat&lt;/code>&lt;/td>
 &lt;td>&lt;code>bat&lt;/code>（執行檔叫 &lt;code>batcat&lt;/code>）&lt;/td>
 &lt;td>&lt;code>bat&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>gh&lt;/td>
 &lt;td>&lt;code>github-cli&lt;/code>&lt;/td>
 &lt;td>&lt;code>gh&lt;/code>&lt;/td>
 &lt;td>&lt;code>gh&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CJK 字型&lt;/td>
 &lt;td>&lt;code>noto-fonts-cjk&lt;/code>&lt;/td>
 &lt;td>&lt;code>fonts-noto-cjk&lt;/code>&lt;/td>
 &lt;td>&lt;code>google-noto-sans-cjk-fonts&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Meslo Nerd Font&lt;/td>
 &lt;td>&lt;code>ttf-meslo-nerd&lt;/code>&lt;/td>
 &lt;td>未打包（手動裝）&lt;/td>
 &lt;td>未打包&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Debian 的重命名還會連執行檔一起改（&lt;code>fdfind&lt;/code>、&lt;code>batcat&lt;/code>），所以連 shell alias 與腳本內的指令呼叫都要跟著分歧。維護跨發行版清單的可靠做法是逐台實測建立——憑印象抄一份對照表，漂移只是時間問題。&lt;/p>
&lt;h3 id="套件存在性有些概念只存在於特定平台">套件存在性：有些概念只存在於特定平台&lt;/h3>
&lt;p>Hyprland 在 Arch 官方 repo、Fedora 要 COPR、Debian stable 沒有；Quickshell 只有 Arch 打包。反過來，macOS 的 cask app（GUI 應用程式）概念在 Linux 對應的是各桌面環境自己的生態。這層差異沒有翻譯的空間——桌面層的清單是平台專屬的維護對象。&lt;/p>
&lt;p>存在性差異還有一個容易漏看的軸：&lt;strong>CPU 架構&lt;/strong>。發行版 repo 有這個工具、不代表它在你的架構上存在——尤其是專有軟體的二進位發行。實測案例：Arch aarch64（ALARM）的 repo 有 &lt;code>spotify-launcher&lt;/code>（工具本身有 aarch64 建置），但它要下載的 Spotify 官方 client 只發 x86_64/i386 deb，實跑直接回報 &lt;code>There are no packages for your cpu's architecture (cpu=&amp;quot;aarch64&amp;quot;, supported=[&amp;quot;amd64&amp;quot;, &amp;quot;i386&amp;quot;])&lt;/code>。這類失敗的判讀重點是分清「工具沒打包」跟「工具打包了、它依賴的專有 blob 沒有這個架構」——前者可能有 AUR / 第三方 repo 補、後者只能找替代路徑（Spotify 的替代是 Web Player + 從 ChromeOS 鏡像抽出的 arm64 Widevine CDM）。DRM、GPU driver、印表機 driver 這類含專有二進位的軟體，在非 x86_64 架構上都要先查架構支援再排進安裝清單。&lt;/p>
&lt;h3 id="版本節奏rolling-與-stable-的行為差">版本節奏：rolling 與 stable 的行為差&lt;/h3>
&lt;p>Arch rolling 永遠最新，Debian stable 的同名工具可能舊兩年。版本差會讓 config 語法對不上（新版工具的設定選項在舊版不存在）、也會讓「照著文件做卻失敗」——文件寫的是新版行為。除錯時看到「同一份 config 在 A 機器能跑、B 機器報錯」，先比對兩邊的工具版本再懷疑 config 本身。&lt;/p>
&lt;h2 id="除錯前先定平台">除錯前先定平台&lt;/h2>
&lt;p>跨平台差異對除錯的意義：&lt;strong>判讀工具與修法都是平台相依的，先確認自己站在哪，再開始查。&lt;/strong> 三條指令建立座標：&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">cat /etc/os-release &lt;span class="c1"># 發行版與版本（Linux）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">uname -m &lt;span class="c1"># CPU 架構：x86_64 / aarch64（套件生態差很多）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="nb">command&lt;/span> -v pacman apt-get dnf brew &lt;span class="c1"># 哪個套件管理器在場&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>架構那條容易被忽略：aarch64（ARM）的套件生態比 x86_64 小——Homebrew on Linux 對 aarch64 沒有預編譯 bottle、AUR 部分套件不支援 ARM。在 ARM 機器上照 x86 的教學走，會在意想不到的地方碰壁。&lt;/p></description><content:encoded><![CDATA[<p>同一個工作環境要在多台機器上復現時，差異集中在四個層次：套件管理器、套件名稱、套件存在性、版本節奏。這四層決定了 bootstrap 腳本哪些部分能共用、哪些必須按平台獨立維護，也決定了除錯時要先確認自己站在哪個平台上——很多「工具行為不對」的問題，根因是把 A 平台的經驗直接套到 B 平台。</p>
<h2 id="差異的四個層次">差異的四個層次</h2>
<h3 id="套件管理器每個平台各有原生解">套件管理器：每個平台各有原生解</h3>
<p>macOS 用 Homebrew、Arch 用 pacman、Debian/Ubuntu 用 apt、Fedora 用 dnf。安裝指令、確認旗標、資料庫同步模型都不同，其中兩個差異會直接咬到自動化腳本：</p>
<ul>
<li><strong>非互動旗標不對稱</strong>：apt 的慣例是 <code>-y</code>，pacman 是 <code>--noconfirm</code>。腳本只寫了其中一邊，換平台就會卡在確認提示——非 TTY 環境下（SSH 一行式、CI、無人值守）沒人回答 <code>[Y/n]</code>，pacman 直接以錯誤結束。</li>
<li><strong>資料庫同步模型不同</strong>：Arch 是 rolling release 且鏡像不保留舊版檔案，裝機當下的套件資料庫幾天內就會指向已被輪替掉的檔名，安裝時收到 404（<code>failed retrieving file</code>）。修法是安裝前先 <code>pacman -Syu</code> 同步資料庫並全系統升級——只 <code>-Sy</code> 不 <code>-u</code> 會造成 partial upgrade（新資料庫裝新套件、舊系統缺新依賴）。Debian stable 的套件庫凍結、沒有這個時序問題，但代價是版本舊。</li>
</ul>
<h3 id="套件名稱同一個工具各發行版各叫各的">套件名稱：同一個工具、各發行版各叫各的</h3>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>Arch</th>
          <th>Debian/Ubuntu</th>
          <th>Fedora</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>fd</td>
          <td><code>fd</code></td>
          <td><code>fd-find</code>（執行檔叫 <code>fdfind</code>）</td>
          <td><code>fd-find</code></td>
      </tr>
      <tr>
          <td>bat</td>
          <td><code>bat</code></td>
          <td><code>bat</code>（執行檔叫 <code>batcat</code>）</td>
          <td><code>bat</code></td>
      </tr>
      <tr>
          <td>gh</td>
          <td><code>github-cli</code></td>
          <td><code>gh</code></td>
          <td><code>gh</code></td>
      </tr>
      <tr>
          <td>CJK 字型</td>
          <td><code>noto-fonts-cjk</code></td>
          <td><code>fonts-noto-cjk</code></td>
          <td><code>google-noto-sans-cjk-fonts</code></td>
      </tr>
      <tr>
          <td>Meslo Nerd Font</td>
          <td><code>ttf-meslo-nerd</code></td>
          <td>未打包（手動裝）</td>
          <td>未打包</td>
      </tr>
  </tbody>
</table>
<p>Debian 的重命名還會連執行檔一起改（<code>fdfind</code>、<code>batcat</code>），所以連 shell alias 與腳本內的指令呼叫都要跟著分歧。維護跨發行版清單的可靠做法是逐台實測建立——憑印象抄一份對照表，漂移只是時間問題。</p>
<h3 id="套件存在性有些概念只存在於特定平台">套件存在性：有些概念只存在於特定平台</h3>
<p>Hyprland 在 Arch 官方 repo、Fedora 要 COPR、Debian stable 沒有；Quickshell 只有 Arch 打包。反過來，macOS 的 cask app（GUI 應用程式）概念在 Linux 對應的是各桌面環境自己的生態。這層差異沒有翻譯的空間——桌面層的清單是平台專屬的維護對象。</p>
<p>存在性差異還有一個容易漏看的軸：<strong>CPU 架構</strong>。發行版 repo 有這個工具、不代表它在你的架構上存在——尤其是專有軟體的二進位發行。實測案例：Arch aarch64（ALARM）的 repo 有 <code>spotify-launcher</code>（工具本身有 aarch64 建置），但它要下載的 Spotify 官方 client 只發 x86_64/i386 deb，實跑直接回報 <code>There are no packages for your cpu's architecture (cpu=&quot;aarch64&quot;, supported=[&quot;amd64&quot;, &quot;i386&quot;])</code>。這類失敗的判讀重點是分清「工具沒打包」跟「工具打包了、它依賴的專有 blob 沒有這個架構」——前者可能有 AUR / 第三方 repo 補、後者只能找替代路徑（Spotify 的替代是 Web Player + 從 ChromeOS 鏡像抽出的 arm64 Widevine CDM）。DRM、GPU driver、印表機 driver 這類含專有二進位的軟體，在非 x86_64 架構上都要先查架構支援再排進安裝清單。</p>
<h3 id="版本節奏rolling-與-stable-的行為差">版本節奏：rolling 與 stable 的行為差</h3>
<p>Arch rolling 永遠最新，Debian stable 的同名工具可能舊兩年。版本差會讓 config 語法對不上（新版工具的設定選項在舊版不存在）、也會讓「照著文件做卻失敗」——文件寫的是新版行為。除錯時看到「同一份 config 在 A 機器能跑、B 機器報錯」，先比對兩邊的工具版本再懷疑 config 本身。</p>
<h2 id="除錯前先定平台">除錯前先定平台</h2>
<p>跨平台差異對除錯的意義：<strong>判讀工具與修法都是平台相依的，先確認自己站在哪，再開始查。</strong> 三條指令建立座標：</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">cat /etc/os-release        <span class="c1"># 發行版與版本（Linux）</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">uname -m                   <span class="c1"># CPU 架構：x86_64 / aarch64（套件生態差很多）</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nb">command</span> -v pacman apt-get dnf brew   <span class="c1"># 哪個套件管理器在場</span></span></span></code></pre></div><p>架構那條容易被忽略：aarch64（ARM）的套件生態比 x86_64 小——Homebrew on Linux 對 aarch64 沒有預編譯 bottle、AUR 部分套件不支援 ARM。在 ARM 機器上照 x86 的教學走，會在意想不到的地方碰壁。</p>
<h2 id="bootstrap-的分歧設計判準">Bootstrap 的分歧設計判準</h2>
<p>把差異收進腳本架構的三條判準，決定每段邏輯住在哪：</p>
<ol>
<li><strong>安裝手段跨平台一致</strong>（git clone、curl installer、stow 部署）→ 進共通層，一份邏輯全平台用</li>
<li><strong>只是套件名或套件管理器不同</strong> → 各平台一份安裝腳本 + 一份套件清單，獨立維護、分歧不寫進共通層的 if/else</li>
<li><strong>概念只存在於某平台</strong>（Hyprland、cask）→ 只出現在該平台清單的桌面層</li>
</ol>
<p>這個切法的維護成本結構：共通層改一次全平台生效；平台層只在你真的用那個平台時才付維護成本。沒有實測機器的發行版不預先建清單——那種清單沒有實測支撐、注定漂移。</p>
<h2 id="統一層的誘惑與代價">統一層的誘惑與代價</h2>
<p>「用一個跨平台套件管理器統一所有機器」聽起來能消掉整個分歧層，實際的適用邊界很窄。Homebrew 支援 Linux，但它在 Arch 上會建一套與 pacman 平行的套件世界（獨立 prefix、重複的函式庫、PATH 互搶），而且對 aarch64 Linux 沒有 bottle、全部從原始碼編譯。它真正的適用場景是「發行版套件太舊」（如 Ubuntu LTS 上要新版工具）或「沒有 root 權限」。Nix 能做到真正的跨平台一致，代價是整套心智模型重學。判準是：分歧層的維護成本（每個發行版一份清單）低於統一層的引入成本時，保持原生套件管理器 + 分平台清單。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Bootstrap 腳本本身的設計（log 落地、錯誤定位）見<a href="/blog/linux/install/observable-bootstrap/" data-link-title="可除錯的 bootstrap：把可觀測性內建進安裝腳本" data-link-desc="安裝腳本中途失敗卻只能對著終端機捲動瞎找原因、想在 bootstrap 設計階段就讓失敗可定位時回來讀">可除錯的 bootstrap</a></li>
<li>最小系統缺什麼、怎麼驗證見<a href="/blog/linux/install/minimal-install-verify/" data-link-title="最小安裝後的工具驗證與補足" data-link-desc="最小化安裝的 Linux 裝完發現連 sudo 或 which 都沒有、bootstrap 腳本第一行就炸、需要先確認系統缺哪些必要工具再補時回來讀">最小安裝後的工具驗證與補足</a></li>
<li>出問題時的判讀紀律見 <a href="/blog/linux/debug/" data-link-title="Linux 除錯與診斷" data-link-desc="遠端或本地除錯 Linux 時，一個現象看起來像 A 卻可能是 B，想建立一套先讀權威狀態再下判斷的紀律、按症狀分流到對的檢查與工具時回來讀">Linux 除錯與診斷</a></li>
<li>dotfile repo 怎麼同時服務 macOS 與 Linux 見<a href="/blog/linux/dotfile/01-dotfile-management/cross-platform-one-repo/" data-link-title="跨平台共用一個 Repo" data-link-desc="macOS 跟 Linux 要共用同一個 dotfile repo、不想維護兩份時回來讀">一個 repo 管理跨平台環境</a></li>
</ul>
]]></content:encoded></item></channel></rss>