32 位 – CLR – CMake – DKMS – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – 交叉編譯工具 – KDE – Lisp – Meson – MinGW – 內核模塊 – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – Web – Wine – 字體
本文檔包含了給 Node.js 軟體包編寫 PKGBUILD 的規範與指導。
軟體包命名
_pkgname 代替 pkgname,一般這個變量可以這樣定義: _pkgname=${pkgname#nodejs-}
Node.js 庫的軟體包名應該以 nodejs- 開頭。對於獨立的應用,只使用程序名。
原始碼
npm 提供了可靠的命名規範和下載 URL。PKGBUILD#source source=() 列表可以使用下面的 URL 模板:
https://registry.npmjs.org/$_pkgname/-/$_pkgname-$pkgver.tgz
使用 npm
使用 npm 安裝時,應當將其添加為構建時依賴。
makedepends=('npm')
不需要解壓壓縮包:
noextract=("${_pkgname}-${pkgver}.tgz")
這是一個最小的 package 函數:
package() {
npm install -g --prefix "${pkgdir}/usr" "${srcdir}/${_pkgname}-${pkgver}.tgz"
# npm 会把所有文件的所有权交给构建用户
# https://bugs.archlinux.org/task/63396
chown -R root:root "${pkgdir}"
}
設置臨時緩存
當 npm 處理 package.json 時,npm 會為了構建軟體包,下載依賴到默認的緩存目錄 $HOME/.npm。為了避免污染用戶的 home 目錄,可以用 --cache 選項,將緩存目錄臨時設為其他目錄。
下載依賴到 ${srcdir}/npm-cache,然後安裝它們到打包目錄:
npm install --cache "${srcdir}/npm-cache"
繼續正常打包:
npm run packager
軟體包包含向 $srcdir/$pkgdir 的引用
很不幸,npm 會創建指向 $srcdir 和 $pkgdir 的引用。這是一個已知問題。但你可以手動刪除這些引用,反正也不會用到它們。
所有依賴都會在 _where 屬性裡,包含指向 $pkgdir 的引用,你通常可以用一點 sed 魔法刪除它們:
find "$pkgdir" -name package.json -print0 | xargs -r -0 sed -i '/_where/d'
你的主軟體包也會包含一些其他引用,刪除它們最簡單的辦法就刪除所有有下劃線的屬性,但用 sed 不是很方便。你可以使用 jq包 得到想要的結果:
local tmppackage="$(mktemp)"
local pkgjson="$pkgdir/usr/lib/node_modules/$_pkgname/package.json"
jq '.|=with_entries(select(.key|test("_.+")|not))' "$pkgjson" > "$tmppackage"
mv "$tmppackage" "$pkgjson"
chmod 644 "$pkgjson"
另一個你會找到對 $pkgdir 引用的地方,是軟體包的 man 屬性。如果你不在乎 man 頁面(反正它們不會被作為依賴安裝),你可以像這樣刪除它們:
find "$pkgdir" -type f -name package.json | while read pkgjson; do
local tmppackage="$(mktemp)"
jq 'del(.man)' "$pkgjson" > "$tmppackage"
mv "$tmppackage" "$pkgjson"
chmod 644 "$pkgjson"
done
一個使用了上面全部三個技巧的例子:readability-cliAUR。
使用 nvm
當一個基於 node.js 的應用需要構建或打包使用不同的 node.js 版本時,可以使用 nvmAUR。
把它加入構建時依賴:
makedepends=('npm' 'nvm')
nvmAUR 使用 NVM_DIR 環境變量來查找前綴(譯註:指 nvm 的安裝路徑,下同)。如果不在 nvmAUR 初始化前指定,前綴就會被設置為 $HOME/.nvm。
你可以用下面的函數創建自定義前綴,並將用戶目錄和前綴隔離開:
_ensure_local_nvm() {
# let's be sure we are starting clean
which nvm >/dev/null 2>&1 && nvm deactivate && nvm unload
export NVM_DIR="${srcdir}/.nvm"
# The init script returns 3 if version specified
# in ./.nvrc is not (yet) installed in $NVM_DIR
# but nvm itself still gets loaded ok
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
}
應該在使用 nvmAUR、npm包 或其他基於特定版本 Node.js 的程序前,調用這個函數。
示例 PKGBUILD 用法
prepare() {
_ensure_local_nvm
nvm install 14.15.0
}
build() {
_ensure_local_nvm
npm install
}
或者,執行不帶參數的 nvm install,會在當前目錄的 .nvrc 文件中查找版本字符串。
這個用法的一個例子可以在 insomniaAUR 找到。