【发布时间】:2017-05-31 02:10:26
【问题描述】:
简介
我们有一个 Rails5 应用程序,它分为大约 10 多个引擎和一个核心应用程序,它安装这些引擎。
在我们的例子中,引擎是一个普通的旧 Rails 引擎,被定义为一个 gem,并位于一个专用的 git 存储库中。核心应用程序中的Gemfile 指的是所有引擎(见下文)。
必需的行为
- 对于部署,应使用特定版本的 gem/engine(由核心)。
- 对于本地开发,应使用本地克隆存储库的
HEAD(由核心)。
当前设置
我们通过对核心应用中的每个引擎执行以下步骤来实现这一点:
- 添加
gem 'nice_engine1', '~> 0.0.1', branch: :develop, git: '[...]', tag: 'v0.0.1' - 设置捆绑器配置条目:
bundle config local.nice_engine1 ../nice_engine1
这似乎可行,但我们尚未尝试使用该设置运行部署。
该设置的问题
每次本地更新其中一个存储库并且我们在核心中运行 bundle install 时,bundler 会将 Gemfile.lock 更新为本地引擎存储库的新 HEAD 引用。我们曾经提交过Gemfile.lock 的更改。
不幸的是,这会导致一些问题:
- 如果有人在不更新引擎的情况下更新了核心应用程序,则可能会发生核心
Gemfile.lock指的是引擎的git commit,它在本地不存在。如果尝试使用 rails 应用程序,则会导致错误。 - 在部署时(我认为)
Gemfile.lock可能指的是提交 ID,它比我要部署的标记/版本的提交更新。我不确定在这种情况下会发生什么,但我担心这只会给我们带来麻烦。 - 我们在内核中有很多提交更改了
Gemfile.lock(可能针对其中一个引擎中的每次更改)。 - 在本地使用另一个引擎分支然后
master强制开发人员更改主应用程序中的分支名称Gemfile
问题
在给定情况下管理Gemfile 和Gemfile.lock 以避免这些问题的正确/最佳方法是什么?
关于最佳实践、改进建议等的一些提示,如何使用 bundler 和 git 来满足我们的要求,我将不胜感激。
【问题讨论】:
-
Gemfile仍然是一颗普通的老红宝石。我会为所有子引擎(pleudocode)添加`git fetch` if Rails.dev?。 -
这听起来像是一个相当复杂的设置。我看到的一个问题是,人们将针对与生产环境不同的提交哈希进行开发,因此很难确定您正在处理的内容与实际内容以及在什么情况下兼容。我可能会尝试对 gems 进行版本化,并将它们与开发模式分开升级,作为不同的提交。
-
添加了另一个问题(引擎分支)。
标签: ruby-on-rails ruby git bundler rails-engines