节点 gyp 未使用 npm 配置的私有注册表的问题



运行它的服务器位于公司防火墙后面,并且只能访问此特定的私有注册表,该注册表还充当公共 npm 注册表的代理(对于我们没有的软件包(。

NPM 本身工作正常;但是当使用 node-gyp 模块时,它会尝试执行 GET 输出以 nodejs.org -gyp http GET https://nodejs.org/download/release/v9.11.2/node-v9.11.2-headers.tar.gz。这将失败,因为系统无法访问该操作。问题是为什么 node-gyp 不使用 npm 配置中定义的注册表?还是我必须为标头设置单独的配置才能使用单独的源?

这是我的 npm 配置设置:

; cli configs
metrics-registry = "https://corporate/registry/"
scope = ""
user-agent = "npm/5.6.0 node/v9.11.2 linux x64"
; userconfig /home/user123/.npmrc
always-auth = true
cafile = "/home/user123/pub-cert.crt"
registry = "https://corporate/registry/"
sass_binary_path = "/root/linux-x64-59_binding.node"
strict-ssl = false

在阅读了 node-gyp 文档后,在执行节点构建之前执行以下操作,我最终能够让它适用于我的情况:

npm config set disturl <url>

(在您的情况下,<url>将是https://corporate/registry/,假设这是您的私有 npm 注册表的根 URL.
在您的.npmrc中,这可能看起来像:

disturl = "https://corporate/registry/"

我最初尝试通过设置环境变量来执行等效操作,但令人沮丧的是上面链接的 node-gyp 文档特别说

对上面列出的任何命令选项使用表单npm_config_OPTION_NAME(选项名称中的短划线应替换为下划线(

鉴于他们的文档将相应的标志称为--dist-url,你会假设env var会npm_config_dist_url,但这是错误的。它实际上是npm_config_disturl.


但是,使用上述任一方法,您需要确保注册表还包含可通过以下命令获取的SHASUM256.txt文件:curl -O https://nodejs.org/dist/vx.y.z/SHASUMS256.txt,将x.y.z替换为有问题的版本,在您的情况下9.11.2

第三种选择是使用wget或类似工具提前从您的私有注册表下载标头 tgz,然后使用npm config set tarball <path/to/downloaded/headers.tgz>设置tarball设置(或.npmrc/env var 等效方法(。此方法不强制验证校验和。

最新更新