web-dev-qa-db-fra.com

Dois-je avoir Travis cache node_modules ou $ HOME / .npm

Je suis assez confus quant au répertoire optimal pour la mise en cache. J'ai vu à la fois utilisé et recommandé, mais aucune comparaison réelle quant à pourquoi aller dans un sens ou dans l'autre.

Par exemple, le Travis bloglui-même recommande:

cache:
  directories:
    - node_modules

Cependant, milliers de lieux utilisez plutôt ceci:

cache:
  directories:
    - $HOME/.npm

Alors pourquoi utiliser l'un sur l'autre, et pourquoi ne pas inclure les deux?

30
balupton

J'ai remarqué la mise en cache du node_modules le dossier a causé des problèmes (la construction échoue) lors de la mise en cache du .npm le cache l'a évité. Je crois que c'est parce que le .npm le cache ne stocke pas les modules natifs compilés tandis que le node_modules dossier fait. Ainsi, lorsque vous testez différentes versions de node, comme cela est courant dans Travis-CI, il essaiera de charger un module natif compilé pour par exemple node 4 dans node 6 et barf .

25

Suivez la réponse de @ John.

Pour respecter strictement les dépendances du package sur package-lock.json, le processus d'installation de npm sur Travis CI utilise désormais par défaut le nouveau npm ci (ci signifie intégration continue je pense) au lieu de npm install. Cela permet d'éviter l'installation de packages qui ne suivent pas le bon contrôle de version sémantique.

Pour faire ça, npm ci doit d'abord se débarrasser du graphe des dépendances et de tous les modules compilés en cache dans node_modules à partir des versions précédentes afin de restructurer le graphe des dépendances. Il le fait en supprimant node_modules entièrement avant de commencer ses propres installations. Mais cela signifie aussi node_modules ne peut plus être utilisé comme emplacement de cache sur Travis. Nous devons maintenant utiliser "$HOME/.npm" pour mettre en cache, et @John a expliqué la raison en utilisant "$ HOME/.npm". Travis vous enverra une erreur en vous plaignant "/node_modules/.bin/npm cannot be found" si vous continuez à utiliser node_modules comme emplacement de cache, puisque node_modules a été supprimé lors de l'exécution de npm ci.

Maintenant, concernant l'emplacement du cache à utiliser ...

1. "$ HOME/.npm"

Lorsque vous souhaitez utiliser le désormais par défaut npm ci, incluez ces modifications dans votre .travis.yml

# [optional] `npm ci` is now default on Travis
install:
- npm ci

# Keep the npm cache around to speed up installs
cache:
  directories:
  - "$HOME/.npm"

2. "node_modules"

Si vous souhaitez vous en tenir à l'ancien npm install

# Specify `npm install`
install:
- npm install

# Continue to use the old cache location
cache:
  directories:
  - "node_modules"

Avertissement: l'emplacement du cache est utilisé strictement selon la méthode d'installation et ne peut pas être lié à un autre. Sinon, vous perdriez les avantages de la mise en cache ou, pire encore, une construction Travis échouée. J'espère que cela répond à votre question.

Vous pouvez en savoir plus sur npm ci le doc officiel

7
Hank Chan