Helpers nvm pour nodejs

Pour simplifier la gestion des packages utilisant nodejs, et éviter les conflits de version, je propose un helper permettant d’installer et d’utiliser une version précise de nodejs en utilisant nvm

L’ensemble de la pull request mettant en place nvm est disponible ici.

En détail:
Ce sont en réalité 3 helpers qui permettent de gérer la mise en place de nodejs

  • ynh_install_nodejs: Ce helper se charge d’installer nvm et d’installer la version demandée de nodejs, et la version correspondante de npm.
  • ynh_use_nodejs: Celui-ci charge une version de nodejs dans le shell courant, ce qui permettra d’utiliser la version ciblée de node et npm.
  • ynh_remove_nodejs: Ce helper sert à supprimer la version de nodejs utilisée, si elle n’est pas utilisée par une autre application. Et supprime également nvm si plus aucune app n’en dépend.

À l’usage, ynh_install_nodejs est à utiliser dans les scripts install et restore pour mettre en place nvm et nodejs.
ynh_use_nodejs, devrait être utilisé dans les autres scripts, upgrade principalement. C’est à dire dés lors que node ou npm est nécessaire sans pour autant qu’il ne soit nécessaire d’installer nodejs.

3 variables sont mises à disposition par les helpers.

  • nodejs_path qui contient le path absolu de la version de node, sous la forme /opt/nvm/vx.xx.xx/bin
    Cette variable permettra de faire des appel direct à node ou npm si nécessaire.
  • nodejs_version qui contient simplement le numéro de version de nodejs demandé pour cette app.
    Essentiellement utilisé pour construire les 2 autres variables et pour la suppression.
  • nodejs_use_version est un alias permettant de charger la version liée à l’app dans le shell courant.
    Cet alias sert essentiellement à charger la version nécessaire de nodejs en dehors des scripts YunoHost, par exemple dans un script systemd.

Il faut par contre se méfier d’un point important, nvm utilise $PATH pour mettre en avant une version de nodejs, en ajoutant simplement $nodejs_path au début de $PATH pour le shell courant.
Ceci à des contraintes si vous utiliser un autre shell, un autre utilisateur ou autre situation particulière qui se traduira par l’absence de node ou de npm.
Par exemple, sudo ne peut pas être utilisé directement, car il charge un $PATH par défaut.
De même l’usage dans systemd ne chargera pas les variables d’environnement.
Il est donc nécessaire de propager la variable $PATH

Ces helpers devrait être mis à l’épreuve dans d’autres packages utilisant nodejs avant d’être proposés en tant que helpers officiels.

5 Likes

Après mise à l’épreuve, nvm a montré ses limites en particulier en raison de la complexité de son usage. Il s’est avéré peu adapté à l’usage qu’on en fait.
En particulier, nvm est orienté vers usage global pour l’ensemble du système.

Pour cette raison les helpers nvm ont migré vers n. Qui rempli la même fonction mais est plus adapté à un usage parallèle.

Les nouveaux helper node peuvent-être trouvé sur le dernier commit de etherpad.
Et plus précisément ici

L’usage reste sensiblement le même que le précédent helper nvm.

Bonjour,

Dans le cadre de l’intégration de Kresus dans YNH, je souhairerai savoir si les helpers sont utilisables “de base”, s’il faut les copier dans le package YNH etc.

Kresus a besoin de node 4, bientôt 6, et on aimerait mettre le mon possible le bazar dans les installs node existantes.

MErci

Bonjour,

ce helper n’est pas encore passé en officiel, parce que nous préférons d’abord l’éprouver.
Donc il faut le copier dans ton package pour le moment.

Tu trouveras la dernière version ici

hello @Maniack_Crudelis - tu as des nouvelles concernant la stabilité du helper, ou une quelconque version plus à jour?

J’ai quelques soucis avec dans le cadre du packet peertube_ynh. Mais peut-être est-ce dû à une erreur de ma part.

Salut,

