# Helpers nvm pour nodejs

**URL:** https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807
**Category:** Apps packaging
**Tags:** french, english
**Created:** [April 23, 2017, 9:44pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807 "2017-04-23T21:44:55Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![Maniack\_Crudelis](https://forum.yunohost.org/user_avatar/forum.yunohost.org/maniack_crudelis/32/13_2.png) [@Maniack\_Crudelis](https://forum.yunohost.org/u/Maniack_Crudelis)
#### Post date: [April 23, 2017, 9:44pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/1 "2017-04-23T21:44:56Z")

</div>

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](https://github.com/creationix/nvm)

L’ensemble de la pull request mettant en place nvm est disponible [ici](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/commit/9570e5d8109f8141c8be391e6a4a60e8400d7d69).

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

- [ynh\_install\_nodejs](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/_common.sh#L358-L386): 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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/_common.sh#L345-L356): 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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/_common.sh#L388-L406): 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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/install#L94) 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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/install#L148) à 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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/scripts/install#L184).

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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/9570e5d8109f8141c8be391e6a4a60e8400d7d69/conf/systemd.service#L10)

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

---

<div class="post-metadata">

### Author: ![Maniack\_Crudelis](https://forum.yunohost.org/user_avatar/forum.yunohost.org/maniack_crudelis/32/13_2.png) [@Maniack\_Crudelis](https://forum.yunohost.org/u/Maniack_Crudelis)
#### Post date: [June 16, 2017, 4:19pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/2 "2017-06-16T16:19:32Z")

</div>

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](https://github.com/tj/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](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/commit/77e207c3b6dd34a8be8e22760f39488abe0f38bf) de etherpad.  
Et plus précisément [ici](https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/a3843b91f44e465d84da74d7ca7b8d8f45b6af2d/scripts/_common.sh#L216-L308)

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

---

<div class="post-metadata">

### Author: ![ZeHiro](https://forum.yunohost.org/user_avatar/forum.yunohost.org/zehiro/32/935_2.png) [@ZeHiro](https://forum.yunohost.org/u/ZeHiro)
#### Post date: [October 25, 2017, 2:01pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/3 "2017-10-25T14:01:24Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Maniack\_Crudelis](https://forum.yunohost.org/user_avatar/forum.yunohost.org/maniack_crudelis/32/13_2.png) [@Maniack\_Crudelis](https://forum.yunohost.org/u/Maniack_Crudelis)
#### Post date: [October 25, 2017, 6:34pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/4 "2017-10-25T18:34:49Z")

</div>

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

> <https://github.com/YunoHost-Apps/etherpad_mypads_ynh/blob/8bf300413ec3adcb416d168d2e9e98975dd9405b/scripts/_common.sh#L59-L221>

---

<div class="post-metadata">

### Author: ![rigelk](https://forum.yunohost.org/user_avatar/forum.yunohost.org/rigelk/32/1095_2.png) [@rigelk](https://forum.yunohost.org/u/rigelk)
#### Post date: [February 27, 2018, 1:10pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/5 "2018-02-27T13:10:26Z")

</div>

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](https://github.com/YunoHost-Apps/peertube_ynh/issues/2#issuecomment-368853886). Mais peut-être est-ce dû à une erreur de ma part.

---

<div class="post-metadata">

### Author: ![Aleks](https://forum.yunohost.org/user_avatar/forum.yunohost.org/aleks/32/1704_2.png) [@Aleks](https://forum.yunohost.org/u/Aleks)
#### Post date: [February 27, 2018, 1:16pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/6 "2018-02-27T13:16:38Z")

</div>

Salut,

tu peux eventuellement regarder ici : [https://github.com/YunoHost-Apps/Experimental\_helpers/blob/master/ynh\_install\_nodejs/ynh\_install\_nodejs](https://github.com/YunoHost-Apps/Experimental_helpers/blob/master/ynh_install_nodejs/ynh_install_nodejs)

Par exemple, l’app wekan\_ynh s’en sert.

---

<div class="post-metadata">

### Author: ![SylvainCecchetto](https://forum.yunohost.org/user_avatar/forum.yunohost.org/sylvaincecchetto/32/931_2.png) [@SylvainCecchetto](https://forum.yunohost.org/u/SylvainCecchetto)
#### Post date: [October 16, 2019, 11:19am UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/7 "2019-10-16T11:19:01Z")

</div>

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 :

```auto
ynh_install_nodejs --nodejs_version="10"

```

Et après un :

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

```

qui se change en :

```auto
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](https://paste.yunohost.org/giluneyuri.sql)

Merci d’avance pour votre aide !

---

<div class="post-metadata">

### Author: ![Aleks](https://forum.yunohost.org/user_avatar/forum.yunohost.org/aleks/32/1704_2.png) [@Aleks](https://forum.yunohost.org/u/Aleks)
#### Post date: [October 16, 2019, 11:37am UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/8 "2019-10-16T11:37:59Z")

</div>

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

> <https://github.com/YunoHost-Apps/wekan_ynh/blob/master/scripts/install#L77>

---

<div class="post-metadata">

### Author: ![SylvainCecchetto](https://forum.yunohost.org/user_avatar/forum.yunohost.org/sylvaincecchetto/32/931_2.png) [@SylvainCecchetto](https://forum.yunohost.org/u/SylvainCecchetto)
#### Post date: [October 16, 2019, 11:38am UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/9 "2019-10-16T11:38:52Z")

</div>

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

---

<div class="post-metadata">

### Author: ![SylvainCecchetto](https://forum.yunohost.org/user_avatar/forum.yunohost.org/sylvaincecchetto/32/931_2.png) [@SylvainCecchetto](https://forum.yunohost.org/u/SylvainCecchetto)
#### Post date: [October 16, 2019, 1:10pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/10 "2019-10-16T13:10:19Z")

</div>

I finally found a workaround that seems to work by using

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

```

instead of

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

```

---

<div class="post-metadata">

### Author: ![Aleks](https://forum.yunohost.org/user_avatar/forum.yunohost.org/aleks/32/1704_2.png) [@Aleks](https://forum.yunohost.org/u/Aleks)
#### Post date: [October 16, 2019, 2:15pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/11 "2019-10-16T14:15:15Z")

</div>

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

---

<div class="post-metadata">

### Author: ![SylvainCecchetto](https://forum.yunohost.org/user_avatar/forum.yunohost.org/sylvaincecchetto/32/931_2.png) [@SylvainCecchetto](https://forum.yunohost.org/u/SylvainCecchetto)
#### Post date: [October 16, 2019, 2:26pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/12 "2019-10-16T14:26:53Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![Krakinou](https://forum.yunohost.org/user_avatar/forum.yunohost.org/krakinou/32/1702_2.png) [@Krakinou](https://forum.yunohost.org/u/Krakinou)
#### Post date: [May 14, 2020, 6:30pm UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/13 "2020-05-14T18:30:41Z")

</div>

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 :

```auto
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?

---

<div class="post-metadata">

### Author: ![Krakinou](https://forum.yunohost.org/user_avatar/forum.yunohost.org/krakinou/32/1702_2.png) [@Krakinou](https://forum.yunohost.org/u/Krakinou)
#### Post date: [May 21, 2020, 9:27am UTC](https://forum.yunohost.org/t/helpers-nvm-pour-nodejs/2807/14 "2020-05-21T09:27:02Z")

</div>

Same issue with Package\_check in 3.8
