我有一个宝石,我正在本地工作,项目使用。
如果我使用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
时那样),但仍在生产中使用远程仓库?
答案 0 :(得分:6)
通过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有自己的怪癖)
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页面:
答案 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;
这个东西是工作和测试的解决方案