tu peux eventuellement regarder ici : https://github.com/YunoHost-Apps/Experimental_helpers/blob/master/ynh_install_nodejs/ynh_install_nodejs

Par exemple, l’app wekan_ynh s’en sert.

Bonjour à tous,

Je suis en train de packager une app qui utilise NodeJS donc j’utilise les helpers NodeJS sauf que je me tape un /usr/bin/env: ‘node’: No such file or directory.

Dans mon script install je fais un :

ynh_install_nodejs --nodejs_version="10"

Et après un :

sudo $nodejs_path/npm install -g --unsafe-perm  homebridge@0.4.50 homebridge-config-ui-x@4.6.2

qui se change en :

sudo /opt/node_n/n/versions/node/10/bin/npm install -g --unsafe-perm homebridge@0.4.50 homebridge-config-ui-x@4.6.2

et là je me prends le /usr/bin/env: ‘node’: No such file or directory je crois.

Je me permets de poster mon log ici : https://paste.yunohost.org/giluneyuri.sql

Merci d’avance pour votre aide !

Est-ce que rajouter un ynh_use_nodejs comme ici resoud le probleme ?

J’ai essayé aussi et pas mieux :-/

I finally found a workaround that seems to work by using

sudo PATH="$PATH" $nodejs_path/npm install -g --unsafe-perm foo

instead of

sudo $nodejs_path/npm install -g --unsafe-perm foo

Ah yes, that’s the thing about sudo not propagating $PATH … But why use sudo though ?

Good question, I didn’t write it intentionally xD
I will try without it :wink:

Edit: Works well without sudo. My bad :-/

1 Like

Hello,
Je tente d’utiliser ces helpers pour une nouvelle app que je package, et package_check me jette systématiquement lors de l’install :

