NPM 全局安装“找不到模块”
Posted
技术标签:
【中文标题】NPM 全局安装“找不到模块”【英文标题】:NPM global install "cannot find module" 【发布时间】:2012-09-17 15:42:47 【问题描述】:我写了一个模块,我刚才发布到 npm (https://npmjs.org/package/wisp)
所以它可以从命令行正常安装:
$ npm i -g wisp
但是,当我从命令行运行它时,我不断收到一个未安装 optimist 的错误:
$ wisp
Error: Cannot find module 'optimist'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
at Module._compile (module.js:449:26)
at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)
但是,我在 package.json 中指定了依赖项:
"name": "wisp",
"author": "Brendan Scarvell <bscarvell@gmail.com>",
"version": "0.1.0",
"description": "Global nodejs file server",
"dependencies":
"optimist": "~0.3.4"
,
"repository": "git://github.com/tehlulz/wisp",
"bin":
"wisp" : "./wisp"
有谁知道该怎么做才能让它运行?我知道这与将可执行文件添加到 bin 的 bin 部分有关,并且该目录中的 node_modules 为空。不知道如何解决。
【问题讨论】:
如果安装时没有 -g 选项会发生什么? 它在当前目录中安装了一个 node_modules 文件夹,里面有 wisp。 我知道。还是报错? 是的。如果我在执行本地 npm i wisp 后尝试运行 wisp,仍然返回相同的错误 我刚刚安装了你的模块。它对我来说很好。你的小精灵在哪里?就我而言,我运行了./node_modules/wisp/wisp
,效果很好。
【参考方案1】:
高山/容器化
正如其他地方提到的,解决方案是烘焙到您的图像中,
NODE_PATH=/usr/local/lib/node_modules/
我也有opened up an issue upstream with npm
apk so this gets set
【讨论】:
【参考方案2】:$ vim /etc/profile.d/nodejs.sh
export NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
【讨论】:
默认情况下就在那里。对于用户,它已加载,但在以 root 身份运行时不是,因此需要包含在 root 用户的路径中。【参考方案3】:遇到了同样的问题,并通过在我的 zshrc 中添加以下行来解决它。 根据您的 shell,您可以尝试在您的 rc 文件中添加 bash 和 zsh - bashrc/zshrc 文件存在于您的主位置。
export NODE_PATH="/usr/local/lib/node_modules"
要直接添加zshrc文件,运行这个命令
echo 'export NODE_PATH="/usr/local/lib/node_modules"' >> ~/.zshrc
【讨论】:
【参考方案4】:以下通用修复适用于任何模块。例如request-promise
。
替换
npm install request-promise --global
与
npm install request-promise --cli
工作 (source) 以及 globals
和 inherits
另外,尝试设置环境变量
NODE_PATH=%AppData%\npm\node_modules
【讨论】:
npm install
上没有 --cli
参数。【参考方案5】:
我刚刚遇到了axios
模块的这个问题。
然后我尝试了这个:运行rm -rf node_modules
和yarn
。
它有效。
【讨论】:
【参考方案6】:我必须将 C:\Users\Username\AppData\Roaming\npm 添加到我的环境变量中,然后我才能安装东西。
【讨论】:
【参考方案7】:Mac 用户最好使用手动安装:
为了尽量减少权限错误的机会,您可以将 npm 配置为 使用不同的目录。在这个例子中,它将是一个隐藏的 主文件夹中的目录。
在开始之前备份您的计算机。
为全局安装创建一个目录:
mkdir ~/.npm-global
配置 npm 以使用新的目录路径:
npm 配置设置前缀 '~/.npm-global'
打开或创建一个 ~/.profile 文件并添加以下行:
导出 PATH=~/.npm-global/bin:$PATH
回到命令行,更新你的系统变量:
来源 ~/.profile
测试:不使用 sudo 全局下载包。
npm install -g jshint
您可以使用相应的 ENV 变量(例如 如果你不想修改 ~/.profile):
NPM_CONFIG_PREFIX=~/.npm-global
参考:https://docs.npmjs.com/getting-started/fixing-npm-permissions
【讨论】:
【参考方案8】:我收到此错误Error: Cannot find module 'number-is-nan'
,而该模块实际存在。这是由于 Node.js 安装错误/不完整造成的。
对于 Windows ,正如其他答案所暗示的那样,您需要一个干净的 Node installation :
卸载 Node.js 删除C:\Users\user\AppData\Roaming
中的npm
和npm_cache
这两个文件夹
重启 Windows 并安装 Node.js
运行npm init
或(npm init --yes
for default config)
为NODE_PATH
设置Windows 环境变量。此路径是您的软件包的安装位置。可能类似于NODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
启动一个新的 cmd 控制台,npm
应该可以正常工作
注意:
在重新安装 Node.js 之前尝试最后几点,它可以节省您一些时间并避免重新安装所有包。
【讨论】:
【参考方案9】:我遇到了与 OP 相同的错误,但在挖掘日志时我可以看到 sh: node: command not found
。
事实证明,/usr/bin/node 程序(符号链接)不再与apt install nodejs
一起安装。一旦符号链接 /usr/bin/node' to
nodejs,
npm install -g @angular/cli` 成功。
在 debian 上安装它的正确方法是apt install nodejs-legacy
。
【讨论】:
【参考方案10】:我以简单的方式做到了这一点......
-
从控制面板卸载节点 [Windows 7]
再次安装节点
安装量角器
npm install --global --verbose protractor
更新网络驱动程序管理器。
对我来说很好。
希望对你有所帮助....
【讨论】:
【参考方案11】:就我而言,node
和 npm
都在同一路径中 (/usr/bin
)。 NODE_PATH
是空的,所以 npm
将全局模块放入 /usr/lib/node_modules
中,require(...)
成功找到它们。
唯一的例外是 npm
模块,它随 nodejs 包一起提供。由于我使用的是 64 位系统,因此将其放入 /usr/lib64/node_modules
。这不是 require(...) 在空 NODE_PATH
和节点从 /usr/bin
开始的情况下搜索的地方。所以我有两个选择:
/usr/lib64/node_modules/npm
到/usr/lib/node_modules/npm
将模块从/usr/lib/node_modules/*
移动到/usr/lib64/node_modules/
并设置NODE_PATH=/usr/lib64/node_modules
两者都有效。我正在使用 OpenSUSE 42.1 和更新存储库中的 nodejs 包。版本是 4.4.5。
【讨论】:
【参考方案12】:对于 Windows,来自 Nodejs cannot find installed module on Windows? 对我有用的是运行 npm link
npm link wisp
【讨论】:
请注意 - 我这样做了,但无法将我的压缩代码与 AWS lambda 一起使用。我必须像npm install wisp --save
一样在本地创建 node_module(没有 -g 选项)【参考方案13】:
在 Windows 上,如果您刚刚进行了全新安装并且得到了这个,您需要清除 \AppData\Roaming 中的 npm 缓存
【讨论】:
【参考方案14】:对于一些(比如我)没有其他方法的人,试试这个:
brew cleanup
brew link node
brew uninstall node
brew install node
希望它可以帮助某人:)
【讨论】:
【参考方案15】:在root
下运行Ubuntu
的测试服务器之一上遇到了同样的问题。然后使用useradd -m myuser
和installed everything(nvm
,node
,包)作为myuser
创建一个新用户。现在它工作正常。
【讨论】:
【参考方案16】:我得到了“乐观主义者”模块错误,我只是做了“npm install”来解决它。克服了那个错误。
https://github.com/mbloch/mapshaper/issues/12
【讨论】:
【参考方案17】:将此添加到 prog(mac) 的开头:
module.paths.push('/usr/local/lib/node_modules');
【讨论】:
以非操作系统特定的方式做到这一点的任何方式? @UpTheCreek 这是一种非操作系统特定的方式。这是 JS 代码,你只需要指向一个 node_modules 有你正在寻找的模块 @Adelin - 这是一个特定于操作系统的解决方案,因为全局 node_modules 的位置是特定于操作系统的。例如。如果您在 Windows 上开发,并在生产环境中运行 linux,那么这不是一个很好的解决方案。 这很容易克服。例如,您可以将节点路径保存在 env 变量中,然后将硬编码路径替换为os.environ.nodepath
(类似这些行)。
macOS Mojave 10.14.6 需要将 export NODE_PATH=/usr/local/lib/node_modules/npm/node_modules 添加到 ~/bash_profile 中,因为本机 .js 代码不受影响,因此更加独立于机器。
【参考方案18】:
默认情况下,node 不会在 /usr/local/lib/node_module 内部查找来加载全局模块。 参考http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders中解释的模块加载
所以要么你必须 1) 将 /usr/local/lib/node_module 添加到 NODE_PATH 并导出 要么 2)将安装的节点模块复制到 /usr/local/lib/node 。 (如加载模块节点的链接中所述,将在此路径中搜索并起作用)
【讨论】:
【参考方案19】:对于遇到此问题的其他人,我遇到此问题是因为我的 npm
安装到了我的 NODE_PATH
之外的位置。
[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH
我的 NODE_PATH 是空的,运行 npm install --global --verbose promised-io
表明它正在安装到 /opt/lib/node_modules/promised-io
:
[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli '/opt/bin/npm',
npm verb cli 'install',
npm verb cli '--global',
npm verb cli '--verbose',
npm verb cli 'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]
我的脚本在 require('promised-io/promise')
上失败:
[neek@uberneek project]$ node buildscripts/stringsmerge.js
module.js:340
throw err;
^
Error: Cannot find module 'promised-io/promise'
at Function.Module._resolveFilename (module.js:338:15)
我可能使用 configure --prefix=/opt
从源代码安装了 node 和 npm。我不知道为什么这使他们无法找到已安装的模块。现在的解决方法是将 NODE_PATH 指向正确的目录:
export NODE_PATH=/opt/lib/node_modules
我的require('promised-io/promise')
现在成功了。
【讨论】:
在哪里设置这个 NODE_PATH ?? @sandy 在哪里设置 NODE_PATH 环境变量取决于您的操作系统。我使用的是 Linux 风格,所以我使用export NODE_PATH=...
将其设置在本地 shell 中,以便将其导出到在该 shell 中运行的命令。要使更改对所有 shell 持久或可用,请将其放在 .profile 或类似文件中。整个概念对于新手来说非常复杂,请尝试阅读 help.ubuntu.com/community/EnvironmentVariables 。对于 Windows,您需要切换到 Linux。好吧,开个玩笑。试试computerhope.com/issues/ch000549.htm 或谷歌吧。
对于 OSX Lion,以下为我工作... export NODE_PATH=/usr/local/lib/node_modules 我使用“定位节点模块”来追踪正确的路径。
NODE_PATH 也适用于 WINDOWS。这根植于节点模块,可以在本地和全局安装。
如果您在 Mac OS X 上使用 Homebrew 安装了 Node.js:在终端中运行 open -a TextEdit ~/.bash_profile
,然后将 export NODE_PATH=/usr/local/lib/node_modules
添加到文件末尾。重新启动终端窗口。现在运行echo $NODE_PATH
应该会打印出/usr/local/lib/node_modules
。以上是关于NPM 全局安装“找不到模块”的主要内容,如果未能解决你的问题,请参考以下文章
出现错误,错误:npm install 后找不到模块“express”