<!doctype html>
<html>
  <title>npmrc</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="../files/npmrc.html">npmrc</a></h1> <p>The npm config files</p>

<h2 id="DESCRIPTION">DESCRIPTION</h2>

<p>npm gets its config settings from the command line, environment
variables, and <code>npmrc</code> files.</p>

<p>The <code>npm config</code> command can be used to update and edit the contents
of the user and global npmrc files.</p>

<p>For a list of available configuration options, see <a href="../misc/npm-config.html">npm-config(7)</a>.</p>

<h2 id="FILES">FILES</h2>

<p>The three relevant files are:</p>

<ul><li>per-user config file (~/.npmrc)</li><li>global config file ($PREFIX/npmrc)</li><li>npm builtin config file (/path/to/npm/npmrc)</li></ul>

<p>All npm config files are an ini-formatted list of <code>key = value</code>
parameters.  Environment variables can be replaced using
<code>${VARIABLE_NAME}</code>. For example:</p>

<pre><code>prefix = ${HOME}/.npm-packages</code></pre>

<p>Each of these files is loaded, and config options are resolved in
priority order.  For example, a setting in the userconfig file would
override the setting in the globalconfig file.</p>

<h3 id="Per-user-config-file">Per-user config file</h3>

<p><code>$HOME/.npmrc</code> (or the <code>userconfig</code> param, if set in the environment
or on the command line)</p>

<h3 id="Global-config-file">Global config file</h3>

<p><code>$PREFIX/etc/npmrc</code> (or the <code>globalconfig</code> param, if set above):
This file is an ini-file formatted list of <code>key = value</code> parameters.
Environment variables can be replaced as above.</p>

<h3 id="Built-in-config-file">Built-in config file</h3>

<p><code>path/to/npm/itself/npmrc</code></p>

<p>This is an unchangeable &quot;builtin&quot; configuration file that npm keeps
consistent across updates.  Set fields in here using the <code>./configure</code>
script that comes with npm.  This is primarily for distribution
maintainers to override default configs in a standard and consistent
manner.</p>

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

<ul><li><a href="../files/npm-folders.html">npm-folders(5)</a></li><li><a href="../cli/npm-config.html">npm-config(1)</a></li><li><a href="../misc/npm-config.html">npm-config(7)</a></li><li><a href="../files/package.json.html">package.json(5)</a></li><li><a href="../cli/npm.html">npm(1)</a></li></ul>
</div>
<p id="footer">npmrc &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>
