我怎样才能指定一个gem从一个私人的github存储库拉?

我有一个Github上的私人存储库,我想要使用。 我将我的应用程序部署到Heroku。 我如何指定一个私人存储库作为我的gemfile文件的来源? 我想这仅仅是说不够

gem "mygem", :git=>"my github address" 

根据Heroku技术支持部门的build议,最简单的方法是将用户名和密码放入URL中,如Basic HTTP Auth,例如

 gem 'my_gem', :git => 'https://my_username:my_password@github.com/my_github_account/my_repo.git', :ref => 'revision_no' 

这对我们有效。 这仍然有些不满,因为我们不得不把密码input到Gemfile中。 我们通过添加一个新的github用户帐户并将该帐户添加为gem项目上的协作者来处理此问题。 安全性还不是万无一失,但影响更为狭窄。

我读到的其他选项是设置您自己的gem服务器或供应商的gem 。

2012年5月16日更新:另一种解决方法是将密码放入Gemfile中,将密码放入环境variables中; 在Heroku上,用heroku config:add VAR=value做这个heroku config:add VAR=value ,然后在Gemfile使用这个variables,例如:

 gem 'my_gem', :git => "https://#{ENV['var_private_gem_username']}:#{ENV['var_private_gem_password']}@github.com/my_github_account.git", :ref => 'rev' 

这是Heroku的标准,以避免将密码,API密钥和任何凭据放入代码中。 对于本地开发/testing,您可以设置这些环境variables。 或者,假设您的开发计算机设置为通过SSH访问github,您将不需要用于本地开发的证书(SSH证书已经生效)。 所以你可以设置一些条件逻辑:

 private_repo_credentials = %w(var_private_gem_username var_private_gem_password). map { |var| ENV[var] }.compact.join(':') private_repo_credentials << '@' unless private_repo_credentials.empty? # private_repo_credentials will be "" if neither var is set # private_repo_credentials will be "username:password@" if they are set gem 'my_gem', :git => "https://#{private_repo_credentials}github.com/my_github_account.git", :ref => 'rev' 

我没有testing这最后一部分。 请提供反馈。

我发现部署从私人回购协议中获得的gem的最佳方式是使用GitHub的OAuth访问 。 要做到这一点:

  1. 创build一个GitHub用户访问有问题的回购(最好的团队 – 如果你没有暴露你的个人访问令牌,你可以简单地使用自己的帐户)。

  2. 为用户创build一个GitHub OAuth令牌。 使用curl在GitHub API上做到这一点很简单; 有关更多信息,请参阅OAuth API 。

  3. 将令牌添加到您的Gemfile中的git url。 例:

 gem 'mygem', git: 'https://xxx123abc:x-oauth-basic@github.com/user_or_team/mygem.git' 

我目前在Heroku上使用这个方法,效果很好。 美丽的是,你不必暴露你自己的个人信息,并且如果有东西被泄露,你可以在任何时候撤销或重新生成令牌。

我发现,如果我从我的terminal访问github( 通过上传一个SSH密钥github ),我可以简单地做:

 gem 'my_gem', :git => 'git@github.com:my_user/my_repo.git', :ref => 'revision_no' 

没有污染我的代码与我的git用户名或密码

希望在2015年仍然相关,你可以使用https://github.com/siassaj/heroku-buildpack-git-deploy-keys从github的部署密钥。;

这样你可以避免把用户名和传入Gemfile中,Gemfile将以Gemfile.lock中的纯文本结束

我发现,当使用env方法和heroku实验室:启用user_env_compile那么没有问题的Gemfile.lock