gpt4 book ai didi

ruby-on-rails - 如何使用本地 gem 存储库处理 Gemfile.lock?

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:25 25 4
gpt4 key购买 nike

简介

我们有一个 Rails5 应用程序,它分为大约 10 多个引擎和一个核心应用程序,它安装了这些引擎。

在我们的案例中,引擎是一个普通的旧 Rails 引擎,定义为 gem,位于专用的 git 存储库中。 Gemfile在核心应用程序中指的是所有引擎(见下文)。

要求的行为

  • 对于部署,应(由核心)使用特定版本的 gem/引擎。
  • 对于本地开发 HEAD应该(由核心)使用本地克隆存储库。

当前设置

我们通过对核心应用中的每个引擎执行以下步骤来实现这一点:

  • 正在添加 gem 'nice_engine1', '~> 0.0.1', branch: :develop, git: '[...]', tag: 'v0.0.1'
  • 设置 bundler 配置条目:bundle config local.nice_engine1 ../nice_engine1

这似乎可行,但我们还没有尝试使用该设置运行部署。

该设置的问题

每次在本地更新其中一个存储库时,我们都会运行 bundle install在核心中, bundler 更新了 Gemfile.lock到新HEAD本地引擎存储库的 ref。我们过去常常提交 Gemfile.lock 的更改.

不幸的是,这会导致一些问题:

  1. 如果有人更新核心应用程序而不更新引擎,则可能会发生核心应用程序 Gemfile.lock指的是一个引擎的 git commit,它在本地不存在。如果尝试使用 Rails 应用程序,这会导致错误。
  2. 在部署时(我认为)Gemfile.lock可能指的是提交 ID,它比我要部署的标记/版本的提交更新。我不确定在那种情况下会发生什么,但我担心这只会给我们带来麻烦。
  3. 我们在核心中有很多提交更改 Gemfile.lock (可能针对其中一个引擎的每次更改)。
  4. 然后在本地使用另一个引擎分支 master强制开发人员更改主应用程序中的分支名称 Gemfile

问题

管理 Gemfile 的正确/最佳方法是什么?和 Gemfile.lock在给定情况下如何避免这些问题?

有关最佳实践、改进建议等的一些提示,如何使用 bundler 和 git 来满足我们的要求,我将不胜感激。

最佳答案

If someone updates the core app, without updating the engines, it may happen, that the core Gemfile.lock refers to a git commit of an engine, which doesn't exist locally. That leads to errors if one tries to use the rails app.

这里有几个选项:

1) 使用类似 git-bundle 的 gem这样您就可以运行一个命令,例如 gitb pull 来更新主应用程序和引擎。

2) 在像 RubyMine 这样的 IDE 中打开主应用程序和引擎,因为如果您单击 VCS -> 更新项目,它会更新所有存储库。

3) 创建一个类似于 git-bundle 的脚本,同时更新所有存储库。

At deployment time (I think) the Gemfile.lock may referring to a commit id, which is newer then the commit of the tag/version that I want to deploy. I'm not sure what will happen in that case, but I fear, that this will just lead us to troubles.

假设主应用程序的一个特定版本被标记为 1.0。该修订版的 Gemfile.lock 指定引擎的哪些修订版用于 1.0。不可能部署主应用程序的标签 1.0,它运行的引擎修订版本不是 Gemfile.lock 中指定的版本。

We have a lot of commits in the core changing the Gemfile.lock (potentially for each change in one of the engines).

是的,没错。这个文件有效地将不同的 git 存储库和修订版绑定(bind)到一个应用程序中。它位于版本控制文件中这一事实使其美观且可追溯。

What would be the correct/best way to manage the Gemfile and the Gemfile.lock in the given situation to avoid these issues?

1) 有一颗 gem 。它叫做git-bundle .我写了它,我们已经在不同的应用程序中使用它大约 5 年了,现在取得了巨大的成功。欢迎 pull 请求或反馈。

2) 在主应用程序 Gemfile 中引用引擎时不要使用标签。如果在引擎中创建新功能,则通过在本地覆盖上分支所有存储库,在功能分支中执行此操作:

gitb checkout -b feature/branch_name

如果需要,可以通过在所有 git 存储库上拥有多个分支(例如 master、release 和 stable)来完成发布管理。将代码从一个环境移动到下一个环境:

gitb checkout release
gitb pull origin master
gitb push

3) 如果您需要在引擎中扩展(装饰或猴子补丁)类,反之亦然:我们还制作了activesupport-decorators查看可用的各种选项后。

关于ruby-on-rails - 如何使用本地 gem 存储库处理 Gemfile.lock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com