如何在代理后使用Bundler?

54

我从sudo bundle install命令中获得以下输出:

Fetching source index for `http://rubygems.org/`  
Could not reach rubygems repository `http://rubygems.org/`  
Could not find gem 'rspec-rails (>= 2.0.0.beta.22, runtime)' in any of the gem sources.

我已经正确设置了$http_proxy,还将gem: --http-proxy=my proxy添加到了~/.gemrc中。这些设置让我的gem命令能够正常工作,我希望它们也可以适用于bundler,但没有那么幸运。

考虑到sudo可能无法继承我所有的环境变量,我还将这些设置添加到了root用户,但是没有任何效果。

此时,bundler正在阻止我部署我的应用程序,而我几乎找不到其他人遇到过这个问题。如果没有人知道答案,我将被迫将bundler从我的Rails应用程序中删除(虽然我不介意这样做...)


我也遇到了这个问题。宝石(gem)在我的.profile和.gemrc中设置了http_proxy,就像原帖中所解释的那样。在OSX、ruby 1.8.7和rubygems 1.3.7上。欢迎任何想法 :) - user537339
嗨,不知道你有没有解决这个问题?我在OSX上似乎遇到了同样的错误 :( - Chris Kimpton
不,我从未让它正常工作过。我已经从我的应用程序中剥离了Bundler并在config/application.rb中手动加载gems。我几乎看不出区别。 - bioneuralnet
为什么这不起作用?我在Debian上也遇到了同样的问题。 - TuteC
11个回答

78

苹果电脑和Linux电脑

export http_proxy=http://user:password@host:port
export HTTP_PROXY=$http_proxy
如果使用了HTTPS,请也设置它。
export https_proxy=http://user:password@host:port
export HTTPS_PROXY=$https_proxy

如果你使用sudo命令,它默认不会保留http代理变量。使用-E标志来保留它。

$ sudo -E bundle install

可以通过以下方法使sudo默认保留环境变量:

https://memset.wordpress.com/2010/10/14/bash-http_proxy-from-a-user-environment-to-sudo-one/

Windows

如下面的答案所指出的那样,您可以使用SET来实现。

SET HTTP_PROXY=http://user:password@host:port
SET HTTPS_PROXY=%HTTP_PROXY%

1
猜得不错,但那也不是。 - bioneuralnet
1
从(至少)bundler 1.0.12开始,这似乎可以工作。也许他们修复了什么? - bioneuralnet
8
我在Windows上通过执行“SET”命令来实现它,例如SET http_proxy=http://user:password@host:port,对我有效,而且在Cygwin上也可以工作 :) - awsbz77
1
ahmy的回答是正确的。但是如果您的用户名或密码包含特殊字符,例如“<”或“>”(其他字符也可能会导致问题),gem将无法工作。请确保删除任何这些字符(通过更改您的密码/用户名),然后再次导出。如果有人对这些字符有解决方法,请回复。 - cameleon
1
默认情况下,sudo不会保留HTTP代理。- 非常重要的提示。 :) 谢谢。 - Gergely Bacso
显示剩余2条评论

15

我发现设置HTTP_PROXY(除了http_proxy)也产生了积极的效果,也就是说,它对我有用。因此,假设您已正确设置了http_proxy环境变量,请尝试以下操作(如果您使用的是bash)。

export HTTP_PROXY=$http_proxy

然后还需要使用-E选项来sudo(以保留环境变量),所以

sudo -E bundle install

Jarl


这就是为我解决问题的方法。让人困惑的是,似乎只有bundler使用了这个变量。 - UberAlex
同样对我有用的是导出大写的HTTP_PROXY而不是小写的。 - Jeff

5
如果您不想在系统中设置全局变量,您可以编辑 ~/.gemrc 文件,并将其写成以下样式:
---
:benchmark: false
:verbose: true
:sources:
- http://rubygems.org/
- http://gems.rubyforge.org
:backtrace: false
:bulk_threshold: 1000
:update_sources: true
gem: --http-proxy=http://USERNAME:PASSWORD@ADDRESS:PORT

2
很遗憾,Bundler忽略了这一点。 - bioneuralnet

5

为了在Win XP/7上使用bundler代理,我需要执行以下操作:

我在环境变量中添加了http_proxy。

  • 我的电脑
  • 高级系统设置
  • 高级选项卡环境
  • 变量
  • 新建
  • 变量名= http_proxy
  • 变量值= MY_PROXY
  • 点击"确定"

将MY_PROXY更改为您自己的代理

这可以使bundler正常工作。而.gemrc代理设置仅适用于gems。

感谢 Jamie


4
在环境变量中设置HTTP代理的方法是使用SET HTTP_PROXY=http://username:password@www.proxy.com,将其添加到调用bundle之前而不是在环境变量中进行设置。请注意,此操作并未改变原文意思,只是将其翻译成通俗易懂的中文。 - Montolide
1
我更喜欢更灵活和安全的方式:SET /P login="输入代理登录名:" SET /P password="输入代理密码:" SET HTTP_PROXY=http://%login%:%password%@proxy.com:8080 SET HTTPS_PROXY=%HTTP_PROXY%CLS - vladimir

3

也许更灵活且更安全的方法是使用批处理文件:

SET /P login="Enter proxy login: "
SET /P password="Enter proxy password: "
SET HTTP_PROXY=http://%login%:%password%@proxy.com:8080
SET HTTPS_PROXY=%HTTP_PROXY%

CLS

bundle install

喜欢这个想法,但是在密码中使用特殊字符时无法正常工作 :/ - Daniel

3

您可以使用 gem install 命令将所需的 gem 包下载到本地,然后再运行 bundle install 命令。虽然不是非常方便,但这种方法确实可行。


1
在执行bundle install之前,在Windows操作系统上,请运行以下命令。
SET http_proxy=http://user:password@host:port

0

0

确保您的操作系统默认 http_proxy 已经设置好。如果您正在使用 Linux,请尝试以下命令以了解它指向哪个代理。

echo $http_proxy

在我的Ubuntu操作系统中,我在~/.bashrc中设置了http_proxy环境变量为我的代理服务器。

是的,这对许多事情都有效,但正如我所说,Bundler似乎忽略了它。 - bioneuralnet

0

我正在使用Ubuntu操作系统。$http_proxy变量已设置,但是其中几个项目无法正常工作,其中之一就是gem。

如果您将以下内容放入~/.gemrc文件中,它将可用。

http_proxy: 代理地址:端口号

请将代理地址和端口号替换为您的代理地址和端口号。添加完成后,运行“bundle install”,一切都应该正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接