mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
430 lines
16 KiB
430 lines
16 KiB
.TH "NPM\-FAQ" "7" "November 2015" "" ""
|
|
.SH "NAME"
|
|
\fBnpm-faq\fR \- Frequently Asked Questions
|
|
.SH Where can I find these docs in HTML?
|
|
.P
|
|
https://docs\.npmjs\.com/, or run:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
npm config set viewer browser
|
|
.fi
|
|
.RE
|
|
.P
|
|
This command will set the npm docs to open in your default web browser rather than \fBman\fP\|\.
|
|
.SH It didn't work\.
|
|
.P
|
|
Please provide a little more detail, search for the error via Google \fIhttps://google\.com\fR or StackOverflow npm \fIhttp://stackoverflow\.com/search?q=npm\fR to see if another developer has encountered a similar problem\.
|
|
.SH Why didn't it work?
|
|
.P
|
|
I don't know yet\.
|
|
.P
|
|
Try reading the error output first, ensure this is a true npm issue and not a package issue\. If you are having an issue with a package dependency, please submit your error to that particular package maintainer\.
|
|
.P
|
|
For any npm issues, try following the instructions, or even retracing your steps\. If the issue continues to persist, submit a bug with the steps to reproduce, please include the operating system you are working on, along with the error you recieve\.
|
|
.SH Where does npm put stuff?
|
|
.P
|
|
See npm help 5 \fBnpm\-folders\fP
|
|
.P
|
|
tl;dr:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
Use the \fBnpm root\fP command to see where modules go, and the \fBnpm bin\fP
|
|
command to see where executables go
|
|
.IP \(bu 2
|
|
Global installs are different from local installs\. If you install
|
|
something with the \fB\-g\fP flag, then its executables go in \fBnpm bin \-g\fP
|
|
and its modules go in \fBnpm root \-g\fP\|\.
|
|
|
|
.RE
|
|
.SH How do I install something on my computer in a central location?
|
|
.P
|
|
Install it globally by tacking \fB\-g\fP or \fB\-\-global\fP to the command\. (This
|
|
is especially important for command line utilities that need to add
|
|
their bins to the global system \fBPATH\fP\|\.)
|
|
.SH I installed something globally, but I can't \fBrequire()\fP it
|
|
.P
|
|
Install it locally\.
|
|
.P
|
|
The global install location is a place for command\-line utilities
|
|
to put their bins in the system \fBPATH\fP\|\. It's not for use with \fBrequire()\fP\|\.
|
|
.P
|
|
If you \fBrequire()\fP a module in your code, then that means it's a
|
|
dependency, and a part of your program\. You need to install it locally
|
|
in your program\.
|
|
.SH Why can't npm just put everything in one place, like other package managers?
|
|
.P
|
|
Not every change is an improvement, but every improvement is a change\.
|
|
This would be like asking git to do network IO for every commit\. It's
|
|
not going to happen, because it's a terrible idea that causes more
|
|
problems than it solves\.
|
|
.P
|
|
It is much harder to avoid dependency conflicts without nesting
|
|
dependencies\. This is fundamental to the way that npm works, and has
|
|
proven to be an extremely successful approach\. See npm help 5 \fBnpm\-folders\fP for
|
|
more details\.
|
|
.P
|
|
If you want a package to be installed in one place, and have all your
|
|
programs reference the same copy of it, then use the \fBnpm link\fP command\.
|
|
That's what it's for\. Install it globally, then link it into each
|
|
program that uses it\.
|
|
.SH Whatever, I really want the old style 'everything global' style\.
|
|
.P
|
|
Write your own package manager\. You could probably even wrap up \fBnpm\fP
|
|
in a shell script if you really wanted to\.
|
|
.P
|
|
npm will not help you do something that is known to be a bad idea\.
|
|
.SH Should I check my \fBnode_modules\fP folder into git?
|
|
.P
|
|
Usually, no\. Allow npm to resolve dependencies for your packages\.
|
|
.P
|
|
For packages you \fBdeploy\fR, such as websites and apps,
|
|
you should use npm shrinkwrap to lock down your full dependency tree:
|
|
.P
|
|
https://docs\.npmjs\.com/cli/shrinkwrap
|
|
.P
|
|
If you are paranoid about depending on the npm ecosystem,
|
|
you should run a private npm mirror or a private cache\.
|
|
.P
|
|
If you want 100% confidence in being able to reproduce the specific bytes
|
|
included in a deployment, you should use an additional mechanism that can
|
|
verify contents rather than versions\. For example,
|
|
Amazon machine images, DigitalOcean snapshots, Heroku slugs, or simple tarballs\.
|
|
.SH Is it 'npm' or 'NPM' or 'Npm'?
|
|
.P
|
|
npm should never be capitalized unless it is being displayed in a
|
|
location that is customarily all\-caps (such as the title of man pages\.)
|
|
.SH If 'npm' is an acronym, why is it never capitalized?
|
|
.P
|
|
Contrary to the belief of many, "npm" is not in fact an abbreviation for
|
|
"Node Package Manager"\. It is a recursive bacronymic abbreviation for
|
|
"npm is not an acronym"\. (If it was "ninaa", then it would be an
|
|
acronym, and thus incorrectly named\.)
|
|
.P
|
|
"NPM", however, \fIis\fR an acronym (more precisely, a capitonym) for the
|
|
National Association of Pastoral Musicians\. You can learn more
|
|
about them at http://npm\.org/\|\.
|
|
.P
|
|
In software, "NPM" is a Non\-Parametric Mapping utility written by
|
|
Chris Rorden\. You can analyze pictures of brains with it\. Learn more
|
|
about the (capitalized) NPM program at http://www\.cabiatl\.com/mricro/npm/\|\.
|
|
.P
|
|
The first seed that eventually grew into this flower was a bash utility
|
|
named "pm", which was a shortened descendent of "pkgmakeinst", a
|
|
bash function that was used to install various different things on different
|
|
platforms, most often using Yahoo's \fByinst\fP\|\. If \fBnpm\fP was ever an
|
|
acronym for anything, it was \fBnode pm\fP or maybe \fBnew pm\fP\|\.
|
|
.P
|
|
So, in all seriousness, the "npm" project is named after its command\-line
|
|
utility, which was organically selected to be easily typed by a right\-handed
|
|
programmer using a US QWERTY keyboard layout, ending with the
|
|
right\-ring\-finger in a postition to type the \fB\-\fP key for flags and
|
|
other command\-line arguments\. That command\-line utility is always
|
|
lower\-case, though it starts most sentences it is a part of\.
|
|
.SH How do I list installed packages?
|
|
.P
|
|
\fBnpm ls\fP
|
|
.SH How do I search for packages?
|
|
.P
|
|
\fBnpm search\fP
|
|
.P
|
|
Arguments are greps\. \fBnpm search jsdom\fP shows jsdom packages\.
|
|
.SH How do I update npm?
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
npm install npm \-g
|
|
.fi
|
|
.RE
|
|
.P
|
|
You can also update all outdated local packages by doing \fBnpm update\fP without
|
|
any arguments, or global packages by doing \fBnpm update \-g\fP\|\.
|
|
.P
|
|
Occasionally, the version of npm will progress such that the current
|
|
version cannot be properly installed with the version that you have
|
|
installed already\. (Consider, if there is ever a bug in the \fBupdate\fP
|
|
command\.)
|
|
.P
|
|
In those cases, you can do this:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
curl https://www\.npmjs\.com/install\.sh | sh
|
|
.fi
|
|
.RE
|
|
.SH What is a \fBpackage\fP?
|
|
.P
|
|
A package is:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
a) a folder containing a program described by a package\.json file
|
|
.IP \(bu 2
|
|
b) a gzipped tarball containing (a)
|
|
.IP \(bu 2
|
|
c) a url that resolves to (b)
|
|
.IP \(bu 2
|
|
d) a \fB<name>@<version>\fP that is published on the registry with (c)
|
|
.IP \(bu 2
|
|
e) a \fB<name>@<tag>\fP that points to (d)
|
|
.IP \(bu 2
|
|
f) a \fB<name>\fP that has a "latest" tag satisfying (e)
|
|
.IP \(bu 2
|
|
g) a \fBgit\fP url that, when cloned, results in (a)\.
|
|
|
|
.RE
|
|
.P
|
|
Even if you never publish your package, you can still get a lot of
|
|
benefits of using npm if you just want to write a node program (a), and
|
|
perhaps if you also want to be able to easily install it elsewhere
|
|
after packing it up into a tarball (b)\.
|
|
.P
|
|
Git urls can be of the form:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
git://github\.com/user/project\.git#commit\-ish
|
|
git+ssh://user@hostname:project\.git#commit\-ish
|
|
git+http://user@hostname/project/blah\.git#commit\-ish
|
|
git+https://user@hostname/project/blah\.git#commit\-ish
|
|
.fi
|
|
.RE
|
|
.P
|
|
The \fBcommit\-ish\fP can be any tag, sha, or branch which can be supplied as
|
|
an argument to \fBgit checkout\fP\|\. The default is \fBmaster\fP\|\.
|
|
.SH What is a \fBmodule\fP?
|
|
.P
|
|
A module is anything that can be loaded with \fBrequire()\fP in a Node\.js
|
|
program\. The following things are all examples of things that can be
|
|
loaded as modules:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
A folder with a \fBpackage\.json\fP file containing a \fBmain\fP field\.
|
|
.IP \(bu 2
|
|
A folder with an \fBindex\.js\fP file in it\.
|
|
.IP \(bu 2
|
|
A JavaScript file\.
|
|
|
|
.RE
|
|
.P
|
|
Most npm packages are modules, because they are libraries that you
|
|
load with \fBrequire\fP\|\. However, there's no requirement that an npm
|
|
package be a module! Some only contain an executable command\-line
|
|
interface, and don't provide a \fBmain\fP field for use in Node programs\.
|
|
.P
|
|
Almost all npm packages (at least, those that are Node programs)
|
|
\fIcontain\fR many modules within them (because every file they load with
|
|
\fBrequire()\fP is a module)\.
|
|
.P
|
|
In the context of a Node program, the \fBmodule\fP is also the thing that
|
|
was loaded \fIfrom\fR a file\. For example, in the following program:
|
|
.P
|
|
.RS 2
|
|
.nf
|
|
var req = require('request')
|
|
.fi
|
|
.RE
|
|
.P
|
|
we might say that "The variable \fBreq\fP refers to the \fBrequest\fP module"\.
|
|
.SH So, why is it the "\fBnode_modules\fP" folder, but "\fBpackage\.json\fP" file? Why not \fBnode_packages\fP or \fBmodule\.json\fP?
|
|
.P
|
|
The \fBpackage\.json\fP file defines the package\. (See "What is a
|
|
package?" above\.)
|
|
.P
|
|
The \fBnode_modules\fP folder is the place Node\.js looks for modules\.
|
|
(See "What is a module?" above\.)
|
|
.P
|
|
For example, if you create a file at \fBnode_modules/foo\.js\fP and then
|
|
had a program that did \fBvar f = require('foo\.js')\fP then it would load
|
|
the module\. However, \fBfoo\.js\fP is not a "package" in this case,
|
|
because it does not have a package\.json\.
|
|
.P
|
|
Alternatively, if you create a package which does not have an
|
|
\fBindex\.js\fP or a \fB"main"\fP field in the \fBpackage\.json\fP file, then it is
|
|
not a module\. Even if it's installed in \fBnode_modules\fP, it can't be
|
|
an argument to \fBrequire()\fP\|\.
|
|
.SH \fB"node_modules"\fP is the name of my deity's arch\-rival, and a Forbidden Word in my religion\. Can I configure npm to use a different folder?
|
|
.P
|
|
No\. This will never happen\. This question comes up sometimes,
|
|
because it seems silly from the outside that npm couldn't just be
|
|
configured to put stuff somewhere else, and then npm could load them
|
|
from there\. It's an arbitrary spelling choice, right? What's the big
|
|
deal?
|
|
.P
|
|
At the time of this writing, the string \fB\|'node_modules'\fP appears 151
|
|
times in 53 separate files in npm and node core (excluding tests and
|
|
documentation)\.
|
|
.P
|
|
Some of these references are in node's built\-in module loader\. Since
|
|
npm is not involved \fBat all\fR at run\-time, node itself would have to
|
|
be configured to know where you've decided to stick stuff\. Complexity
|
|
hurdle #1\. Since the Node module system is locked, this cannot be
|
|
changed, and is enough to kill this request\. But I'll continue, in
|
|
deference to your deity's delicate feelings regarding spelling\.
|
|
.P
|
|
Many of the others are in dependencies that npm uses, which are not
|
|
necessarily tightly coupled to npm (in the sense that they do not read
|
|
npm's configuration files, etc\.) Each of these would have to be
|
|
configured to take the name of the \fBnode_modules\fP folder as a
|
|
parameter\. Complexity hurdle #2\.
|
|
.P
|
|
Furthermore, npm has the ability to "bundle" dependencies by adding
|
|
the dep names to the \fB"bundledDependencies"\fP list in package\.json,
|
|
which causes the folder to be included in the package tarball\. What
|
|
if the author of a module bundles its dependencies, and they use a
|
|
different spelling for \fBnode_modules\fP? npm would have to rename the
|
|
folder at publish time, and then be smart enough to unpack it using
|
|
your locally configured name\. Complexity hurdle #3\.
|
|
.P
|
|
Furthermore, what happens when you \fIchange\fR this name? Fine, it's
|
|
easy enough the first time, just rename the \fBnode_modules\fP folders to
|
|
\fB\|\./blergyblerp/\fP or whatever name you choose\. But what about when you
|
|
change it again? npm doesn't currently track any state about past
|
|
configuration settings, so this would be rather difficult to do
|
|
properly\. It would have to track every previous value for this
|
|
config, and always accept any of them, or else yesterday's install may
|
|
be broken tomorrow\. Complexity hurdle #4\.
|
|
.P
|
|
Never going to happen\. The folder is named \fBnode_modules\fP\|\. It is
|
|
written indelibly in the Node Way, handed down from the ancient times
|
|
of Node 0\.3\.
|
|
.SH How do I install node with npm?
|
|
.P
|
|
You don't\. Try one of these node version managers:
|
|
.P
|
|
Unix:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
http://github\.com/isaacs/nave
|
|
.IP \(bu 2
|
|
http://github\.com/visionmedia/n
|
|
.IP \(bu 2
|
|
http://github\.com/creationix/nvm
|
|
|
|
.RE
|
|
.P
|
|
Windows:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
http://github\.com/marcelklehr/nodist
|
|
.IP \(bu 2
|
|
https://github\.com/coreybutler/nvm\-windows
|
|
.IP \(bu 2
|
|
https://github\.com/hakobera/nvmw
|
|
.IP \(bu 2
|
|
https://github\.com/nanjingboy/nvmw
|
|
|
|
.RE
|
|
.SH How can I use npm for development?
|
|
.P
|
|
See npm help 7 \fBnpm\-developers\fP and npm help 5 \fBpackage\.json\fP\|\.
|
|
.P
|
|
You'll most likely want to \fBnpm link\fP your development folder\. That's
|
|
awesomely handy\.
|
|
.P
|
|
To set up your own private registry, check out npm help 7 \fBnpm\-registry\fP\|\.
|
|
.SH Can I list a url as a dependency?
|
|
.P
|
|
Yes\. It should be a url to a gzipped tarball containing a single folder
|
|
that has a package\.json in its root, or a git url\.
|
|
(See "what is a package?" above\.)
|
|
.SH How do I symlink to a dev folder so I don't have to keep re\-installing?
|
|
.P
|
|
See npm help \fBnpm\-link\fP
|
|
.SH The package registry website\. What is that exactly?
|
|
.P
|
|
See npm help 7 \fBnpm\-registry\fP\|\.
|
|
.SH I forgot my password, and can't publish\. How do I reset it?
|
|
.P
|
|
Go to https://npmjs\.com/forgot\|\.
|
|
.SH I get ECONNREFUSED a lot\. What's up?
|
|
.P
|
|
Either the registry is down, or node's DNS isn't able to reach out\.
|
|
.P
|
|
To check if the registry is down, open up
|
|
https://registry\.npmjs\.org/ in a web browser\. This will also tell
|
|
you if you are just unable to access the internet for some reason\.
|
|
.P
|
|
If the registry IS down, let us know by emailing support@npmjs\.com
|
|
or posting an issue at https://github\.com/npm/npm/issues\|\. If it's
|
|
down for the world (and not just on your local network) then we're
|
|
probably already being pinged about it\.
|
|
.P
|
|
You can also often get a faster response by visiting the #npm channel
|
|
on Freenode IRC\.
|
|
.SH Why no namespaces?
|
|
.P
|
|
npm has only one global namespace\. If you want to namespace your own packages,
|
|
you may: simply use the \fB\-\fP character to separate the names or use scoped
|
|
packages\. npm is a mostly anarchic system\. There is not sufficient need to
|
|
impose namespace rules on everyone\.
|
|
.P
|
|
As of 2\.0, npm supports scoped packages, which allow you to publish a group of
|
|
related modules without worrying about name collisions\.
|
|
.P
|
|
Every npm user owns the scope associated with their username\. For example, the
|
|
user named \fBnpm\fP owns the scope \fB@npm\fP\|\. Scoped packages are published inside a
|
|
scope by naming them as if they were files under the scope directory, e\.g\., by
|
|
setting \fBname\fP in \fBpackage\.json\fP to \fB@npm/npm\fP\|\.
|
|
.P
|
|
Scoped packages are supported by the public npm registry\. The npm client is
|
|
backwards\-compatible with un\-scoped registries, so it can be used to work with
|
|
scoped and un\-scoped registries at the same time\.
|
|
.P
|
|
Unscoped packages can only depend on other unscoped packages\. Scoped packages
|
|
can depend on packages from their own scope, a different scope, or the public
|
|
registry (unscoped)\.
|
|
.P
|
|
For the current documentation of scoped packages, see
|
|
https://docs\.npmjs\.com/misc/scope
|
|
.P
|
|
References:
|
|
.RS 0
|
|
.IP 1. 3
|
|
For the reasoning behind the "one global namespace", please see this
|
|
discussion: https://github\.com/npm/npm/issues/798 (TL;DR: It doesn't
|
|
actually make things better, and can make them worse\.)
|
|
.IP 2. 3
|
|
For the pre\-implementation discussion of the scoped package feature, see
|
|
this discussion: https://github\.com/npm/npm/issues/5239
|
|
|
|
.RE
|
|
.SH Who does npm?
|
|
.P
|
|
npm was originally written by Isaac Z\. Schlueter, and many others have
|
|
contributed to it, some of them quite substantially\.
|
|
.P
|
|
The npm open source project, The npm Registry, and the community
|
|
website \fIhttps://www\.npmjs\.com\fR are maintained and operated by the
|
|
good folks at npm, Inc\. \fIhttp://www\.npmjs\.com\fR
|
|
.SH I have a question or request not addressed here\. Where should I put it?
|
|
.P
|
|
Post an issue on the github project:
|
|
.RS 0
|
|
.IP \(bu 2
|
|
https://github\.com/npm/npm/issues
|
|
|
|
.RE
|
|
.SH Why does npm hate me?
|
|
.P
|
|
npm is not capable of hatred\. It loves everyone, especially you\.
|
|
.SH SEE ALSO
|
|
.RS 0
|
|
.IP \(bu 2
|
|
npm help npm
|
|
.IP \(bu 2
|
|
npm help 7 developers
|
|
.IP \(bu 2
|
|
npm help 5 package\.json
|
|
.IP \(bu 2
|
|
npm help config
|
|
.IP \(bu 2
|
|
npm help 7 config
|
|
.IP \(bu 2
|
|
npm help 5 npmrc
|
|
.IP \(bu 2
|
|
npm help 7 config
|
|
.IP \(bu 2
|
|
npm help 5 folders
|
|
|
|
.RE
|
|
|
|
|