Node.js package guidelines (Português)
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Fonte – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – Web – Wine
Esse documento cobre padrões e diretrizes de escrita PKGBUILDs para pacotes Node.js.
Nomenclatura de pacote
Nomes de pacote para bibliotecas do Node.js devem iniciar com um prefixo nodejs-
. Para aplicativos independentes, use apenas o nome do programa.
Usando npm
Ao instalar com npm, adicione-o como dependência de compilação:
makedepends=('npm')
Geralmente, não há necessidade de extrair o tarball:
noextract=("${pkgname}-${pkgver}.tgz")
Essa é uma função package mínima:
package() { npm install -g --prefix "${pkgdir}/usr" "${srcdir}/${pkgname}-${pkgver}.tgz" # Non-deterministic race in npm gives 777 permissions to random directories. # See https://github.com/npm/cli/issues/1103 for details. find "${pkgdir}/usr" -type d -exec chmod 755 {} + # npm gives ownership of ALL FILES to build user # https://bugs.archlinux.org/task/63396 chown -R root:root "${pkgdir}" }
Definindo um cache temporário
Quando o npm processa package.json
para compilar um pacote, ele baixa dependências para sua pasta de cache padrão em $HOME/.npm
. Para evitar encher a pasta pessoa do usuário, podemos definir temporariamente uma pasta de cache diferente com a opção --cache
.
Baixe as dependências para ${srcdir}/npm-cache
e instale-os no diretório do pacote:
npm install --cache "${srcdir}/npm-cache"
Continue com empacotamento de costume:
npm run packager
Pacote contém referência para $srcdir/$pkgdir
Infelizmente, o npm cria referências ao diretório de origem e ao diretório pkg. Este é um problema conhecido. No entanto, você pode remover essas referências manualmente, pois elas não são usadas de forma alguma.
Todas as dependências conterão uma referência a $pkgdir
, no atributo _where
. Você pode geralmente remover esses atributos com alguma magia do sed da seguinte forma:
find "$pkgdir" -name package.json -print0 | xargs -r -0 sed -i '/_where/d'
Seu pacote principal também terá outras referências. A maneira mais fácil de removê-los é remover todas as propriedades sublinhadas, mas isso não é tão fácil com o sed. Em vez disso, você pode usar jq para obter resultados semelhantes, como segue:
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"
Outro lugar onde você pode encontrar referências a $pkgdir
são os atributos man
dos pacotes. Se você não se importa com as páginas man (elas não serão instaladas para dependências de qualquer maneira), você pode excluí-las assim:
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
Um exemplo de todas essas três técnicas pode ser visto em readability-cliAUR.
Usando nvm
Quando um aplicativo baseado em node.js requer uma versão diferente para compilamento ou empacotamento, nvmAUR pode ser aproveitado.
Adicione-o como uma dependência de compilação:
makedepends=('npm' 'nvm')
nvmAUR usa a variável de ambiente NVM_DIR
para procurar por seu prefixo, que é definido com $HOME/.nvm
se não especificado antes da inicialização do nvmAUR.
Você pode usar a seguinte função para criar e isolar seu prefixo personalizado da localização do usuário:
_ensure_local_nvm() { # lets 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 ] }
Esta função deve ser chamada antes de interagir com nvmAUR, npm ou outros programas baseados em node.js que devem usar a versão especificada.
Exemplo de uso em um PKGBUILD
prepare() { _ensure_local_nvm nvm install 14.15.0 } build() { _ensure_local_nvm npm install }
Alternativamente, nvm install
padrão vai procurar por uma string de versão no arquivo .nvrc
no diretório atual.
Um exemplo deste uso pode ser visto no insomniaAUR.