【发布时间】:2014-08-01 07:01:31
【问题描述】:
我经常听到经验丰富的节点开发人员说签入 node_modules 是一种很好的做法。但是大多数开发人员在 Mac/Darwin x64 上编写,但在 Linux x64 上部署。
如果一个节点模块恰好是用 C 编写的,而我将它安装在 OS X 上,我是否必须在 Linux 上重新构建它?
【问题讨论】:
标签: node.js deployment npm
我经常听到经验丰富的节点开发人员说签入 node_modules 是一种很好的做法。但是大多数开发人员在 Mac/Darwin x64 上编写,但在 Linux x64 上部署。
如果一个节点模块恰好是用 C 编写的,而我将它安装在 OS X 上,我是否必须在 Linux 上重新构建它?
【问题讨论】:
标签: node.js deployment npm
答案是:取决于包
大多数软件包都需要重新安装,因为node gyp 默认情况下编译器不会交叉编译 - 感谢@tkone。
像node-sass 这样的一些包会动态下载相关平台的预构建二进制文件(以前node-sass 用于包含所有平台的二进制文件,但最近发生了变化)。
【讨论】:
Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:
当前的 node-sass 3.4.2 不包含最初下载的 npm 包中的二进制文件(如在 npm 包缓存中 ~/.npm 下找到的)。
它的作用是它的 install.js 脚本将下载特定于平台的二进制文件并将其存储在vendor/{platform}-{arch}-{process.versions.module}.node 下。安装后,npm 通常不会再次调用 install.js 脚本。
因此,当您签入node_modules 时,它将包含仅适用于您的初始平台的二进制文件。
为了好玩,我移走了下载的二进制文件,这应该与其他人在不同平台上检查您的node_modules 相同。然后运行时,node-sass 非常聪明,可以检测到所需的二进制文件不存在。它优雅地退出,建议运行npm rebuild node-sass(也暗示这通常在您更改节点版本时是必要的)。这将下载当前平台的二进制文件,然后一切都很好。
但是,这完全是 node-sass 特有的,其他带有二进制文件的包的行为可能完全不同。
(有关process.versions.modules aka 的解释,请参阅Node.js release versions。NODE_MODULES_VERSION 确定二进制下载 URL 中的最后一个数字。二进制名称在 ~/.npm/node-sass/{version 中的 function getBinaryName() 中构造}/package.tgz/lib/extension.js)
【讨论】: