web-dev-qa-db-fra.com

Dépendance locale dans package.json

Je veux faire quelque chose comme ceci, donc npm install installe également le package.json de ../somelocallib ou plus important encore, ses dépendances.

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

Mise à jour 2014-septembre

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

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

Les chemins suivants sont également valides:

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

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


Ancienne réponse

Mettez somelocallib comme dépendance dans votre package.json comme d'habitude:

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

Ensuite, lancez npm link ../somelocallib et npm installera la version sur laquelle vous travaillez sous forme de lien symbolique .

[email protected] /private/tmp/app
└── [email protected] -> /private/tmp/somelocallib

Référence: link (1)

492
danilopopeye

Il est maintenant possible de spécifier directement les chemins d'installation du module Node dans votre package.json. De la docs:

Chemins locaux

Depuis la version 2.0.0, vous pouvez fournir un chemin d'accès à un répertoire local contenant un package. Les chemins locaux peuvent être enregistrés en utilisant npm install -S ou npm install --save, en utilisant l’une des formes suivantes:

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

dans ce cas, ils seront normalisés en 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 hors ligne local et la création de tests nécessitant une installation de npm où vous ne voulez pas utiliser de serveur externe, mais ne doit pas être utilisé lors de la publication de packages dans le registre public.

202
Michael Trouw

Cela fonctionne pour moi.

Placez ce qui suit dans votre fichier package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
84
Brian McAuliffe

Si vous souhaitez automatiser davantage cette opération, car vous contrôlez votre module dans le contrôle de version et que vous ne voulez pas que les développeurs se souviennent de npm link, vous pouvez l'ajouter à votre section "scripts" de package.json:

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

Cela se sent au-delà du hacky, mais cela semble "fonctionner". Vous avez eu le conseil de ce numéro npm: https://github.com/npm/npm/issues/1558#issuecomment-12444454

26
Taytay

Voici comment vous allez ajouter des dépendances locales:

npm install file:src/assets/js/FILE_NAME

Ajoutez-le à package.json à partir de NPM:

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

Ajouter 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"
....
20
sreekanth
3
itsazzad

Je sais que npm install ../somelocallib fonctionne.

Cependant, je ne sais pas si la syntaxe que vous indiquez dans la question fonctionnera à partir de package.json...

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

Essayez file:///.../...tar.gz, en pointant sur une bibliothèque locale compressée ... et dites-nous si cela fonctionne.

2
H_I

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 package.json avec le répertoire

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}
2
Sofia

En fait, depuis npm 2.0, il existe maintenant un support pour les chemins locaux (voir here ).

2
damirv

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 j'ai fait un npm install ../module1 --save il en a résulté des chemins absolus et non relatifs par rapport à la documentation.

J'ai déconné un peu plus et déterminé que ../xxx était suffisant.

Plus précisément, j'ai les modules de nœud locaux extraits 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

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

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

2
Paul Duncan

Projet de master

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

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

Là, ./somelocallib est la référence au dossier de la bibliothèque par rapport au package principal du projet.json .

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


Sous projet

Gérez les dépendances de votre bibliothèque.

En plus d'exécuter npm install, vous devrez également exécuter (cd node_modules/somelocallib && npm install).

C'est un bug connu avec NPM.

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


Notes pour Docker

Enregistrez votre maître package.lock et votre somelocallib/package.lock dans votre gestionnaire de code source.

Ensuite, dans votre utilisation de Dockerfile:

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 constructions (cd A && B) pour rendre l'opération idempotente.

0
William Entriken