【问题标题】:If a node module is written in C, and I install it on Mac, do I have to reinstall it to deploy to Linux?如果一个节点模块是用 C 编写的,并且我在 Mac 上安装它,我是否必须重新安装它才能部署到 Linux?
【发布时间】:2014-08-01 07:01:31
【问题描述】:

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

如果一个节点模块恰好是用 C 编写的,而我将它安装在 OS X 上,我是否必须在 Linux 上重新构建它?

【问题讨论】:

    标签: node.js deployment npm


    【解决方案1】:

    答案是:取决于包

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

    • node-sass 这样的一些包会动态下载相关平台的预构建二进制文件(以前node-sass 用于包含所有平台的二进制文件,但最近发生了变化)。

    【讨论】:

    • node-sass 特别包含预构建的二进制文件。来自readmeNode-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:
    • 实际上 node-sass 不包含原始下载的 npm 包中的二进制文件。它的作用是它的 install.js 将下载特定于平台的二进制文件。
    • @jfrantzius 你确定吗?上例中为什么在 Mac 上安装了 Windows 和 Linux 二进制文件?
    • @mikemaccana 请看我的另一个答案,有可能是 2014 年到 2016 年之间的行为发生了变化。我昨天试过了 :)
    • 嗯,有道理 - 你是对的,我已经更新了答案。谢谢@jfrantzius!
    【解决方案2】:

    当前的 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)

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2017-09-18
      • 2019-10-13
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多