Reputation: 79168
I have this in my package.json file (shortened version):
{
"name": "a-module",
"version": "0.0.1",
"dependencies": {
"coffee-script": ">= 1.1.3"
},
"devDependencies": {
"stylus": ">= 0.17.0"
}
}
I am using NPM version 1.1.1 on Mac 10.6.8.
When I run the following command from the project root, it installs both the dependencies
and devDependencies
:
npm install
I was under the impression that this command installed the devDependencies
:
npm install --dev
How do I make it so npm install
only installs dependencies
(so production environment only gets those modules), while something like npm install --dev
installs both dependencies
and devDependencies
?
Upvotes: 894
Views: 642278
Reputation: 1534
npm install --production --no-optional
It installs only deps from dependencies
and will ignore optionalDependencies
and devDependencies
Upvotes: 7
Reputation: 21445
The npm install
command will install the devDependencies
along other dependencies
when run inside a package directory, in a development environment (the default).
In version 8.x and above use --omit=dev
flag to install only regular dependencies:
npm install --omit=dev
This will install only dependencies
, and not devDependencies
, regardless of the value of the NODE_ENV
environment variable.
If you use 6.x or an earlier version, you need to use the --only=prod
flag instead.
Note:
Before v3.3.0 of npm (2015-08-13), the option was called --production
, i.e.
npm install --production
You may also need --no-optional
flag.
Upvotes: 1366
Reputation: 1915
I ran into a problem in the docker node:current-slim (running npm 7.0.9) where npm install
appeared to ignore --production
, --only=prod
and --only=production
. I found two work-arounds:
RUN npm ci --only=production
) which requires an up-to-date package-lock.jsonnpm install
, brutally edit the package.json with:RUN node -e 'const fs = require("fs"); const pkg = JSON.parse(fs.readFileSync("./package.json", "utf-8")); delete pkg.devDependencies; fs.writeFileSync("./package.json", JSON.stringify(pkg), "utf-8");'
This won't edit your working package.json, just the one copied to the docker container. Of course, this shouldn't be necessary, but if it is (as it was for me), there's your hack.
Upvotes: 5
Reputation: 7705
I suggest to use npm ci
. If you want to install only production-needed packages (as you wrote - without devDependencies
) then:
npm ci --only=production
or
NODE_ENV=production npm ci
If you prefer oldschool npm install
then:
npm install --production
or
NODE_ENV=production npm install
Here is good answer why you should use npm ci
.
Upvotes: 22
Reputation: 3495
I run into that problem too! npm install is somewhat confusing and web posts keep bringing in the -d/--dev flags as if there is an explicit 'development' install mode.
npm install
will install both "dependencies" and "devDependencies"
npm install --production
will only install "dependencies"
npm install --dev
will only install "devDependencies"
Upvotes: 318
Reputation: 1951
npm install --production
is the right way of installing node modules which are required for production. Check the documentation for more details
Upvotes: 1
Reputation: 27120
It's worth mentioning that you can use the NODE_ENV
environment variable to achieve the same result. Particularly useful if you're containerizing your Node application (e.g. Docker).
NODE_ENV=production npm install
The above code will install all your dependencies but the dev ones (i.e. devDependencies
).
if you need to use environment variables in your Dockerfile
more information can be found here.
Environment variables are easy to overwrite whenever needed (e.g. if you want to run your test suite say on Travis CI). If that were the case you could do something like this:
docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install
production
- Default: false
Type: Boolean Set to true to run in "production" mode.
- devDependencies are not installed at the topmost level when running local npm install without any arguments.
- Set the NODE_ENV="production" for lifecycle scripts.
Happy containerization =)
Upvotes: 7
Reputation: 1861
The new option is:
npm install --only=prod
If you want to install only devDependencies:
npm install --only=dev
Upvotes: 166
Reputation: 2459
Use npm install packageName --save
this will add package in dependencies, if you use npm install packageName --save-dev
then it devDependencies.
npm install packageName --save-dev
should be used for adding packages for development purpose. Like adding TDD packages (Chai, mocha, etc). Which are used in development and not in production.
Upvotes: 3
Reputation: 3767
If you read this POST in 2016, please achieve what you want by using
--only={prod[uction]|dev[elopment]}
argument will cause either only devDependencies or only non-devDependencies to be installed regardless of the NODE_ENV.
from: https://docs.npmjs.com/cli/install
Upvotes: 49
Reputation: 1827
If you have already installed all your dependencies, and you want to avoid having to download your production packages from NPM again, you can simply type:
npm prune --production
This will remove your dev dependencies from your node_modules
folder, which is helpful if you're trying to automate a two step process like
Running npm prune
in between will save you from having to reinstall everything!
Upvotes: 59
Reputation: 111
I have found that, when trying to install dev dependencies for a package that contains a node addon, you cannot avoid building the addon when running npm install --dev even if you just want to install the devDependencies. So, I had to go around npm's back:
node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install
Or, better (and more succinctly) yet,
node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Upvotes: 4
Reputation: 3212
npm will install dev dependencies when installing from inside a package (if there is a package.json
in the current directory). If it is from another location (npm registry, git repo, different location on the filesystem) it only installs the dependencies.
Upvotes: 18
Reputation: 301
When using "npm install" the modules are loaded and available throughout your application regardless of if they are "devDependencies" or "dependencies". Sum of this idea: everything which your package.json defines as a dependency (any type) gets installed to node_modules.
The purpose for the difference between dependencies/devDependencies/optionalDependencies is what consumers of your code can do w/ npm to install these resources.
Per the documentation: https://npmjs.org/doc/json.html...
If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.
In this case, it's best to list these additional items in a devDependencies hash.
These things will be installed whenever the --dev configuration flag is set. This flag is set automatically when doing npm link or when doing npm install from the root of a package, and can be managed like any other npm configuration param. See config(1) for more on the topic.
However, to resolve this question, if you want to ONLY install the "dependencies" using npm, the following command is:
npm install --production
This can be confirmed by looking at the Git commit which added this filter (along with some other filters [listed below] to provide this functionality).
Alternative filters which can be used by npm:
--save => updates dependencies entries in the {{{json}}} file
--force => force fetching remote entries if they exist on disk
--force-latest => force latest version on conflict
--production => do NOT install project devDependencies
--no-color => do not print colors
@dmarr try using npm install --production
Upvotes: 23
Reputation: 7562
Need to add to chosen answer: As of now, npm install
in a package directory (containing package.json
) will install devDependencies, whereas npm install -g
will not install them.
Upvotes: 3