web-dev-qa-db-fra.com

Différence entre `npm link x` et` npm install / path / to / x`

Je pensais avoir compris la différence entre

npm link x

et

npm install /local/path/to/x

à l'origine, je pensais que le premier avait créé un lien symbolique vers x, tandis que le second avait installé une copie distincte de x dans votre projet, au lieu de le créer en lien symbolique.

Cependant, j'ai récemment remarqué que mon impression d'origine était fausse, et ils semblent tous les deux utiliser des liens symboliques - donc y a-t-il une différence entre les deux et quelle est-elle?

28
Alexander Mills

n article sur Medium par Alex Mills le met à nu.

Il indique la différence entre npm link x et npm install /local/path/to/x sont:

  1. La grande différence est que npm install /local/path/x exécutera les crochets de préinstallation/post-installation, mais npm link x ne le sera pas.

  2. npm link utilise l'espace NPM global, npm install /local/path/x ne fait pas. Le lien npm crée un lien symbolique vers x dans l'espace global, puis lorsque vous appelez le lien npm x à partir de y, il crée un lien symbolique non pas directement vers x, mais plutôt vers le lien symbolique global. Il s'agit d'une différence importante si vous utilisez différentes versions globales de node.js, par exemple NVM.

  3. npm install /absolute/path/x modifiera package.json, npm link x ne fait pas.

Pour obtenir une nouvelle copie locale au lieu d'un lien symbolique, utilisez npm pack, ainsi:

tgz="$PWD/$(npm pack)"
cd <other project>
npm install "$tgz"

Vous pouvez également utiliser cp/rsync, mais cela n'exécutera pas les hooks d'installation ni ne mettra les exécutables dans node_modules/.bin...Ça marchera.

17
Alexander Mills

lien npm

npm link
npm link <folder>

Les deux commandes ci-dessus créeront un lien symbolique de <folder> dans les packages globaux.

À présent npm link <folder> aura le même lien symbolique dans votre node_modules dossier également pour votre projet en cours. Et ces noms seraient basés sur le nom du projet dans package.json et non basé sur le nom du dossier que vous liez

Le package.json de votre projet actuel ne sera ni modifié ni modifié

Les dépendances du paquet seront toujours installées comme vous pouvez le voir dans le code ici

https://github.com/nodejs/node/blob/31d5bdea70e44802918d6f4aa7c378bc1992be54/deps/npm/lib/link.js#L156

Donc, pour résumer

  1. Il crée un lien symbolique dans le dossier global (toujours)
  2. Cela ne modifie pas le package.json
  3. Il n'installe aucune des dépendances manquantes

Installation npm

À présent npm install <folder> est un peu différent de cela

  1. Il ne crée pas de lien symbolique dans le dossier global
  2. Il modifie et ajoute la référence à package.json
  3. Il crée un lien symbolique vers le dossier d'origine
5
Tarun Lalwani