跳转至内容

Node.js 包打包指南

来自 ArchWiki
Arch 软件包指南

32位CLRCMake交叉编译DKMSEclipseElectron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由应用OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWeb 应用Wine

本文档涵盖了为 Node.js 包编写 PKGBUILD 的标准和指南。

包命名

提示 可以使用自定义的 _pkgname 变量代替 pkgname。该变量通常可以定义为:_pkgname=${pkgname#nodejs-}

Node.js 库的包名应以 nodejs- 前缀开头。对于独立应用程序,只需使用程序名即可。

Source(生效配置)

npm 为下载 URL 提供了稳定的命名方案。 PKGBUILD#source source=() 数组可以使用以下 URL 模板。

https://registry.npmjs.org/$_pkgname/-/$_pkgname-$pkgver.tgz
提示 您还可以使用 npm view 获取 tarball 的位置,这对于更复杂的包规范非常有用,例如 npm view @nestjs/cli@10.1.7 dist.tarball

使用 npm

使用 npm 安装时,将其添加为构建依赖项。

makedepends=('npm')

通常也无需解压 tarball。

noextract=("${_pkgname}-${pkgver}.tgz")

这是一个最小化的 package 函数。

package() {
    npm install -g --prefix "${pkgdir}/usr" "${srcdir}/${_pkgname}-${pkgver}.tgz"
}

设置临时缓存

npm 处理 package.json 以构建包时,它会将依赖项下载到其默认缓存文件夹 $HOME/.npm。为了避免弄乱用户的主文件夹,我们可以使用 --cache 标志暂时设置一个不同的缓存文件夹。

将依赖项下载到 ${srcdir}/npm-cache 并在包目录中安装它们。

npm install --cache "${srcdir}/npm-cache" 

继续正常打包。

npm run packager

包包含对 $srcdir/$pkgdir 的引用

npm 遗憾地创建了对源目录和包目录的引用,这是一个 已知问题。不过,您可以手动删除这些引用,因为它们没有任何用途。

所有依赖项都将包含对 $pkgdir 的引用,在 _where 属性中。您通常可以使用一些 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

所有这三种技术的示例可以在 nodejs-readability-cli 的 PKGBUILD 中看到。

使用 nvm

node.js 应用程序需要不同的版本进行构建打包时,可以使用 nvm

警告 这仅适用于应用程序的构建/打包需求,不能替代运行时依赖项。

将其添加为构建依赖项。

makedepends=('npm' 'nvm')

nvm 使用 NVM_DIR 环境变量来查找其前缀,如果未指定,则在 nvm 初始化之前,它被设置为 $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 ./.nvmrc is not (yet) installed in $NVM_DIR
    # but nvm itself still gets loaded ok
    source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
}

在与 nvmnpm 或任何其他应使用指定版本的 Node.js 程序交互之前,应调用此函数。

示例 PKGBUILD 用法

prepare() {
    _ensure_local_nvm
    nvm install 14.15.0
}

build() {
    _ensure_local_nvm
    npm install
}

或者,裸 nvm install 会在当前目录的 .nvmrc 文件中查找版本字符串。

此用法的示例可以在 insomniaAUR 中看到。有关更多信息,请参阅 PKGBUILD

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.