Node.js 打包準則

出自 Arch Linux 中文维基
Arch 打包準則

32 位CLRCMakeCrossDKMSEclipseElectronFontFree PascalGNOMEGoHaskellJavaKDEKernelLispMesonMinGWNode.jsNonfreeOCamlPerlPHPPythonRRubyRustVCSWebWine

本文檔包含了給 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 ]]
}

應該在使用 nvmAURnpm 或其他基於特定版本 Node.js 的程序前,調用這個函數。

示例 PKGBUILD 用法[編輯 | 編輯原始碼]

prepare() {
    _ensure_local_nvm
    nvm install 14.15.0
}

build() {
    _ensure_local_nvm
    npm install
}

或者,執行不帶參數的 nvm install,會在當前目錄的 .nvrc 文件中查找版本字符串。

這個用法的一個例子可以在 insomniaAUR 找到。