summaryrefslogtreecommitdiff
path: root/deps/npm/man/man7/npm-faq.7
blob: 14c1706d165a10f0d97b09e1f587dd26bf1a3460 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
.TH "NPM\-FAQ" "7" "September 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
to open these documents in your default web browser rather than \fBman\fP\|\.
.SH It didn't work\.
.P
That's not really a question\.
.SH Why didn't it work?
.P
I don't know yet\.
.P
Read the error output, and if you can't figure out what it means,
do what it says and post a bug with all the information it asks for\.
.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