【问题标题】:How to manage dependencies between my ruby projects?如何管理我的 ruby​​ 项目之间的依赖关系?
【发布时间】:2017-09-24 02:58:30
【问题描述】:

这听起来像是一个基本问题,但我在互联网上找不到任何答案。

所以我有一个 git ruby​​ 项目 database_models。这是一颗宝石。我想要 3 个其他项目来使用它。我已经在这 3 个项目中添加了对这个项目的依赖:

gem "database_models", :git => "path", :branch => master

现在,我希望这 3 个项目的 develop 分支使用 database_models 的 develop 分支,并且我希望这 3 个项目的 master 分支使用 database_models 的 master 分支,这样我的生产环境稳定且独立于我的开发环境。

我可以看到 4 个这样做的选项,我不喜欢其中任何一个:

  1. 将 database_models 部署到服务器,并使用路径而不是 git 更新这 3 个项目以引用 database_models

  2. Git 子模块

  3. 使用不同版本的 database_models gem(1.1、1.2、1.3...)。我可能需要我自己的 gem 服务器,对吧?

  4. 在 Gemfile 中编写一些代码,根据运行“捆绑安装”的环境选择正确的分支。

【问题讨论】:

    标签: ruby git dependencies bundler gem-bundler


    【解决方案1】:

    通常你会使用Bundler with a local path。您的 Gemfile 使用 gitgithub 指向 Git 或 Github 存储库:

    gem 'spree', github: 'spree/spree', branch: 'master'
    

    注意,包括分支。如果你愿意,你可以让你的每个项目使用你的 gem 的不同分支。如果你愿意,你可以让你的每个项目使用你的 gem 的不同分支。您还可以根据环境使用组来部署不同版本的 gem:

    group :development, :test
      gem 'spree', github: 'spree/spree', branch: 'bleedinedge'
    end
    
    group :staging, :production
      gem 'spree', github: 'spree/spree', branch: 'master'
    end
    

    只要您继续推送到 Github,以上内容就可以正常工作。但是由于本地配置,您可以在命令行上运行以下命令:

    bundle config local.database_modules ~/Projects/gems/spree
    

    这将为您的~/.bundle/config 添加一行,因此当您在项目中运行bundle 时,它将从您的本地存储库中提取它。

    【讨论】:

    • 是的,但是我如何根据环境或当前项目的分支使我的项目的不同分支依赖于我的gem的不同分支?即,在生产环境中,我希望我的项目使用 database_model gem 的主分支,在测试、暂存、开发中,我希望使用开发分支。我不能在测试、登台时使用本地路径,因为我不想将我的 gem 部署到服务器
    • 您应该可以为此使用 Gemfile 组,我更新了我的答案。 (我使用 master 进行登台和生产,因为您通常希望登台与生产在同一版本上。)如果您的 :test 在服务器上运行,它仍然“正常工作”。 bundle local 是一个可选的额外内容,以防止从 github 获取它,但 Gemfile 中的规范将在它不存在的情况下工作。
    • 使用 Gemfile 也是我的第一个想法。然而,这似乎是不可能的。我收到一条错误消息,说我的 gemfile 中有相同 gem 的重复版本,或者类似的东西。
    • 奇怪,我将它们广泛用于开发/测试/等。你可以试试内联语法,以防它解决gem 'spree', github: 'spree/spree', branch: 'master', group: [:staging, :production]
    • [!] 解析 Gemfile 时出错:您不能两次指定来自不同来源的同一个 gem。您指定 db-models (>= 0) 应该来自 git@github.com:Comp/db-models.git (at master) 和 git@github.com:Comp/db-models.git (at development) 。 Bundler 无法继续。 # from /project/Gemfile:11 # ----------------------------------------- -- # gem "db-models", :git => "git@github.com:Comp/db-models.git", :branch => "master", group: [:production] > gem "db-models ", :git => "git@github.com:Comp/db-models.git", :branch => "develop", 组:[:development, :staging]
    【解决方案2】:

    使用不同版本的 database_models gem(1.1、1.2、1.3...)。我可能需要我自己的 gem 服务器,对吧?

    我会这样做,只需让我的 Gemfile 通过标签选择正确的 gem。这是一个例子: git 'https://github.com/rails/rails.git', tag: 'v5.0.0'

    因此,您可以在将自定义 gem 存储在 github 上时执行相同操作(不需要 gem 服务器)。

    Here is how to use tags with Git.

    这应该为您提供所需的灵活性。

    【讨论】:

    • 谢谢!我想我要么使用这个解决方案,要么在发布项目时将 gem 的分支从“develop”更改为“master”
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多