如果节点模块是用C编写的,我将它安装在Mac上,是否必须重新安装才能部署到Linux?

时间:2014-06-11 09:25:14

标签: node.js deployment npm

我经常听到有经验的节点开发人员检查 node_modules 是一种很好的做法。但大多数开发人员在Mac / Darwin x64上编写,但在Linux x64上部署。

如果一个节点模块碰巧是用C编写的,我将它安装在OS X上,那么我是不是必须在Linux上重建它?

2 个答案:

答案 0 :(得分:1)

答案是:取决于套餐

  • 大多数软件包确实需要重新安装,因为node gyp默认情况下编译器不会交叉编译 - 感谢@tkone。

  • node-sass这样的一些软件包动态下载相关平台的预建二进制文件(之前node-sass曾用于包含所有平台的二进制文件,但最近这已经改变了。)

答案 1 :(得分:0)

现在的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,其他包含二进制文件的包可能表现完全不同。

(有关确定二进制下载URL中最后一个数字的process.versions.modules又名NODE_MODULES_VERSION的说明,请参阅Node.js release versions。二进制名称在{/ 1}}中构建〜/ .npm / node-sass / {version} /package.tgz/lib/extension.js)