Node.js 软件包指南

出自 ArchWiki
Arch 软件包指南

32 位CLRCMake交叉编译DKMSEclipseElectron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由软件OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWebWine

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

软件包命名

提示: 可以使用自定义的 _pkgname 变量来代替 pkgname。此变量可以通用地定义如下:_pkgname=${pkgname#nodejs-}

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

源代码

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 的应用程序需要不同的版本用于构建打包时,可以利用 nvmAUR

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

将其添加为构建依赖项

makedepends=('npm' 'nvm')

nvmAUR 使用 NVM_DIR 环境变量 来查找其前缀,如果没有在 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 中可以看到此用法的示例。有关更多信息,请参见 PKGBUILD