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?
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
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.