web-dev-qa-db-fra.com

npm install: existe-t-il un moyen d'ignorer une dépendance particulière dans package.json

J'essaie actuellement de créer un conteneur Docker pour un projet node.js qui contient une dépendance locale. Cela semble causer un problème avec docker, donc comme solution de contournement, j'essaie de copier les dossiers de dépendance locaux et d'ignorer leurs entrées de dépendance dans le fichier package.json. Existe-t-il un moyen de spécifier les dépendances que j'aimerais ignorer et de faire exécuter npm install et ignorer ces entrées?

6
user1790300

Cela peut être fait en utilisant devDependencies

Les modules npm dont vous n'avez besoin que pour développer, par exemple: les tests unitaires, la transpilation de Coffeescript vers Javascript, la minification, etc., font du module requis une devDependency.

Pour ignorer l'installation de devDepenencies, passez --production drapeau à npm install,avec le --production drapeau (ou NODE_ENV variable d'environnement définie sur production) npm n'installera pas les modules répertoriés dans devDependencies. "

npm install --production

Pour que n'importe quel module fasse partie de devDependencies, passez --dev lors de l'installation.

npm install packagename --save-dev
10
RootHacker

C'est un problème courant, non seulement avec Docker, mais aussi avec certains déploiements cloud. Par exemple, le déploiement sur CloudFoundry à l'aide du buildpack Node.js standard entraînera npm install/yarn pour s'exécuter quand même. Donc, vous devrez également appliquer quelques astuces pour travailler avec des modules locaux

Si cela ne vous dérange pas de passer de NPM à Yarn pour la gestion des dépendances, vous pouvez utiliser la fonction workspaces .

Ma package.json ressemble à ça:

{

  ...

  "dependencies": {
    "some-module-i-want-to-install": "1.0.0",
    "another-module-i-want-to-install": "1.0.0",
    "@my/local-dependency-one": "1.0.0",
    "@my/local-dependency-two": "1.0.0"
  },
  "workspaces": ["packages/*"]
}

Et ma disposition source de projet a la structure suivante:

.
├── index.js
├── package.json
├── packages
│   ├── local-dependency-one
│   │   ├── index.js
│   │   └── package.json
│   └── local-dependency-two
│       ├── index.js
│       └── package.json
└── yarn.lock

Après avoir exécuté yarn, les modules que je souhaite installer sont extraits du registre NPM et les dépendances locales sont installées du répertoire packages vers node_modules.

.
├── index.js
├── node_modules
│   ├── @my
│   │   ├── local-dependency-one
│   │   │   └── ...
│   │   └── local-dependency-two
│   │       └── ...
│   ├── another-module-i-want-to-install
│   │   └── ...
│   └── some-module-i-want-to-install
│       └── ...
├── package.json
├── packages
│   ├── local-dependency-one
│   │   └── ...
│   └── local-dependency-two
│       └── ...
└── yarn.lock 

Comme vous pouvez le voir, je préfère définir mes packages locaux comme scoped (@my/...). Ce n'est pas obligatoire, mais c'est une bonne pratique. NPM traite les packages de portée comme privé par défaut , donc je n'ai pas besoin de m'inquiéter qu'ils seront publiés à l'occasion ou les marquer explicitement comme privés.

0
Vadim