首页 > 解决方案 > npm install 默认尝试全局安装

问题描述

在文件夹上执行 npm install 时,安装包c:\Users\<user>\node-modules而不是.\<project folder>\node-modules

我尝试更新 npm config save=false 但这并没有解决问题

PS C:\Users\danielk\Documents\udemy_nodejs\FirstExpressApp> npm install express
npm WARN danielk No description
npm WARN danielk No repository field.
npm WARN danielk No license field.

+ express@4.17.1
updated 1 package and audited 126 packages in 2.004s
found 0 vulnerabilities

PS C:\Users\danielk\Documents\udemy_nodejs\FirstExpressApp> dir


    Directory: C:\Users\danielk\Documents\udemy_nodejs\FirstExpressApp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       21/08/2019   7:54 AM             27 app.js

在项目文件夹中执行 npm install express 时,我希望在项目文件夹中创建 node-modules 子文件夹,并将 express 模块安装在 node-modules 子文件夹中。但是它是在 C:\Users\danilk\node-modules 中创建的。

任何人都可以帮助解决什么问题以及如何解决这个问题?

标签: node.jsnpmnpm-install

解决方案


当您执行 npm install 时,npm 实际上会将包安装到您当前所在的“npm 项目”中。请参见以下示例:

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (stackoverflow)
[...Truncated...]
Is this OK? (yes)

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow
$ mkdir child

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow
$ cd child/

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow/child
$ npm install express
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN stackoverflow@1.0.0 No description
npm WARN stackoverflow@1.0.0 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors and audited 126 packages in 3.021s
found 0 vulnerabilities


eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow/child
$ ls

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow/child
$ ls ..
child/  node_modules/  package.json  package-lock.json

eric_@Eric-Dev-Laptop MINGW64 ~/Desktop/mixed/stackoverflow/child
$ ls ../node_modules/
accepts/              escape-html/        mime/            safer-buffer/
array-flatten/        etag/               mime-db/         send/
body-parser/          express/            mime-types/      serve-static/
bytes/                finalhandler/       ms/              setprototypeof/
content-disposition/  forwarded/          negotiator/      statuses/
content-type/         fresh/              on-finished/     toidentifier/
cookie/               http-errors/        parseurl/        type-is/
cookie-signature/     iconv-lite/         path-to-regexp/  unpipe/
debug/                inherits/           proxy-addr/      utils-merge/
depd/                 ipaddr.js/          qs/              vary/
destroy/              media-typer/        range-parser/
ee-first/             merge-descriptors/  raw-body/
encodeurl/            methods/            safe-buffer/

发生的事情是,我创建了一个stackoverflow文件夹,在那里用 , 初始化了一个“npm 项目” npm init,然后cd进入child文件夹。当我在npm install express里面做的时候,express模块会无意中安装到stackoverflow/node_module. 这样当您制作程序时,例如 myprogram,甚至当您在其中的某个子文件夹中(例如myprogram/lib/)并执行npm install时,模块仍将安装到 myprogram。

将此与您的情况进行比较,这可能是因为您的 C:\Users\danielk\ 已经是一个 npm 项目,所以当您在 C:\Users\danielk\Documents\udemy_nodejs\FirstExpressApp 中时,npm 认为您在 C 中: \Users\danielk\ 项目,从而将express模块保存在那里。

至于为什么 C:\Users\danielk\ 变成了一个 npm 项目,是你npm init之前在那里手动做的,还是你在那里执行了你的第一个npm install,然后 C:\Users\danielk\node_modules 被创建,标记为一个 npm 项目。

还有一件事,快递不是“全球”安装的,你是“全球”安装的npm install express -g(尽管对于快递来说,全球安装它没有用处)。您的情况只是“安装在主目录中”的软件包。


推荐阅读