2020-05-14 18:15:07,231 DEBUG    yunohost.hook <lambda> - [1186.1] ++ wget -nv -O n.tar.gz https://github.com/tj/n/archive/v4.1.0.tar.gz
2020-05-14 18:15:08,341 DEBUG    yunohost.hook <lambda> - [1186.1] + local 'out=2020-05-14 18:15:08 URL:https://codeload.github.com/tj/n/tar.gz/v4.1.0 [16332] -> "n.tar.gz" [1]'
2020-05-14 18:15:08,342 INFO     yunohost.hook <lambda> - [1186.1] [#####++.............] > Installing dependencies... [00h00m,01s]
2020-05-14 18:15:08,342 DEBUG    yunohost.hook <lambda> - [1186.1] + echo '3983fa3f00d4bf85ba8e21f1a590f6e28938093abe0bb950aeea52b1717471fc n.tar.gz'
2020-05-14 18:15:08,342 INFO     yunohost.hook <lambda> - [1186.1] Installation of N - Node.js version management
2020-05-14 18:15:08,342 DEBUG    yunohost.hook <lambda> - [1186.1] + sha256sum -c --status
2020-05-14 18:15:08,342 DEBUG    yunohost.hook <lambda> - [1186.1] + mkdir -p /opt/node_n/git
2020-05-14 18:15:08,342 DEBUG    yunohost.hook <lambda> - [1186.1] + true
2020-05-14 18:15:08,342 DEBUG    yunohost.hook <lambda> - [1186.1] + '[' tar.gz = zip ']'
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + local strip=
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + '[' true '!=' false ']'
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + '[' true == true ']'
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + local sub_dirs=1
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + strip='--strip-components 1'
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + [[ tar.gz =~ ^tar.gz|tar.bz2|tar.xz$ ]]
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] + tar -xf n.tar.gz -C /opt/node_n/git --strip-components 1
2020-05-14 18:15:08,343 DEBUG    yunohost.hook <lambda> - [1186.1] ++ find /var/cache/yunohost/from_file/scripts/../sources/patches/ -type f -name 'n-*.patch'
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] ++ wc -l
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + ((  0 > 0  ))
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + test -e /var/cache/yunohost/from_file/scripts/../sources/extra_files/n
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + cd /opt/node_n/git
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + PREFIX=/opt/node_n
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + make install
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] mkdir -p /opt/node_n/bin/
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] cp bin/n /opt/node_n/bin/n
2020-05-14 18:15:08,344 DEBUG    yunohost.hook <lambda> - [1186.1] + ynh_replace_string '--match_string=^N_PREFIX=${N_PREFIX-.*}$' '--replace_string=N_PREFIX=${N_PREFIX-/opt/node_n}' --target_file=/opt/node_n/b$
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + local legacy_args=mrf
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + args_array=([m]=match_string= [r]=replace_string= [f]=target_file=)
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + declare -Ar args_array
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + local match_string
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + local replace_string
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + local target_file
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + ynh_handle_getopts_args '--match_string=^N_PREFIX=${N_PREFIX-.*}$' '--replace_string=N_PREFIX=${N_PREFIX-/opt/node_n}' --target_file=/opt/nod$
2020-05-14 18:15:08,345 DEBUG    yunohost.hook <lambda> - [1186.1] + set +x
2020-05-14 18:15:08,447 DEBUG    yunohost.hook <lambda> - [1186.1] + local delimit=@
2020-05-14 18:15:08,447 DEBUG    yunohost.hook <lambda> - [1186.1] + match_string='^N_PREFIX=${N_PREFIX-.*}$'
2020-05-14 18:15:08,447 DEBUG    yunohost.hook <lambda> - [1186.1] + replace_string='N_PREFIX=${N_PREFIX-/opt/node_n}'
2020-05-14 18:15:08,447 DEBUG    yunohost.hook <lambda> - [1186.1] + sed --in-place 's@^N_PREFIX=${N_PREFIX-.*}$@N_PREFIX=${N_PREFIX-/opt/node_n}@g' /opt/node_n/bin/n
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + PATH=/opt/node_n/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + test -x /usr/bin/node_n
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + test -x /usr/bin/npm_n
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] ++ uname -m
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + uname=i686
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + [[ i686 =~ aarch64 ]]
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + [[ i686 =~ arm64 ]]
2020-05-14 18:15:08,448 DEBUG    yunohost.hook <lambda> - [1186.1] + n 14
2020-05-14 18:15:08,549 DEBUG    yunohost.hook <lambda> - [1186.1]
2020-05-14 18:15:08,549 DEBUG    yunohost.hook <lambda> - [1186.1]   ^[[36m   install^[[0m : ^[[2mnode-v14.2.0^[[22m^[[0m
2020-05-14 18:15:08,851 DEBUG    yunohost.hook <lambda> - [1186.1]
2020-05-14 18:15:08,852 DEBUG    yunohost.hook <lambda> - [1186.1]   ^[[31mError: invalid version '14.2.0'^[[0m
2020-05-14 18:15:08,852 DEBUG    yunohost.hook <lambda> - [1186.1]
2020-05-14 18:15:08,853 DEBUG    yunohost.hook <lambda> - [1186.1] + ynh_exit_properly
2020-05-14 18:15:08,853 DEBUG    yunohost.hook <lambda> - [1186.1] + local exit_code=1
2020-05-14 18:15:08,854 DEBUG    yunohost.hook <lambda> - [1186.1] + '[' 1 -eq 0 ']'
2020-05-14 18:15:08,854 DEBUG    yunohost.hook <lambda> - [1186.1] + trap '' EXIT
2020-05-14 18:15:08,855 DEBUG    yunohost.hook <lambda> - [1186.1] + set +eu

Pourtant, quand je le teste en direct sur ma VM, cela fonctionne sans souci.
Une idée de comment contourner le pb?

La ligne du script d’install correspondante, rien d’exceptionnel:
ynh_install_nodejs --nodejs_version=14

Side note: j’ai vu que ces helpers sont en train d’évoluer, sont-ils release dans la 3.8 ou sera-ce pour plus tard?

Same issue with Package_check in 3.8