Node.js 打包準則
32 位 – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – 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 找到。