AUR 套件相依性

最後更新: 2025-03-16 08:23:44 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

AUR 儲存庫提供 PKGBUILD:它是可執行的封裝中繼資料,不是二進位套件或相依性解析器。因此,安全建置套件需要區分使建置得以進行的相依性,以及安裝到最終系統上的相依性。

PKGBUILD 中的相依性類別 #

PKGBUILD(5) 定義具有不同生命週期的相依性陣列:

  • depends 宣告執行已安裝套件所需的套件。
  • makedepends 宣告只有建置期間需要的工具與函式庫。
  • checkdepends 宣告 check() 所需的套件。

版本限制使用 pacman 的相依性語法,例如 depends=('libfoo>=2')。分割套件可以有套件專屬的相依性陣列,例如 package_client() { depends=('libclient') }。

不要僅因為套件沒有它也能建置,就將執行階段函式庫移入 makedepends。相反地,當沒有已安裝檔案需要編譯器時,也不要將編譯器保留在 depends 中。準確的陣列能讓 pacman 正確規劃升級與移除。

makepkg 建置;pacman 安裝 #

請以非特權使用者執行 makepkg。它會下載並驗證原始碼、檢查相依性、執行 prepare()、build()、check() 與 package(),並建立供 pacman 使用的封存檔。makepkg -i 只有在建置成功後才會安裝該封存檔;安裝工作由 pacman 執行。

sh
git clone https://aur.archlinux.org/example.git
cd example
makepkg --cleanbuild --syncdeps
sudo pacman -U ./*.pkg.tar.zst

--syncdeps 要求 pacman 安裝缺少的相依性。因此它只會解析已在設定的二進位儲存庫中可用的套件。它無法取得 AUR 相依性,因為 AUR 發佈的是建置配方,而不是儲存庫套件。

避免使用 --nodeps,也絕不要以 sudo 執行 makepkg;繞過相依性檢查可能產生連結錯誤的套件,而 root 會以不必要的權限執行未檢閱的 PKGBUILD shell 程式碼。

建置 AUR 相依性鏈 #

依相依性順序解析 AUR 相依性。執行每個配方前都要檢查,先建置葉節點,並安裝產生的封存檔,讓下一個套件的相依性測試成功。

sh
# Build and install the AUR dependency first.
git clone https://aur.archlinux.org/example-library.git
cd example-library
makepkg --cleanbuild --syncdeps
sudo pacman -U ./*.pkg.tar.zst

# Then build the dependent package.
cd ../example
makepkg --cleanbuild --syncdeps

AUR 輔助工具可以自動處理圖形走訪,但不能取代檢閱:每個 PKGBUILD、.SRCINFO、來源 URL、修補程式與安裝腳本,仍然都是受信任的建置輸入。在建置前,請檢查完整鏈中的版本限制。

使用乾淨 chroot 以確保可重現性 #

主機上安裝的套件可能掩蓋缺少的宣告。乾淨 chroot 從已定義的 Arch 基礎開始,讓缺少的 makedepends 與 checkdepends 顯現出來。在設定 devtools 後,從套件目錄執行:

sh
extra-x86_64-build

將必要的 AUR 套件建置到本機儲存庫,或在建置相依套件前將其已驗證的封存檔安裝到 chroot。測試相依性鏈時,請刻意重建或更新 chroot,並保留建置記錄與套件封存檔供調查。成功的乾淨 chroot 建置證明已宣告建置輸入,但不能證明配方或其上游來源安全。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)