我想运行这个简单的代码行(使用Node.js 8.0.0):
time node -e "console.log(require('bcrypt').hashSync(process.argv[1], 8));" your-password-here
将bcrypt与运行Linux Alpine的RaspberryPi上的bcryptjs进行比较。
起初它给了我:
module.js:487
throw err;
^
Error: Cannot find module 'bcrypt'
at Function.Module._resolveFilename (module.js:485:15)
at (...)
at evalScript (bootstrap_node.js:432:27)
所以我试着用这个命令安装bcrypt:
npm install -g --production bcrypt
哪个有效(从源代码编译后退,因为我的armv7处理器找不到linux依赖项)。
但是当再次尝试测试命令时,我有完全相同的错误(找不到模块'bcrypt')。
只有在做了我认为没有“-g”选项的“项目本地”安装之后(即使我没有项目)它最终工作,并且在运行我的测试命令时找到了bcrypt。
npm install bcrypt
有些熟悉NodeJS的人可以解释一下这种奇怪的机制吗?
答案 0 :(得分:2)
全球安装的软件包并非随处可用。像你一样安装一个是一个很好的想法,在一个平台上,你想要尽可能少地编译它需要多长时间;但是,您仍需要在本地项目中链接全局安装的包:
# install globally
npm install -g --production bcrypt
# link locally (you must run this in your project's directory)
npm link bcrypt
这将创建符号链接,这些符号链接只会使全局安装的模块在本地项目的node_modules
目录中可用 - 比为每个需要它的项目重新编译模块一次快得多。< / p>
但是,请确保在发布所需的新版本时,再次更新运行npm install -g --production bcrypt
的bcrypt。在项目中运行npm update
还不够。
npm link
文档,非常值得一读。请注意,如果在没有包名称作为参数的情况下运行,则此命令的行为完全不同。