我经常听到有经验的节点开发人员检查 node_modules 是一种很好的做法。但大多数开发人员在Mac / Darwin x64上编写,但在Linux x64上部署。
如果一个节点模块碰巧是用C编写的,我将它安装在OS X上,那么我是不是必须在Linux上重建它?
答案 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)