如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?

Posted

技术标签:

【中文标题】如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?【英文标题】:How to prevent node-gyp from downloading node-headers.tar.gz and node.lib from internet? 【发布时间】:2017-08-01 00:55:39 【问题描述】:

node-gyp 在安装和构建原生模块(如 iconv、ref、ffi 等)期间从 Internet 下载以下文件:https://nodejs.org/download/release/v6.10.0/node-v6.10.0-headers.tar.gzhttps://nodejs.org/download/release/v6.10.0/win-x86/node.libhttps://nodejs.org/download/release/v6.10.0/win-x64/node.libhttps://nodejs.org/download/release/v6.10.0/SHASUMS256.txt

如何让 node-gyp 使用来自本地文件夹而不是来自 Internet 的这些文件?

我找到了以下解决方案: 1. 下载https://nodejs.org/download/release/v6.10.0/node-v6.10.0-headers.tar.gz 2. 解压到本地文件夹。 3. 在这个本地文件夹中创建文件夹Release。 4. 下载文件https://nodejs.org/dist/v6.10.0/win-x64/node.lib到Release文件夹中。 5. 在 .npmrc 中设置属性 nodedir 将指向带有解压标题的文件夹: nodedir=D:\tools\node_src\node-v6.10.0-headers

现在 npm 安装包,node-gyp 构建本地包,无需从 Internet 下载节点头文件和库。 这是一个正确的方法吗?

我在文档中找不到我应该下载 node.lib 并将其放入 Release 目录。 在分析了node-gyp的痕迹和node-gyp的代码后,我决定这样做。 是否可以使用一些 npm_config_xxx 属性设置 node.lib 的位置?

【问题讨论】:

这篇文章救了我。谢谢。 当你决定更新你的节点版本时不要忘记这一点。花了半个小时把我的头撞在桌子上,因为>> npm rebuild node-sass 没用:D 【参考方案1】:

以下对我有用:

# download for private repo, probably you're behind firewall
curl -k -o node-v8.9.4-headers.tar.gz -L https://nexus.com/repository/binaries/node/v8.9.4/node-v8.9.4-headers.tar.gz

# capture the absolute path
TARBALL_PATH=$(pwd)

# configure tarball in npm config
npm config set tarball $TARBALL_PATH/node-v8.9.4-headers.tar.gz

# The below command should pass without gyp error
npm install

【讨论】:

非常感谢!在本地,我通过全局安装 node-gyp 然后运行 ​​node-gyp rebuild --dist-url=https://url/to/your/binaries/" 来解决这个问题......这将在您的机器上安装必要的标头。然后就可以正常运行了。但是,这在 CI 构建中不起作用,因此非常感谢您的解决方案!【参考方案2】:

正如这里所建议的,您可以为 node-gyp 使用 --tarball 选项 https://github.com/nodejs/node-gyp/issues/1133

【讨论】:

这不适用于 --tarball 选项不加载“node.lib”文件,仅加载标题的窗口【参考方案3】:

对于那些在 --tarball 无用的 Windows 上运行的用户,因为 node-gyp 随后想要下载 node.lib 文件...

这是我的解决方案,希望能帮助其他陷入公司障碍的人。我以 v16.2.0 为例,请换成你合适的节点版本。

创建一个您乐于存放 16.2.0 数据的文件夹,并使用终端命令指向它。我选择了%USERPROFILE%\.node-gyp\16.2.0。不必在.node-gyp

在该文件夹中创建两个子文件夹:Releasesrc

下载:https://nodejs.org/download/release/v16.2.0/win-x64/node.lib 和 https://nodejs.org/download/release/v16.2.0/node-v16.2.0-headers.tar.gz

node.lib 放在Release 子文件夹中。

打开 headers.tar.gz 文件。我用的是 7zip。进入 tar 后,导航到 include/node。

将两个.gypi 文件解压到您的基本文件夹中。

将其他所有内容提取到 src 子文件夹中。

使用--nodedir=%USERPROFILE%\.node-gyp\16.2.0(如果您与我不同,则使用您的等效文件夹)运行

【讨论】:

以上是关于如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 node-gyp 在 Windows 7 平台上工作

如何防止 Flask-SQLAlchemy 中的 SQL 注入?有没有更好的方法从 CSV 加载数据?

运行 yarn install 时如何避免 node-gyp 重建?

如何防止 HttpWebRequest 长时间响应超时 Azure Web App

如何解决 Windows 10 上的“node-gyp 重建”问题?

在 node-gyp 重建时挂在 npm install 上的厨师客户端