Node.js 软件包指南
32 位 – CLR – CMake – 交叉编译 – DKMS – Eclipse – Electron – 字体 – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由软件 – OCaml – Perl – PHP – Python – R – Ruby – Rust - 安全 – Shell – VCS – Web – Wine
本文档涵盖了关于为 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 ]] }
此函数应在与 nvmAUR、npm 或任何其他应使用指定版本的基于 Node.js 的程序交互之前调用。
PKGBUILD 用法示例
prepare() { _ensure_local_nvm nvm install 14.15.0 } build() { _ensure_local_nvm npm install }
或者,裸 nvm install
将在当前目录的 .nvrc
文件中查找版本字符串。