用于开发的本地宝石路径和用于生产的远程Git回购

时间:2013-11-12 22:46:40

标签: ruby-on-rails ruby gem bundle gemfile

我有一个宝石,我正在本地工作,项目使用。

如果我使用path指定了宝石的位置,我可以进行更改,项目会选择新的代码:

gem 'example', :path => "~/path/to/gems/example"

但是,当我推送到Heroku时,捆绑失败,因为Heroku无法访问本地计算机上的gem源。

所以我可以将宝石源推送到远程仓库并将宝石源指向那里:

gem 'example', :github => 'example/example', :branch => 'example_feature'

但是我现在需要将更改推送到此repo,然后更新gem以在我的项目中获得新的更改:

$ cd ~/path/to/gems/example
$ git c -a -m "Update gem"
$ git push origin example_feature
$ cd ~/path/to/projects/project
$ gem update example

通过为本地仓库设置本地覆盖,我可以减轻这种痛苦:

$ bundle config local.example ~/path/to/gems/example

但是如果我想在项目中进行新的更改,我仍然需要在每次更改gem源时将更改的文件添加到git,commit,然后$ gem update example

有没有办法让我的项目自动获取本地更改(就像我使用path时那样),但仍在生产中使用远程仓库?

3 个答案:

答案 0 :(得分:6)

v1.2之前的Bundler

通过Gemfile,

group :development, :test do
  gem 'example', :path => "~/path/to/gems/example"
end

group :production do
  gem 'example', :github => 'example/example', :branch => 'example_feature'
end

...或者,使用相对路径指向宝石,并确保Heroku在同一位置看到宝石,

gem 'example', :path => "../../gems/example"

...或者,尝试在捆绑器http://bundler.io/v1.3/deploying.html中使用--deployment标记,它应该将您的宝石源与应用程序捆绑在一起,然后您可以将其提交到应用程序的git,因此理论上Heroku应该使用本地副本,而不是使用git来获取宝石源(我在理论上说是因为Heroku有自己的怪癖)

Bundler v1.2及更高版本

http://bundler.io/v1.2/man/bundle-config.1.html#LOCAL-GIT-REPOS

  

Bundler还允许您在本地处理git存储库   而不是使用远程版本。这可以通过设置来实现   本地覆盖:

     

bundle config local.GEM_NAME /path/to/local/git/repository

     

例如,为了使用本地Rack存储库,开发人员可以   拨打:

     

bundle config local.rack ~/Work/git/rack

     

现在而不是退房   远程git存储库,将使用本地覆盖。相近   每次本地git存储库更改时,路径源都会发生变化   将由Bundler自动接收。这意味着提交   本地git repo会将Gemfile.lock中的修订更新为   本地git repo修订版。这需要与git一样的关注   子模块。在推送到遥控器之前,您需要确保本地   推送被覆盖,否则您可能只指向提交   存在于您的本地计算机中。

     

Bundler会进行许多检查,以确保开发人员无法使用无效   引用。特别是,我们强制开发人员指定一个分支   Gemfile以便使用此功能。如果指定的分支   Gemfile和本地git存储库中的当前分支没有   匹配,Bundler将中止。这确保了开发人员始终如此   对抗正确的分支,防止意外锁定   到另一个分支。最后,Bundler也确保了   Gemfile.lock中的当前版本存在于本地git中   库。通过这样做,Bundler强制您获取最新的   遥控器的变化。

答案 1 :(得分:1)

正如@bbozo所提到的,当你在gemfile中使用git存储库时,你可以使用bundle local overrides for development来存储你的Gemfile.lock中的修订哈希值。在生产时,这些精确的修订版哈希将在运行bundle install时检出。

<强>的Gemfile: gem 'example', git: 'https://github.com/your_name/example.git', branch: :master

Bundle config shell命令: bundle config local.example /path/to/local/git/repository

Gemfile.lock(自动生成): GIT remote: https://github.com/your_name/example.git revision: b9270e61abb89e1ff77fb8cfacb463e4d04388ad branch: master

请注意,在提交&#34;示例&#34;之后git repository你需要在主应用程序上运行bundle install,以便重建Gemfile.lock以包含新的版本哈希。我建议使用下面的gem,因为它可以为您自动执行此过程,也可以帮助其他方案。有关详细信息,请参阅gem页面:

https://github.com/EPI-USE-Labs/git-bundle

答案 2 :(得分:1)

我在互联网上找到的最佳解决方案 https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html

捆绑配置local.tacokit / path / to / tacokit

并在Gemfile中使用 gem&#34; tacokit&#34;,github:&#34; rossta / tacokit&#34 ;,分支:&#34; master&#34;

这个东西是工作和测试的解决方案