Technical Articles
无法访问npmjs.org时的变通方法
遇到的问题
当你在本地安装Node.js依赖,或将Node.js应用部署到Cloud Foundry环境时,遇到了超时等错误(例如,如下所示),你尝试ping NPM registry来测试连接性,也失败了:
-----> Building dependencies Prebuild detected (node_modules already exists) Rebuilding any native modules rebuilt dependencies successfully Installing any new modules (package.json) Error staging application sbf-sample: timed out after 15 minute(s)
默认情况下,Node.js依赖都是从https://registry.npmjs.org库中下载的,这是一个最常用的公开的NPM registry。当这个NPM registry因为任何理由不可访问和连接时,我们可以通过一些配置来解决这个问题。这属于Node.js相关的开发问题,更多说明可通过谷歌来了解。
变通方法
变通方法 1:实现项目自包含(Self-contained)
在将应用程序部署到Cloud Foundry运行时等云环境时,如果你发现从容器中安装依赖时会出现网络不稳定的情况,则可以尝试实现项目的自包含。这意味着你需要预先将所有依赖下载到本地,然后将它们与你的代码代码一起推到Cloud。
在package.json
同一目录下, 执行以下命令将所有依赖项安装到node_modules
文件夹中:
npm i
然后,你再尝试把项目推至云端。
更多详细信息参考:
变通方法 2:切换NPM Registry
当然,你可以直接通过切换NPM registry来解决无法访问npmjs.org的问题。你可以通过以下方式进行配置:
-
执行NPM命令:
npm config set registry <registry-url>
这个方法有一些缺点:
-
每次切换NPM registry时,你都必须回忆和重新输入正确的NPM registry URL。
-
该方法忽略了NPM registry的配置选项各有不同,例如用户名和密码。在切换到另一个NPM registry时,也必须更改这些选项。
-
在部署到云端的情况下,你没有机会执行命令对NPM registry进行配置。对于这种情况,你可以使用下一种方法来配置它。
-
-
创建一个
.npmrc
配置文件并设置NPM registry如果在将应用程序部署到Cloud Foundry运行时等云环境时遇到该问题,你可以尝试这种方法。
在项目或者子模块的根目录下,创建一个
.npmrc
配置文件,包含以下内容:registry=<registry-url> @<namespace>:registry=<registry-url>
注意:
-
如果你的项目中包含多个Node.js子模块,你需要为每个模块都维护一个
.npmrc
配置文件。 -
在将应用推至Cloud之前,请确保
.npmrc
没有被包含在.cfignore
-
-
配置Cloud Foundry中的
manifest.json
文件通过环境变量
npm_config_registry
来配置NPM registry。例如:
--- applications: - name: broker-tia memory: 128M env: npm_config_registry: <registry-url>
-
使用npmrc工具
如果你使用过私有的NPM registry,你就会知道在一堆不同的
.npmrc
文件之间切换和手动管理NPM registry URL的痛苦。别再让这成为问题了!npmrc工具可以解决这个问题。它使你可以非常简单地用一个特定的命名版本来切换你的.npmrc
。更多详细说明,可阅读:https://www.npmjs.com/package/npmrc
你可以根据你的偏好和目的选择合适的NPM registry。例如: