【问题标题】:npm installs package globally even after npm init即使在 npm init 之后,npm 也会全局安装包
【发布时间】:2019-01-14 05:48:06
【问题描述】:

我正在尝试在节点项目上安装 npm 包,但无论我做什么,模块都会继续全局安装。

我当前的目录是D:\wrkfldr\NodeTemp,它包含package.json

{
  "name": "nodetemp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

如果我运行npm install websocketpackage.json保持不变,并且模块全局安装在C:\Users\Me\AppData\Roaming\npm\node_modules

安装包时出现以下消息:

PS D:\wrkfldr\NodeTemp> npm install websocket

> websocket@1.0.28 install C:\Users\Me\AppData\Roaming\npm\node_modules\websocket
> (node-gyp rebuild 2> builderror.log) || (exit 0)


C:\Users\Me\AppData\Roaming\npm\node_modules\websocket>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  else (node "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )
+ websocket@1.0.28
added 7 packages from 15 contributors in 5.812s

我在windows下工作,我刚刚删除/重新安装了节点,但它没有解决问题。

我怎样才能让包安装到本地?

注意:如果我在package.json 中手动添加依赖项,然后运行npm install,它会正常工作,会创建目录 node_modules,并且我的导入会按预期工作。

这是我对npm-config ls -l的输出

; cli configs
long = true
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.4.1 node/v10.15.0 win32 x64"

; userconfig C:\Users\Me\.npmrc
global = true

; builtin config undefined
prefix = "C:\\Users\\Me\\AppData\\Roaming\\npm"

; default values
access = null
allow-same-version = false
also = null
always-auth = false
audit = true
audit-level = "low"
auth-type = "legacy"
bin-links = true
browser = null
ca = null
cache = "C:\\Users\\Me\\AppData\\Roaming\\npm-cache"
cache-lock-retries = 10
cache-lock-stale = 60000
cache-lock-wait = 10000
cache-max = null
cache-min = 10
cafile = undefined
cert = null
cidr = null
color = true
commit-hooks = true
depth = null
description = true
dev = false
dry-run = false
editor = "notepad.exe"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
force = false
git = "git"
git-tag-version = true
; global = false (overridden)
global-style = false
globalconfig = "C:\\Users\\Me\\AppData\\Roaming\\npm\\etc\\npmrc"
globalignorefile = "C:\\Users\\Me\\AppData\\Roaming\\npm\\etc\\npmignore"
group = 0
ham-it-up = false
heading = "npm"
https-proxy = null
if-present = false
ignore-prepublish = false
ignore-scripts = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "C:\\Users\\Me\\.npm-init.js"
init-version = "1.0.0"
json = false
key = null
legacy-bundling = false
link = false
local-address = undefined
loglevel = "notice"
logs-max = 10
; long = false (overridden)
maxsockets = 50
message = "%s"
; metrics-registry = null (overridden)
node-options = null
node-version = "10.15.0"
noproxy = null
offline = false
onload-script = null
only = null
optional = true
otp = null
package-lock = true
package-lock-only = false
parseable = false
prefer-offline = false
prefer-online = false
; prefix = "C:\\Program Files\\nodejs" (overridden)
preid = ""
production = false
progress = true
proxy = null
read-only = false
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
rollback = true
save = true
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-prefix = "^"
save-prod = false
scope = ""
script-shell = null
scripts-prepend-node-path = "warn-only"
searchexclude = null
searchlimit = 20
searchopts = ""
searchstaleness = 900
send-metrics = false
shell = "C:\\WINDOWS\\system32\\cmd.exe"
shrinkwrap = true
sign-git-commit = false
sign-git-tag = false
sso-poll-frequency = 500
sso-type = "oauth"
strict-ssl = true
tag = "latest"
tag-version-prefix = "v"
timing = false
tmp = "C:\\Users\\LEROIA~1\\AppData\\Local\\Temp"
umask = 0
unicode = false
unsafe-perm = true
update-notifier = true
usage = false
user = 0
; user-agent = "npm/{npm-version} node/{node-version} {platform} {arch}" (overridden)
userconfig = "C:\\Users\\Me\\.npmrc"
version = false
versions = false
viewer = "browser"

【问题讨论】:

  • 你用的是什么版本的node和npm?
  • 节点:v10.15.0,npm:6.4.1
  • 在 dos 而不是 powershell 中发出命令时,您会得到相同的行为吗?
  • 是的,同样的事情发生了
  • node和npm安装在哪里?

标签: npm package


【解决方案1】:

您安装软件包的默认设置已被覆盖。当您运行命令npm config ls -l 时,您可以通过它们的格式发现被覆盖的值:; key = default_value (overridden)。当您运行上述命令时,覆盖的值也位于输出的顶部。它将显示如下内容:

; cli configs
    (...)

; userconfig C:\Users\Me\.npmrc
    global = true ---> here you can see it is overridden

; globalconfig /path/to/global/config/file
    (...) ----> if you got globally overridden default values, you see those values here


; default values
    (...)
; global = false (overridden) --> here you can see what the default value is
    (...)

在您的情况下,global 的值在 C:\Users\Me\.npmrc 中被覆盖(如果您对其进行了匿名化,请将其更改为真实路径)。打开该文件并删除global = true 行。您也可以使用 npm-config CLI,但我的经验是这并不总是有效。

删除该行后,再次运行npm config ls -l 以验证配置是否返回默认值。

【讨论】: