NodeJS 包管理

NodeJS package management

我想 运行 这行简单的代码(使用 Node.js 8.0.0):

time node -e "console.log(require('bcrypt').hashSync(process.argv[1], 8));" your-password-here

在我的 RaspberryPi 运行ning Linux Alpine 上比较 bcrypt 和 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')。

只有在我认为 "project local" 安装没有“-g”选项(即使我没有项目)之后它才最终起作用,并且在 运行 宁我的时候找到了 bcrypt测试命令。

npm install bcrypt

熟悉 NodeJS 的人能给我解释一下这个奇怪的机制吗?

全局安装的包不会在所有地方自动可用。像你那样安装一个平台是一个好主意,在这个平台上,你显然希望尽可能少地编译,因为它需要多长时间;但是,您仍然需要 link 在您的本地项目中全局安装包:

# install globally
npm install -g --production bcrypt


# link locally (you must run this in your project's directory)
npm link bcrypt

这将创建 symlink(s),它将简单地使全局安装的模块在本地项目的 node_modules 目录中可用 - 比重新编译模块一次要快得多每个需要它的项目。

但是,请务必记得在发布您需要的新版本时再次更新 bcrypt 运行ning npm install -g --production bcrypt。 运行 npm update 在您的项目中是不够的。

npm link 文档,值得一读。请注意,如果 运行 没有包名称作为其参数,则此命令的行为完全不同。