Node.js 包打包指南
本文档涵盖了为 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 ]]
}
在与 nvm、npm 或任何其他应使用指定版本的 Node.js 程序交互之前,应调用此函数。
示例 PKGBUILD 用法
prepare() {
_ensure_local_nvm
nvm install 14.15.0
}
build() {
_ensure_local_nvm
npm install
}
或者,裸 nvm install 会在当前目录的 .nvmrc 文件中查找版本字符串。