comment spécifier les modules locaux en tant que dépendances de package npm

269

J'ai une application qui a le jeu habituel de dépendances sur des modules tiers (par exemple 'express') spécifié dans le fichier package.json sous dépendances. Par exemple

"express"     : "3.1.1"

Je voudrais structurer mon propre code de manière modulaire et avoir un ensemble de modules locaux (c'est-à-dire sur le système de fichiers dans lequel je suis actuellement) installés par le package.json. Je sais que je peux installer un module local en exécutant:

npm install path/to/mymodule

Cependant, je ne sais pas comment y arriver via la structure de dépendances package.json. Utiliser l' --saveoption dans cette commande revient simplement à mettre "mymodule": "0.0.0"dans mon package.json (ne fait pas référence à l'emplacement du chemin de fichier). Si je supprime ensuite la version installée de node_modules et essaie de réinstaller à partir du package.json, il échoue (car il recherche "mymodule" dans le registre central et ne regarde pas localement).

Je suis sûr que c'est un moyen de dire à la "dependencies": {}structure que je veux qu'il soit installé à partir d'un chemin de système de fichiers, mais je ne sais pas comment.

quelqu'un d'autre a ce problème? Merci.

Sam Adams
la source
1
Une très bonne question. Triste de réaliser qu'il n'y a pas de caractéristique équivalente package.jsonà ce que nous avons à l' Gemfileart.
Jarl
3
doublon possible de la dépendance locale dans package.json
Kelly

Réponses:

408

npm install prend désormais en charge cette

npm install --save ../path/to/mymodule

Pour que cela fonctionne, mymoduleil faut configurer un module avec le sien package.json. Voir Création de modules NodeJS .

Depuis npm 2.0, les dépendances locales sont prises en charge de manière native. Voir la réponse de danilopopeye à une question similaire . J'ai copié sa réponse ici car cette question se classe très haut dans les résultats de recherche sur le Web.

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

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

L'un des chemins suivants est également valide:

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

synchronisation des mises à jour

Depuis les npm installcopies mymoduledans node_modules, les modifications de mymodulela source ne seront pas automatiquement vues par le projet dépendant.

Il existe deux façons de mettre à jour le projet dépendant avec

  • Mettez à jour la version de mymodulepuis utiliseznpm update : Comme vous pouvez le voir ci-dessus, l' package.jsonentrée "dépendances" n'inclut pas de spécificateur de version comme vous le verriez pour les dépendances normales. Au lieu de cela, pour les dépendances locales, npm updateessaie juste de s'assurer que la dernière version est installée, comme déterminé par mymodule's package.json. Voir la réponse de chriskelly à ce problème spécifique .

  • Réinstallez à l'aide de npm install. Cela installera tout ce qui se trouve sur mymodulele chemin source, même s'il est plus ancien, ou a une autre branche extraite, peu importe.

Randy the Dev
la source
2
Cela a fonctionné pour moi. (Je viens de faire un chemin relatif local comme"mymodule":"file:mymoduledir"
Don Rhummy
72
npm install --save ../my-local-repo
Ivan Rave
15
Et comment l'utiliser dans le projet? J'essaye de l'appeler comme import { HelloWorld } from "my-test-lib";, mais je reçois l'erreur "Cant find module". Veuillez jeter un œil à stackoverflow.com/questions/46818083/…
Vitalii Vasylenko
6
@LucioMollinedo pouvez-vous partager la syntaxe de la façon dont vous avez importé le module local? Comme avec Vitallii, j'obtiens l'erreur "Can't fine module" avecimport { HelloWorld } from "my-test-lib";
Stan James
7
Cela ne fonctionne pas de la même manière que le référencement d'un package car les dépendances ne seront pas installées sur le projet
Glass Cannon
44

Voir: Dépendance locale dans package.json

Il semble que la réponse soit npm link: https://docs.npmjs.com/cli/link

jasoncrawford
la source
5
en fait, le lien npm créera uniquement les liens symboliques et ne modifiera pas le package.json pour ajouter la dépendance locale
Sebastien H.
1
Mais si ce n'est pas le cas, symlinkcomment le projet parent saura-t-il reconstruire une fois la dépendance terminée?
Jamie Hutber
11

Je ne pouvais pas trouver un moyen soigné à la fin, alors je suis allé créer un répertoire appelé local_modulespuis j'ai ajouté ce bashscript au package.json dans scripts-> preinstall

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done
Sam Adams
la source
5

Après avoir eu beaucoup de mal avec la npm linkcommande (solution suggérée pour développer des modules locaux sans les publier dans un registre ou conserver une copie séparée dans le dossier node_modules), j'ai construit un petit module npm pour résoudre ce problème.

La correction nécessite deux étapes simples .

Première:

npm install lib-manager --save-dev

Deuxièmement, ajoutez ceci à votre package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Plus de détails sur https://www.npmjs.com/package/lib-manager . J'espère que cela aide quelqu'un.

Anurag Dutta
la source
0

S'il est acceptable de publier simplement vos modules préinstallés dans node_modules à côté de vos autres fichiers, vous pouvez le faire comme ceci:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Vous pouvez également vouloir stocker votre module sur git et dire à votre parent package.json d'installer la dépendance à partir de git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies

Platon
la source
5
Malheureusement, cela impliquerait que node_modules a mes modules locaux et les modules tiers / contribués installés à partir du registre (par exemple, connect) dans le même répertoire. En plus d'être déroutant du point de vue Git / VCS (c'est-à-dire qu'il faudrait ignorer tout dans node_modules sauf ceux que j'ai créés), c'est aussi une mauvaise pratique (ceux que j'ai écrits et ne sont pas publiés doivent être séparés de ceux que d'autres ont écrits et publiés ).
Sam Adams
Lorsque j'ajoute un module local, j'apporte des modifications qui ne sont pas visibles par mon application principale. pourquoi est-ce le cas?
Mark Tyers