Node.js 打包準則 - Arch Linux 中文维基

跳至內容

# Node.js 打包準則

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Node.js package guidelines，最近一次同步於 2021-03-12，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

Arch 打包準則

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 – Shell – 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 找到。

分類：​

- Arch 打包準則

Node.js 打包準則
新增話題