Installer un module local en utilisant npm?

419

J'ai un dépôt de module téléchargé, je veux l'installer localement, pas globalement dans un autre répertoire?

Quelle est la manière la plus simple de procéder?

fantaisie
la source

Réponses:

481

De la documentation npm-link :

Dans le répertoire du module local:

$ cd ./package-dir
$ npm link

Dans le répertoire du projet pour utiliser le module:

$ cd ./project-dir
$ npm link package-name

Ou en une seule fois en utilisant des chemins relatifs:

$ cd ./project-dir
$ npm link ../package-dir

Cela équivaut à utiliser deux commandes ci-dessus sous le capot.

Rich Apodaca
la source
14
C'est la seule approche sensée que j'ai vue jusqu'à présent - pourquoi npm doit être si obscur / obtus. en ce qui concerne la création d'un package local, son installation puis son utilisation, je ne sais pas ... le lien fonctionne, (et c'est génial), mais la terminologie est plutôt confuse.
smaudet
6
@Rich Apodaca, merci pour le lien doc. Il ne mentionne pas l'annulation du processus. Il semble que tout ce qu'il fait est de créer des liens symboliques, donc je peux les supprimer normalement?
Tyler Collier
1
@TylerCollier npm unlink semble être l'opération d'image miroir stackoverflow.com/a/24940024/54426
Rich Apodaca
1
Juste une note, si vous utilisez Angular2 (ou peut-être d'autres applications?), Il y a un certain buzz autour de la liaison npm comme cause principale d'un type spécifique de problème. Exemple ici et ici
The Red Pea
4
Cependant, gardez à l'esprit que npm linkcela créera une deuxième instance de dépendances externes. Donc, si vous avez un package A besoin de B et C, B a besoin de C. relier B entraînera l'application A pour avoir deux instances de C.
user2167582
422

vous fournissez un seul <folder>argument à npm install, argument doit pointer vers le dossier local au lieu du nom du package:

npm install /path
fantaisie
la source
5
Contrairement au lien, cela utilise .npmignore.
Camille Wintz
30
@bithavoc Au moins à partir de npm 5, l'installation d'un dossier crée maintenant un lien symbolique, pas une copie. Voir docs.npmjs.com/cli/install
Frank Tan
3
J'ai essayé d'utiliser cette méthode, mais mon module ne peut pas trouver ses pairs pairs.
Witalo Benicio
1
c'est bien rm -rf node_modulesavant et npm installaprès avoir exécuté le script de la réponse.
Renato Back
3
@FrankTan Oui, mais comment retrouver l'ancien comportement? Je veux la copie!
Michael
151

Depuis que la même personne m'a demandé et répondu, je vais ajouter un lien npm comme alternative.

à partir de documents:

C'est pratique pour installer vos propres trucs, afin que vous puissiez y travailler et le tester de manière itérative sans avoir à reconstruire continuellement.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Modifier] Depuis NPM 2.0, vous pouvez déclarer des dépendances locales dans package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W
la source
11
Ce n'est peut-être pas l'intention originale de la question, mais c'est probablement ce que la plupart des gens qui trouvent cela via Google veulent.
Dusty J
1
Cette réponse semble incomplète, vous devez exécuter npm linkle dossier une fois (pour créer un lien symbolique global), puis l'exécuter npm link package-namedans le dossier du projet (pour utiliser le lien symbolique global dans votre projet). La réponse ci-dessous est la bonne réponse.
Thomas Potaire
8
@ThomasPotaire les deux réponses sont correctes. Si vous regardez la documentation du lien npm, elle présente les deux méthodes, avec cette approche de répertoire relative comme raccourci.
MJ
1
La deuxième méthode (en utilisant l' file:approche) a permis à mon application et au module local de partager une dépendance. Mon test a npm linkabouti à une dépendance en double, ce qui casse les choses si la dépendance doit être utilisée comme singleton.
Daniel Waltrip
J'avais un package local (disons package1), package2 a une dépendance mentionnée avec le chemin relatif de package1. npm je n'installe pas le paquet lorsque le chemin relatif commence par "file: ../../ package1", fonctionne quand il est '' ../../package1 ", est-ce que l'ajout de fichier au début signifie autre chose?
Dip686
17

npm pack + package.json

C'est ce qui a fonctionné pour moi:

ÉTAPE 1: Dans module project, exécutez npm pack:

Cela va créer un <package-name>-<version>.tar.gzfichier.

ÉTAPE 2: déplacez le fichier vers consumer project

Idéalement, vous pouvez placer tous ces fichiers dans un tmpdossier à votre consumer-projectracine:

ÉTAPE 3: Référez-le dans votre package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

ÉTAPE 4: Installles packages:

npm installou npm iouyarn

Maintenant, votre package serait disponible dans votre consumer-project's node_modulesdossier.

Bonne chance...

Akash
la source
10

Aucune de ces approches ( npm linkou package.jsondépendance de fichier) ne fonctionne si le module local a des dépendances d'homologue que vous souhaitez uniquement installer dans la portée de votre projet.

Par exemple:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

Dans ce scénario, met en place NPM myprojectest node_modules/comme ceci:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Lorsque le nœud se charge mymoduleet qu'il le fait require('foo'), le nœud résout le mymodulelien symbolique, puis recherche uniquement /local/mymodule/node_modules/(et ses ancêtres) fooce qu'il ne trouve pas. Au lieu de cela, nous voulons que le nœud regarde /local/myproject/node_modules/, car c'est à partir de là que notre projet était exécuté et où il fooest installé.

Donc, soit nous avons besoin d'un moyen de dire à node de ne pas résoudre ce lien symbolique lors de la recherche foo, soit nous avons besoin d'un moyen de dire à npm d'installer une copie du mymodulemoment où la syntaxe de dépendance de fichier est utilisée dans package.json. Je n'ai pas trouvé de moyen non plus, malheureusement :(

Paul Medynski
la source
J'ai trouvé une solution de contournement, qui consiste à définir NODE_PATHpour pointer vers l' node_modules/endroit où fooest installé. Donc pour le cas ci-dessus, ce serait ceci: NODE_PATH=/dev/myproject/node_modules/ Cela permet mymodulede trouver foo.
Paul Medynski
Il y a une solution pour. Placez les modules de dépendance dans le dossier racine du projet . Définissez vos dépendances dans package.json avec le préfixe 'file:' habituel . Do npm i Cela créera un lien symbolique dans les node_modules du projet ainsi que ses dépendances peuvent être hissées vers le toplevel node_modules comme elles le feraient pour d'autres types de dépendances. Ma version npm est la v6.14.4. Après avoir passé quelques heures à résoudre ce problème, j'ai trouvé cette solution ici: ( atmos.washington.edu/~nbren12/reports/journal/… ). Merci nbren12.
sasebot
J'avais le même problème. J'ai trouvé cette réponse: stackoverflow.com/questions/50807329/… , cela résout mon problème avec les dépendances entre pairs et les bibliothèques locales.
theawless
0

Vous manquez la propriété principale?

Comme les personnes précédentes l'ont répondu npm --save ../location-of-your-packages-root-directory. Le ../location-of-your-packages-root-directorydoit cependant avoir deux choses pour que cela fonctionne.

1) package.jsondans ce répertoire pointé vers

2) la mainpropriété dans le package.jsondoit être définie et fonctionne ig "main": "src/index.js",si le fichier d'entrée pour ../location-of-your-packages-root-directoryest../location-of-your-packages-root-directory/src/index.js

K - La toxicité du SO augmente.
la source