【问题标题】:Ruby: How to properly split an app into multiple gemsRuby:如何正确地将应用程序拆分为多个 gem
【发布时间】:2014-06-11 04:34:43
【问题描述】:

我正在用 Ruby 开发一个应用程序。它最初是一个小型命令行实用程序,但现在变得相当大,基本上包含三个不同的应用程序:一个命令行实用程序、一个 Sinatra Web 服务器和另一个公开 RESTful Web API 的服务器,所有这三个都依赖于数据库来执行各种操作相同数据的不同事物。

在 Yehuda Katz 的 this great article 之后,我正在使用 bundler 管理我的所有依赖项,并将我的 Gemfile.lock 提交到源代码控制中。我依赖于许多第三方依赖项,并且对于一些我确实关心特定版本(因为已知问题)。

现在,应用程序的所有三个部分都使用一些通用的基础架构代码:主要是用于与数据库通信的数据访问层,以及一两个其他通用类。但除此之外,它们可以被视为单独的应用程序。 如果这是其他语言,比如 Java,我可能会将其拆分为三个应用程序,然后将通用 DAL 代码放在所有三个应用程序都引用的类库中。

在 Ruby 中,我知道应该使用 gems 来打包代码库。 所以我正在考虑为应用程序创建三个 gem,并使用公共库代码创建第四个 gem。或者可能是三个“非 gem”应用程序,都依赖于一个共同的 gem。

问题是,我不确定如何以这种方式管理第三方依赖项。在上述文章中,YK 指出,对于 gem 开发,Gemfile.lock 应该添加到源代码控制中。 就我而言,我确实需要我正在使用的一些第三方 gem 的特定版本,并且 Gemfile.lock 在最近的初始部署中非常重要。 另外,我不打算发布这些 gem,因为它不是开源项目。 我只需要一种干净的方式来管理我的依赖项,包括第三方 gem 和内部。

所以...

  • 我应该创建四个不同的宝石吗?
  • 我是否应该将其拆分为三个应用程序,所有应用程序都依赖于我将创建的一个通用 gem?
  • Gemfile.lock 怎么样?将其保留在源代码管理中是明智之举,为什么?
  • 如果不打算发布的话,开发一个 gem 和一个普通的应用程序有什么缺点或优势吗?

我很想听听经验丰富的 Ruby 专家关于如何做到这一点的一些建议和意见...

谢谢。

【问题讨论】:

    标签: ruby rubygems gem bundler


    【解决方案1】:

    Gems 不需要 Gemfile.lock 文件,因为它们的依赖关系在 gemspec 中声明。
    要添加依赖项,请使用 add_runtime_dependency:

    spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
    

    但这对于部署场景来说不够具体!
    嗯,没错,但对于 gem 部署意味着它被部署到应用程序中。应用程序应该具有Gemfile.lock 文件来确定特定的库版本。

    应用程序部署需要完全可复制,因此所有库版本的内部版本号都应精心维护。另一方面,Gems 力求与尽可能多的版本兼容以便可重用,否则,一次 gem 更新将破坏所有依赖它的 gem。

    至于您的其他问题(是否以及如何将您的应用拆分为宝石)- 我认为这不是正确的论坛,因为它对 SO 来说太宽泛了,但我希望您在努力让您的软件更易于管理和更可重用!

    【讨论】:

    • 谢谢。如果我理解正确,将我的应用程序拆分为仅 gems,然后以这种方式指定依赖项在部署场景中不太理想,因为我无法控制所有依赖项的确切版本。这就是我提出问题的原因。我只是想知道这两个选项中的哪一个更可取,以便以一种既可以管理部署依赖项又可以在我自己的库中重用代码的方式拆分应用程序。希望这可以缩小问题的范围。我想确保我没有遗漏任何东西。
    • 所以你确实回答了这个问题 :) 我收集到的是你建议拥有三个非 gem 应用程序,每个应用程序都在 git 中提交了 Gemfile.lock,并且只将公共代码放在宝石,因此可以重复使用。此外,我不应该担心 gem 自己的特定依赖版本,因为这三个应用程序中的 Gemfile.lock 会处理所有事情。对吗?
    • 完全正确。宝石适用于像dlls 这样的红宝石应用程序适用于exes。
    • 嗯,是的,但 gems 也用于打包工具;其中很多都带有一个 bin/ 文件夹并用作可执行文件。所以并不完全相同。这就是为什么我询问第一个选项的原因 - 从技术上讲,我可以将所有三个应用程序都创建为 gem。
    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2021-04-19
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多