<!doctype html>
<html>
  <title>README</title>
  <meta http-equiv="content-type" value="text/html;utf-8">
  <link rel="stylesheet" type="text/css" href="../static/style.css">

  <body>
    <div id="wrapper">
<h1><a href="cli/npm.html">npm</a></h1> <p>node package manager</p>

<h2 id="SYNOPSIS">SYNOPSIS</h2>

<p>This is just enough info to get you up and running.</p>

<p>Much more info available via <code>npm help</code> once it&#39;s installed.</p>

<h2 id="IMPORTANT">IMPORTANT</h2>

<p><strong>You need node v0.8 or higher to run this program.</strong></p>

<p>To install an old <strong>and unsupported</strong> version of npm that works on node 0.3
and prior, clone the git repo and dig through the old tags and branches.</p>

<h2 id="Super-Easy-Install">Super Easy Install</h2>

<p>npm comes with node now.</p>

<h3 id="Windows-Computers">Windows Computers</h3>

<p>Get the MSI.  npm is in it.</p>

<h3 id="Apple-Macintosh-Computers">Apple Macintosh Computers</h3>

<p>Get the pkg.  npm is in it.</p>

<h3 id="Other-Sorts-of-Unices">Other Sorts of Unices</h3>

<p>Run <code>make install</code>.  npm will be installed with node.</p>

<p>If you want a more fancy pants install (a different version, customized
paths, etc.) then read on.</p>

<h2 id="Fancy-Install-Unix">Fancy Install (Unix)</h2>

<p>There&#39;s a pretty robust install script at
<a href="https://npmjs.org/install.sh">https://npmjs.org/install.sh</a>.  You can download that and run it.</p>

<h3 id="Slightly-Fancier">Slightly Fancier</h3>

<p>You can set any npm configuration params with that script:</p>

<pre><code>npm_config_prefix=/some/path sh install.sh</code></pre>

<p>Or, you can run it in uber-debuggery mode:</p>

<pre><code>npm_debug=1 sh install.sh</code></pre>

<h3 id="Even-Fancier">Even Fancier</h3>

<p>Get the code with git.  Use <code>make</code> to build the docs and do other stuff.
If you plan on hacking on npm, <code>make link</code> is your friend.</p>

<p>If you&#39;ve got the npm source code, you can also semi-permanently set
arbitrary config keys using the <code>./configure --key=val ...</code>, and then
run npm commands by doing <code>node cli.js &lt;cmd&gt; &lt;args&gt;</code>.  (This is helpful
for testing, or running stuff without actually installing npm itself.)</p>

<h2 id="Fancy-Windows-Install">Fancy Windows Install</h2>

<p>You can download a zip file from <a href="https://npmjs.org/dist/">https://npmjs.org/dist/</a>, and unpack it
in the same folder where node.exe lives.</p>

<p>If that&#39;s not fancy enough for you, then you can fetch the code with
git, and mess with it directly.</p>

<h2 id="Installing-on-Cygwin">Installing on Cygwin</h2>

<p>No.</p>

<h2 id="Permissions-when-Using-npm-to-Install-Other-Stuff">Permissions when Using npm to Install Other Stuff</h2>

<p><strong>tl;dr</strong></p>

<ul><li>Use <code>sudo</code> for greater safety.  Or don&#39;t, if you prefer not to.</li><li>npm will downgrade permissions if it&#39;s root before running any build
scripts that package authors specified.</li></ul>

<h3 id="More-details">More details...</h3>

<p>As of version 0.3, it is recommended to run npm as root.
This allows npm to change the user identifier to the <code>nobody</code> user prior
to running any package build or test commands.</p>

<p>If you are not the root user, or if you are on a platform that does not
support uid switching, then npm will not attempt to change the userid.</p>

<p>If you would like to ensure that npm <strong>always</strong> runs scripts as the
&quot;nobody&quot; user, and have it fail if it cannot downgrade permissions, then
set the following configuration param:</p>

<pre><code>npm config set unsafe-perm false</code></pre>

<p>This will prevent running in unsafe mode, even as non-root users.</p>

<h2 id="Uninstalling">Uninstalling</h2>

<p>So sad to see you go.</p>

<pre><code>sudo npm uninstall npm -g</code></pre>

<p>Or, if that fails,</p>

<pre><code>sudo make uninstall</code></pre>

<h2 id="More-Severe-Uninstalling">More Severe Uninstalling</h2>

<p>Usually, the above instructions are sufficient.  That will remove
npm, but leave behind anything you&#39;ve installed.</p>

<p>If you would like to remove all the packages that you have installed,
then you can use the <code>npm ls</code> command to find them, and then <code>npm rm</code> to
remove them.</p>

<p>To remove cruft left behind by npm 0.x, you can use the included
<code>clean-old.sh</code> script file.  You can run it conveniently like this:</p>

<pre><code>npm explore npm -g -- sh scripts/clean-old.sh</code></pre>

<p>npm uses two configuration files, one for per-user configs, and another
for global (every-user) configs.  You can view them by doing:</p>

<pre><code>npm config get userconfig   # defaults to ~/.npmrc
npm config get globalconfig # defaults to /usr/local/etc/npmrc</code></pre>

<p>Uninstalling npm does not remove configuration files by default.  You
must remove them yourself manually if you want them gone.  Note that
this means that future npm installs will not remember the settings that
you have chosen.</p>

<h2 id="Using-npm-Programmatically">Using npm Programmatically</h2>

<p>If you would like to use npm programmatically, you can do that.
It&#39;s not very well documented, but it <em>is</em> rather simple.</p>

