外部相依與套件管理員
幾乎沒有任何真實程式完全由其作者親手寫的程式碼建成;它都倚賴別人的函式庫——一個 JSON 剖析器、一個壓縮函式庫、一個網頁框架。外部相依,就是任何這類你的程式需要、但它自己並不含有的程式碼。套件管理員則是替你取得這些相依、安裝它們、並追蹤其版本的工具,於是你不必親手一個個去找、去下載。
它大致有兩種形式。系統套件管理員為整台機器安裝軟體、由作業系統的廠商提供——例如 Linux 上的 apt 或 dnf,或 macOS 上的 Homebrew——把函式庫與標頭檔放進像 /usr/lib 與 /usr/include 這類共享的系統目錄。語言層級的套件管理員則在某個程式語言的生態系內運作,通常以專案為單位:Python 的 pip、JavaScript 的 npm、Rust 的 Cargo。你通常在一個專案檔裡列出所需的函式庫,套件管理員讀取那份清單、下載正確版本、把它們提供給你的建構,並常常自動解析「你相依之物所相依的東西」。
為什麼重要:套件管理員正是讓現代軟體開發變得可行的東西,把「正確地找到、下載、建構並安放十個函式庫」變成一道指令。它們也帶來真實的風險:每個相依都是你現在信任且必須持續更新的程式碼、相依之間的版本衝突可能很痛苦、而一個被入侵或被棄置的套件也會變成你的麻煩。把相依管理好——釘住版本、審視你引入了什麼——是系統工作裡貨真價實的一環,而非事後才想的事。
系統套件管理員(整台機器): $ sudo apt install libssl-dev # 安裝函式庫+標頭檔 語言套件管理員(單一專案): $ cargo add serde # 加入一個 Rust 相依 $ pip install requests # 加入一個 Python 相依
系統套件管理員為全機器安裝函式庫;語言套件管理員則管理一個專案的相依。
每個相依都是你如今正在信任、且有責任保持更新的程式碼;方便並不抹消這一點。一個被廣泛使用的套件若遭棄置、損壞或被入侵,從你的建構把它拉進來那一刻起,就成了你的問題。