Arch Linux 軟體包製作入門
PKGBUILD
文件是為 Arch Linux 及其衍生版(如 Manjaro)構建和創建軟體包的方式。
如果你曾經使用過 AUR(即 Arch Linux 的用戶維護的 PKGBUILD
存儲庫),你甚至可能也遇到過它們。
但是,到底是如何從 PKGBUILD
到可安裝軟體包的呢?這兩者之間到底發生了什麼,如何把自己的軟體製作成軟體包呢?你將在這篇文章中了解這些。
PKGBUILD 基礎知識
對於那些熟悉 Bash 或其他 shell 的人來說,你可能知道,PKGBUILD
就是一個帶有一些變數的 shell 腳本。
PKGBUILD
文件由變數和函數組成,所有這些都是用來定義軟體包本身,以及如何構建它。
為了從 PKGBUILD
中創建一個軟體包,需要使用 makepkg
命令行工具。在獲得 PKGBUILD
文件後,你只需在包含 PKGBUILD
的目錄中運行 `makepkg',就可以得到一個可安裝的軟體包了。
在本教程中,你將會看到我剛剛製作的軟體包,它在運行時列印出 「Hello World!」。
準備
為了繼續學習本教程,你需要創建幾個文件。
首先,你需要創建一個名為 PKGBUILD
的文件,它將作為構建你的軟體包的「配方」。
你需要做的另一個文件是一個叫 hello-world.sh
的文件。我稍後會解釋它的用途。
你也可以用一個命令來創建這兩個文件:
touch PKGBUILD hello-world.sh
你可以用 ls
命令檢查這些文件是否被創建。
然後你就可以開始了!
設置你的 PKGBUILD 文件
我不會讓你複製粘貼整個文件,而是和你一起鍵入每一行,這樣你就能更好地理解每一行的目的。如果你不喜歡這種學習方式,我強烈推薦 Arch 維基 中為 Arch Linux 創建軟體包的文章。
這篇文章也沒有介紹 PKGBUILD
中可以設置的每一個選項,只是介紹了一些常用的選項,以便你能儘快上手。
說完了這些,打開你的文本編輯器,讓我們直接進入正題吧。
pkgname
首先是 pkgname
變數。這是安裝時定義軟體包名稱的東西,也是 Arch Linux 的軟體包管理器 pacman 跟蹤軟體包的方式。
這個變數(以及其他一些變數)的格式是 variable=value
,變數名在左邊,變數的值在右邊,用等號隔開。
要設置包的名稱,請在 PKGBUILD
中輸入以下內容:
pkgname="hello-world"
- 要設置一個不同的軟體包名稱,用你的軟體包的名稱替換
hello-world
。 - 這並不設置用於運行程序的命令,這將在下面的
package()
部分中處理。
pkgver
正如變數名稱本身所述,它設置了你的軟體包的版本(即 1.0.0
)。這在用戶更新他們的系統時很有用,因為設置更高的版本會提示用戶升級。
要設置版本號,請在 PKGBUILD
中輸入以下內容(在前一行之後):
pkgver="1.0.0"
pkgrel
這與 pkgver
變數有關,通常不需要知道。不過和 pkgver
變數一樣,如果它被換到一個更高的數字,就將通知用戶進行升級。
它適用於任何需要保持 pkgver
不變的情況下,例如 PKGBUILD
本身發生了變化。如果你為一個你使用的程序創建了一個 PKGBUILD
(並希望保持軟體包的版本相同),而你需要修復 PKGBUILD
本身的一個錯誤,這將是非常有用的。
要設置這個變數,請在 PKGBUILD
中輸入以下內容:
pkgver="1"
這個變數應該 總是 從 1
開始,然後一次一次地向上移動。當 pkgver
本身向上移動時,這個變數可以(也應該)重置為 1
,因為 pkgver
本身會通知用戶升級。
pkgdesc
這將設置軟體包的描述,用於幫助更好地識別該軟體包。
要設置它,只需將描述放在引號內:
pkgdesc="Hello world in your terminal!"
arch
這個變數設置軟體包所兼容的 硬體架構。如果你不明白什麼是架構,那也沒關係,因為在大多數情況下,這個變數幾乎是無用的。
無論如何,makepkg
仍然需要設置它,這樣它就知道這個軟體包與我們的系統是兼容的。
這個變數支持設置多個值,所以 makepkg
需要一個不同的語法,如下所示。
要設置它,請在 PKGBUILD
中輸入以下內容:
arch=("x86_64")
如果你要設置多個值,需要用空格和引號分隔每個值,像這樣。arch=(「x86_x64" "arm")
。
depends
這列出了提供了我們的軟體包所需功能的所有軟體包。與 arch
一樣,它也可以包含多個值,因此必須使用括弧語法。
由於我們的軟體包沒有任何依賴關係,所以我們不需要在 PKGBUILD
中輸入這個欄位。然而,如果我們的軟體包有依賴關係,我們就會使用與 arch
相同的語法。
optdepends
這裡列出了那些並不是提供所需功能而是額外功能的軟體包。
這與 depends
的語法相同。
conflicts
這告訴 pacman
哪些軟體包會導致我們的軟體包出現問題,或者以我們不希望的方式行事。
這裡列出的任何軟體包都會在我們的軟體包被安裝之前被卸載。
這與 depends
的語法相同。
license
這定義了你的程序所採用的 軟體許可證。如果你需要幫助你選擇一個許可證,Arch 維基 提供了一些信息。如果你不知道該怎麼設置,將其設置為 custom
也可以。
這與 arch
和 depends
的語法相同:
license=("custom")
source
這就是 makepkg
如何知道要用什麼文件來構建我們的軟體包。它可以包含各種不同類型的源,包括本地文件和 URL。
在添加本地文件時,要輸入相對於 PKGBUILD
文件的文件路徑,比如以下目錄布局:
PKGBUILD
file.txt
src/file.sh
如果你想在我們的 PKGBUILD
中包括 file.sh
,你需要輸入 src/file.sh
作為其名稱。
當輸入 URL 時,你只需輸入完整的 URL,即 https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png
。
你的這個軟體包只需要 hello-world.sh
文件,由於它和 PKGBUILD
在同一個目錄中,你只需輸入它的名字作為 source
的值。
這個變數也使用與 arch
和 depends
相同的語法:
source=("hello-world.sh")
sha512sums
這是用來驗證 source
中的文件沒有被修改或下載錯誤。如何獲得這個值的信息可以在 Arch 維基關於 PKGBUILD 的文章 中找到。
如果你寧願不設置這個(或者你只是不需要,例如對於本地文件),你可以為 source
變數中的每個文件輸入 SKIP
:
sha512sums=("SKIP")
package()
這是最後一個,也是實際製作我們的包的最重要的部分。在處理這個問題時,知道兩個變數很重要。
${srcdir}
:這是makepkg
放置source
變數中文件的地方。在這個目錄中,你可以與這些文件進行交互,並對文件進行任何其他需要的修改。${pkgdir}
:這是我們放置將被安裝在系統中的文件的地方。${pkgdir}
的文件夾結構是按照實際系統中的情況設置的(例如,使用pacman
安裝時,${pkgdir}/usr/bin/hello-world
會創建文件/usr/bin/hello-world
)。
package()
包含一個用於創建軟體包的命令列表。
因此,如果(假設)你需要有個在 /usr/share/motto.txt
寫著 「Linux is superior to Windows 」的文件,你會運行這樣的東西:
package() {
mkdir -p "${pkgdir}/usr/share"
echo "Linux is superior to Windows" | tee "${pkgdir}/usr/share/motto.txt"
}
關於上述命令的一些說明:
${pkgdir}
裡面最初是 不包含 目錄的。如果你跳過了 mkdir 命令,tee
會輸出一個錯誤,說這個目錄不存在。- 在指定目錄時,總是 在它們前面加上
${pkgdir}
或${srcdir}
變數。如果輸入/usr/share/motto.txt
,就會按照字面意義指向你當前運行的系統中的/usr/share/motto.txt
。
對於你的 PKGBUILD
,你將把 hello-world.sh
文件放在目標系統的 /usr/bin/hello-world
中。你還將使該文件在運行時說 「Hello to you!」。
要做到這一點,請在 PKGBUILD
中輸入以下內容:
package() {
echo 'Hello to you!' > "${srcdir}/hello-world.sh"
mkdir -p "${pkgdir}/usr/bin"
cp "${srcdir}/hello-world.sh" "${pkgdir}/usr/bin/hello-world"
chmod +x "${pkgdir}/usr/bin/hello-world"
}
然後就完成了!用 makepkg -si
構建和安裝軟體包,然後在終端運行 hello-world
,查看其輸出。
總結
就這樣,你已經製作了你的第一個 PKGBUILD
!你走在了為自己甚至是為 AUR 製作實際的軟體包的路上。
有什麼問題,或者有什麼地方不對嗎?請隨時在下面的評論區發表。
via: https://itsfoss.com/create-pkgbuild/
作者:Hunter Wittenborn 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive