Dépendance locale dans package.json

453

Je veux faire quelque chose comme ça, alors npm installinstalle également package.jsondes ../somelocallibou plus important encore ses dépendances.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
user1680104
la source

Réponses:

583

npm> = 2.0.0

Cette fonctionnalité a été implémentée dans la version 2.0.0 de npm. Exemple:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

L'un des chemins suivants est également valide:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Le package local sera copié dans le préfixe ( ./node-modules).

npm <2.0.0

Mettez somelocallibcomme dépendance dans votre package.jsoncomme d'habitude:

"dependencies": {
  "somelocallib": "0.0.x"
}

Ensuite, exécutez npm link ../somelocallibet npm installera la version sur laquelle vous travaillez en tant que lien symbolique .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Référence: lien (1)

danilopopeye
la source
3
Comment pouvons-nous le dissocier?
AtaurRehman Asad
13
L'inconvénient de l'installation de packages locaux avec "npm link" est que vous obtenez beaucoup de duplication de modules. Lorsque vous répertoriez vos dépendances avec "module: version" ou "module: git-repo", l'algorithme d'installation npm évite d'installer un package déjà installé dans un package parent. Donc, avec "npm link", si votre application principale dépend de "[email protected]" et que tous vos packages locaux dépendent également de "[email protected]", vous terminerez avec tous les packages locaux en installant "[email protected]. 0 "au lieu d'utiliser la même version" async "installée de l'application principale. Cela ne se produit pas en utilisant le "dossier d'installation npm".
Pedro Ballesteros
3
@PedroBallesteros, vous pouvez utiliser le npm deduppour résoudre ce problème. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye
4
"Le paquet local sera copié ..." ne semble pas être le cas avec une version npm plus récente. Maintenant, un lien symbolique est créé.
tsauerwein
2
@danilopopeye Selon la description docs.npmjs.com/cli/install npm install <folder> , installez le package dans le répertoire en tant que lien symbolique dans le projet en cours.
Herman J. Radtke III
211

Il est désormais possible de spécifier package.jsondirectement les chemins d'installation du module Node local dans votre . De la documentation:

Chemins locaux

Depuis la version 2.0.0, vous pouvez fournir un chemin vers un répertoire local contenant un package. Les chemins locaux peuvent être enregistrés en utilisant npm install -Sou npm install --save, en utilisant l'un de ces formulaires:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

dans ce cas, ils seront normalisés à un chemin relatif et ajoutés à votre package.json. Par exemple:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Cette fonctionnalité est utile pour le développement local hors ligne et la création de tests qui nécessitent l'installation de npm là où vous ne voulez pas toucher un serveur externe, mais ne doit pas être utilisée lors de la publication de packages dans le registre public.

Michael Trouw
la source
23
Dans npm v.3 +, la normalisation est absolue, pas relative , vous verrez donc quelque chose comme"bar": "file:///home/user/src/foo/bar"
Ron Wertlen
27
Comment mettre à jour la dépendance du chemin local sans incrémentation de version?
Bohdan Lyzanets
3
Soit dit en passant, cela provoque toutes sortes de problèmes lorsque et / ou si vous essayez de docker votre application de noeud, car les node:onbuildimages standard copient uniquement le répertoire en cours et ne contiennent donc rien ../foo.
donmartin
4
existe-t-il un moyen d'intégrer cela à git + ssh afin que l'on puisse avoir une copie locale du référentiel git d'où ils npm installproviennent ou un autre référentiel git sur le LAN? Lorsque j'essaie l'installation ci-dessus et npm à partir de git + ssh, il semble regarder dans le répertoire node_modules et ne pas essayer de passer en revue git + ssh même si c'est ainsi que j'installe le package de niveau supérieur.
Michael
1
Installation du travail. Mais de cette façon, j'obtiendrai "ERR non trouvé" lorsque j'essayerai d'importer le module dans mon projet.
C4d
87

Cela fonctionne pour moi.

Placez ce qui suit dans votre fichier package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
Brian McAuliffe
la source
4
Merci pour la suggestion qui ne nécessite pas l'utilisation de "lien npm"
ItalyPaleAle
Il a été supprimé .gitignoredans le dossier du module, créé .npmignoreet la première fois que je l'ai exécuté, il a appliqué 777 de manière récursive sur tous les dossiers sauf node_modules. Mais oui, il a installé les dépendances. Utilisation de npm version 1.4.14.
L0LN1NJ4
utilisé cela, mais au lieu de jouer avec node_modules, j'ai utilisé app_modules
catalint
1
Pourquoi ne pas "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets
1
Je suis d'accord avec @Bohdan ici. les dépendances locales feront exactement la même chose. L'avantage de l'utilisation npm linkest que vous n'avez pas besoin de le faire à npm installchaque fois pour mettre à jour vos dépendances.
froginvasion
30

