用于开发的本地 Gem 路径和用于生产的远程 Git 存储库
Posted
技术标签:
【中文标题】用于开发的本地 Gem 路径和用于生产的远程 Git 存储库【英文标题】:Local Gem Path For Development And Remote Git Repo For Production 【发布时间】:2013-11-25 07:57:47 【问题描述】:我有一个正在本地开发的 gem,供项目使用。
如果我在 中使用 path
指定 gem 的位置,我可以进行更改并且项目会获取新代码:
gem 'example', :path => "~/path/to/gems/example"
但是,当我推送到 Heroku 时,捆绑失败,因为 Heroku 无法访问我本地计算机上的 gem 源。
所以我可以将 gem 源推送到远程仓库并将 gem 源指向那里:
gem 'example', :github => 'example/example', :branch => 'example_feature'
但是我现在需要将更改推送到此存储库,然后更新 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
我可以通过为我的本地 repo 设置本地覆盖来稍微减轻痛苦:
$ bundle config local.example ~/path/to/gems/example
但是如果我想在我的项目中进行新的更改,我仍然需要在每次更改 gem 源时将更改的文件添加到 git、commit 和 $ gem update example
。
有什么方法可以让我的项目自动获取本地更改(就像我使用 path
时所做的那样),但仍然在生产中使用远程仓库?
【问题讨论】:
我几天前就被这个问题困住了。bundle config local.gem /path/to/gem
是我所知道的最好的方式。
【参考方案1】:
我在互联网上找到的最佳解决方案 https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html
捆绑配置 local.tacokit /path/to/tacokit
并在 Gemfile 中使用 gem“tacokit”,github:“rossta/tacokit”,分支:“master”
这个东西是工作和测试的解决方案
【讨论】:
local.GEM_NAME
【参考方案2】:
正如@bbozo 所提到的,当您在gemfile 中使用git 存储库时,您可以使用bundle local overrides for development,它将修订哈希存储在您的Gemfile.lock 中。在生产环境中,这些确切的修订哈希将在运行 bundle install 时被检出。
宝石文件:
gem 'example', git: 'https://github.com/your_name/example.git', branch: :master
捆绑配置 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
请注意,在“示例”git 存储库中提交后,您需要在主应用程序上运行 bundle install,以便它重建 Gemfile.lock 以包含新的修订哈希。我建议使用下面的 gem,因为它可以为您自动执行此过程,并且还有助于其他情况。有关详细信息,请参阅 gem 页面:
https://github.com/EPI-USE-Labs/git-bundle
【讨论】:
【参考方案3】:v1.2 之前的捆绑器
通过 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
...或者,使用 gem 的相对路径并确保 Heroku 在同一位置看到 gem,
gem 'example', :path => "../../gems/example"
...或者,尝试在捆绑程序http://bundler.io/v1.3/deploying.html 中使用--deployment
标志,它应该将您的gem 源与应用程序捆绑在一起,然后您可以将其提交到应用程序的git,因此理论上Heroku 应该使用本地副本和不要使用 git 来获取 gem 源(我说理论上是因为 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 会强制您获取最新的 遥控器的变化。
【讨论】:
你能链接到一个了解这些怪癖的好地方吗?我想我看到 Heroku 需要一个不同的相对路径来包含在 Gemfile 中使用:path
指定的 gem。
我收到错误:您不能两次指定来自不同来源的同一个 gem。对此有何其他想法?
@RyanFrancis,这是警告,不是吗?是的,这很愚蠢,它是新版本的 bundler
您不能两次指定来自不同来源的同一个 gem。您指定 gem_name (>= 0) 应该来自 /Users/以上是关于用于开发的本地 Gem 路径和用于生产的远程 Git 存储库的主要内容,如果未能解决你的问题,请参考以下文章