<p>Most of the time, unless you actually want to do all the things that
npm does, you should try using one of npm&#39;s dependencies rather than
using npm itself, if possible.</p>

<p>Eventually, npm will be just a thin cli wrapper around the modules
that it depends on, but for now, there are some things that you must
use npm itself to do.</p>

<pre><code>var npm = require(&quot;npm&quot;)
npm.load(myConfigObject, function (er) {
  if (er) return handlError(er)
  npm.commands.install([&quot;some&quot;, &quot;args&quot;], function (er, data) {
    if (er) return commandFailed(er)
    // command succeeded, and data might have some info
  })
  npm.on(&quot;log&quot;, function (message) { .... })
})</code></pre>

<p>The <code>load</code> function takes an object hash of the command-line configs.
The various <code>npm.commands.&lt;cmd&gt;</code> functions take an <strong>array</strong> of
positional argument <strong>strings</strong>.  The last argument to any
<code>npm.commands.&lt;cmd&gt;</code> function is a callback.  Some commands take other
optional arguments.  Read the source.</p>

<p>You cannot set configs individually for any single npm function at this
time.  Since <code>npm</code> is a singleton, any call to <code>npm.config.set</code> will
change the value for <em>all</em> npm commands in that process.</p>

<p>See <code>./bin/npm-cli.js</code> for an example of pulling config values off of the
command line arguments using nopt.  You may also want to check out <code>npm
help config</code> to learn about all the options you can set there.</p>

<h2 id="More-Docs">More Docs</h2>

<p>Check out the <a href="https://npmjs.org/doc/">docs</a>,
especially the <a href="https://npmjs.org/doc/faq.html">faq</a>.</p>

<p>You can use the <code>npm help</code> command to read any of them.</p>

<p>If you&#39;re a developer, and you want to use npm to publish your program,
you should <a href="https://npmjs.org/doc/developers.html">read this</a></p>

<h2 id="Legal-Stuff">Legal Stuff</h2>

<p>&quot;npm&quot; and &quot;the npm registry&quot; are owned by Isaac Z. Schlueter.
All rights reserved.  See the included LICENSE file for more details.</p>

<p>&quot;Node.js&quot; and &quot;node&quot; are trademarks owned by Joyent, Inc.  npm is not
officially part of the Node.js project, and is neither owned by nor
officially affiliated with Joyent, Inc.</p>

<p>The packages in the npm registry are not part of npm itself, and are the
sole property of their respective maintainers.  While every effort is
made to ensure accountability, there is absolutely no guarantee,
warrantee, or assertion made as to the quality, fitness for a specific
purpose, or lack of malice in any given npm package.  Modules
published on the npm registry are not affiliated with or endorsed by
Joyent, Inc., Isaac Z. Schlueter, Ryan Dahl, or the Node.js project.</p>

<p>If you have a complaint about a package in the npm registry, and cannot
resolve it with the package owner, please express your concerns to
Isaac Z. Schlueter at <a href="mailto:i@izs.me">i@izs.me</a>.</p>

<h3 id="In-plain-english">In plain english</h3>

<p>This is mine; not my employer&#39;s, not Node&#39;s, not Joyent&#39;s, not Ryan
Dahl&#39;s.</p>

<p>If you publish something, it&#39;s yours, and you are solely accountable
for it.  Not me, not Node, not Joyent, not Ryan Dahl.</p>

<p>If other people publish something, it&#39;s theirs.  Not mine, not Node&#39;s,
not Joyent&#39;s, not Ryan Dahl&#39;s.</p>

<p>Yes, you can publish something evil.  It will be removed promptly if
reported, and we&#39;ll lose respect for you.  But there is no vetting
process for published modules.</p>

<p>If this concerns you, inspect the source before using packages.</p>

<h2 id="BUGS">BUGS</h2>

<p>When you find issues, please report them:</p>

<ul><li>web:
<a href="https://github.com/isaacs/npm/issues">https://github.com/isaacs/npm/issues</a></li><li>email:
<a href="mailto:npm-@googlegroups.com">npm-@googlegroups.com</a></li></ul>

<p>Be sure to include <em>all</em> of the output from the npm command that didn&#39;t work
as expected.  The <code>npm-debug.log</code> file is also helpful to provide.</p>

<p>You can also look for isaacs in #node.js on irc://irc.freenode.net.  He
will no doubt tell you to put the output in a gist or email.</p>

<h2 id="SEE-ALSO">SEE ALSO</h2>

<ul><li><a href="cli/npm.html">npm(1)</a></li><li><a href="misc/npm-faq.html">npm-faq(7)</a></li><li><a href="cli/npm-help.html">npm-help(1)</a></li><li><a href="misc/npm-index.html">npm-index(7)</a></li></ul>
</div>
<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.3.21</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
var els = Array.prototype.slice.call(wrapper.getElementsByTagName("*"), 0)
  .filter(function (el) {
    return el.parentNode === wrapper
        && el.tagName.match(/H[1-6]/)
        && el.id
  })
var l = 2
  , toc = document.createElement("ul")
toc.innerHTML = els.map(function (el) {
  var i = el.tagName.charAt(1)
    , out = ""
  while (i > l) {
    out += "<ul>"
    l ++
  }
  while (i < l) {
    out += "</ul>"
    l --
  }
  out += "<li><a href='#" + el.id + "'>" +
    ( el.innerText || el.text || el.innerHTML)
    + "</a>"
  return out
}).join("\n")
toc.id = "toc"
document.body.appendChild(toc)
})()
</script>