Si vous souhaitez automatiser davantage cela, car vous vérifiez votre module dans le contrôle de version et ne voulez pas vous fier aux développeurs qui se souviennent du lien npm, vous pouvez l'ajouter à votre section "scripts" de package.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Cela semble au-delà du hacky, mais cela semble "fonctionner". Vous avez obtenu l'astuce de ce numéro npm: https://github.com/npm/npm/issues/1558#issuecomment-12444454

Taytay
la source
15
Pourquoi postinstallet postupdateau lieu de preinstallet preupdate?
plié à droite le
1
Pourriez-vous expliquer un peu plus ce que cela fait. c'est-à-dire que si je configure un projet vscode avec plusieurs dossiers racine (c'est-à-dire "espace de travail multi-racine"), sera-t-il capable de refléter immédiatement les changements dans le dossier du module pour les projets consommateurs? - C'est à ça que sert ce hack?
bvdb
26

Voici comment vous allez ajouter des dépendances locales:

npm install file:src/assets/js/FILE_NAME

Ajoutez-le à package.json depuis NPM:

npm install --save file:src/assets/js/FILE_NAME

Ajoutez directement à package.json comme ceci:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....
sreekanth
la source
6

Projet de master

Voici le package.json que vous utiliserez pour le projet maître:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Là, se ./somelocallibtrouve la référence au dossier de la bibliothèque par rapport au projet maître package.json .

Référence: https://docs.npmjs.com/files/package.json#local-paths


Sous projet

Gérez vos dépendances de bibliothèque.

En plus de courir npm install, vous devrez courir (cd node_modules/somelocallib && npm install).

Il s'agit d'un bogue connu avec NPM.

Référence: https://github.com/npm/npm/issues/1341 (recherche d'une référence plus à jour)


Notes pour Docker

Enregistrez votre maître package.locket votre somelocallib/package.lockdans votre gestionnaire de code source.

Ensuite, dans votre Dockerfile, utilisez:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

J'utilise des parenthèses dans mes (cd A && B)constructions pour rendre l'opération idempotente.

William Entriken
la source
3

Je sais que ça npm install ../somelocallibmarche.

Cependant, je ne sais pas si la syntaxe que vous montrez dans la question fonctionnera ou non package.json...

Malheureusement, doc semble ne mentionner que l'URL comme dépendance.

Essayez de file:///.../...tar.gzpointer vers une bibliothèque locale zippée ... et dites-nous si cela fonctionne.

SALUT
la source
1
J'ajoute "dependencies": {"somemodule": "file: ///./internal_modules/somemodule"} à package.json. Ça ne marche pas. Le code d'erreur est "npm ERR! Code E404".
Jeffrey
2

Cela a fonctionné pour moi: d'abord, assurez-vous que les répertoires npm ont le bon utilisateur

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Ensuite, votre lien dans votre package.json le répertoire

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}
Sofia
la source
2
Les liens symboliques sur Windows sont possibles depuis XP en.wikipedia.org/wiki/NTFS_symbolic_link . Ouvrez la ligne de commande en tant qu'administrateur, puis exécutez npm install.
sod
2

En fait, à partir de npm 2.0, il existe désormais un support pour les chemins locaux (voir ici ).

damirv
la source
8
Michael Trouw a déjà donné cette réponse quelques semaines auparavant, alors pourquoi dupliquer?
Dan Dascalescu
2

Curieux ..... au moins sur Windows (mon npm est 3. quelque chose), je devais faire:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Quand je l'ai fait, npm install ../module1 --savecela a abouti à des chemins absolus et non relatifs selon la documentation.

Je me suis encore un peu amusé et j'ai déterminé que ../xxxc'était suffisant.

Plus précisément, j'ai vérifié les modules de nœud local pour dire d: \ build \ module1, d: \ build \ module2 et mon projet de nœud (application) dans d: \ build \ nodeApp.

Pour «installer», je:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

package.json de module1 a une dépendance de "module2": "../module2"; module2 n'a aucune dépendance locale; nodeApp a les dépendances "module1": "../module1" et "module2": "../module2".

Je ne sais pas si cela ne fonctionne que pour moi car les 3 dossiers (module1, module2 et nodeApp) se trouvent au même niveau .......

Paul Duncan
la source