What is the difference between --save and --save-dev?
What is the difference between:
npm install [package_name]
and:
npm install [package_name] --save
and:
npm install [package_name] --save-dev
What does this mean? And what is really the effect of --save
and -dev
keywords?
Solution 1:
The difference between --save
and --save-dev
may not be immediately noticeable if you have tried them both on your own projects. So here are a few examples...
Let's say you were building an app that used the moment package to parse and display dates. Your app is a scheduler so it really needs this package to run, as in: cannot run without it. In this case you would use
npm install moment --save
This would create a new value in your package.json
"dependencies": {
...
"moment": "^2.17.1"
}
When you are developing, it really helps to use tools such as test suites and may need jasmine-core and karma. In this case you would use
npm install jasmine-core --save-dev
npm install karma --save-dev
This would also create a new value in your package.json
"devDependencies": {
...
"jasmine-core": "^2.5.2",
"karma": "^1.4.1",
}
You do not need the test suite to run the app in its normal state, so it is a --save-dev
type dependency, nothing more. You can see how if you do not understand what is really happening, it is a bit hard to imagine.
Taken directly from NPM docs docs#dependencies
Dependencies
Dependencies are specified in a simple object that maps a package name to a version range. The version range is a string that has one or more space-separated descriptors. Dependencies can also be identified with a tarball or git URL.
Please do not put test harnesses or transpilers in your dependencies object. See devDependencies, below.
Even in the docs, it asks you to use --save-dev
for modules such as test harnesses.
Solution 2:
-
--save-dev
is used to save the package for development purpose. Example: unit tests, minification.. -
--save
is used to save the package required for the application to run.
Solution 3:
By default, NPM simply installs a package under node_modules. When you're trying to install dependencies for your app/module, you would need to first install them, and then add them to the dependencies
section of your package.json
.
--save-dev
adds the third-party package to the package's development dependencies. It won't be installed when someone runs npm install
directly to install your package. It's typically only installed if someone clones your source repository first and then runs npm install
in it.
--save
adds the third-party package to the package's dependencies. It will be installed together with the package whenever someone runs npm install package
.
Dev dependencies are those dependencies that are only needed for developing the package. That can include test runners, compilers, packagers, etc.
Both types of dependencies are stored in the package's package.json
file. --save
adds to dependencies
, --save-dev
adds to devDependencies
npm install documentation can be referred here.
--
Please note that --save
is now the default option, since NPM 5. Therefore, it is not explicitly needed anymore. It is possible to run npm install
without the --save
to achieve the same result.
Solution 4:
Let me give you an example,
- You are a developer of a very SERIOUS npm library which uses different testing libraries to test the package.
- Users download your library and want to use it in their code. Do they need to download your testing libraries as well? Maybe you use
jest
for testing and they usemocha
. Do you want them to installjest
as well? Just To run your library?
No. right? That's why they are in devDependencies
.
When someone does, npm i yourPackage
only the libraries required to RUN your library will be installed. Other libraries you used to bundle your code with or testing and mocking will not be installed because you put them in devDependencies
. Pretty neat right?
So, Why do the developers need to expose the devDependancies?
Let's say your package is an open-source package and 100s of people are sending pull requests to your package. Then how they will test the package? They will git clone
your repo and when they would do an npm i
the dependencies as well as devDependencies.
Because they are not using your package. They are developing the package further, thus, in order to test your package they need to pass the existing test cases as well write new. So, they need to use your devDependencies
which contain all the testing/building/mocking libraries that YOU used.