繁体   English   中英

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

[英]Local Gem Path For Development And Remote Git Repo For Production

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

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

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 ),但仍然在生产中使用远程仓库?

在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强制您获取遥控器中的最新更改。

正如@bbozo所提到的,当你在gemfile中使用git存储库时,你可以使用bundle本地覆盖进行开发 ,它将在你的Gemfile.lock中存储修订哈希。 在生产时,这些精确的修订版哈希将在运行bundle install时检出。

Gemfile:gem'example 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

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

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

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

bundle config local.tacokit / path / to / tacokit

在Gemfile中使用gem“tacokit”,github:“rossta / tacokit”,分支:“master”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM