Ruby:如何正确地将一个应用程序拆分为多个gem

Ruby:如何正确地将一个应用程序拆分为多个gem,ruby,rubygems,gem,bundler,Ruby,Rubygems,Gem,Bundler,我正在用Ruby开发一个应用程序。它最初是一个小的命令行实用程序,但现在它变得相当大,基本上有三个不同的应用程序:一个命令行util、一个Sinatra web服务器和另一个公开restfulweb API的服务器,这三个应用程序都依赖于一个数据库来使用相同的数据执行各种不同的操作 在Yehuda Katz之后,我将使用bundler管理所有依赖项,并将Gemfile.lock提交到源代码管理中。我依赖于许多第三方依赖关系,对于某些依赖关系,我确实关心特定的版本(因为已知的问题) 现在,应用程序

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

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

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

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

问题是,我不知道如何以这种方式管理第三方依赖关系。在前面提到的文章中,YK声明对于gem开发,Gemfile.lock应该而不是添加到源代码管理中。 在我的例子中,我确实需要一些我正在使用的第三方gem的特定版本,并且Gemfile.lock在最近的一次初始部署中非常重要。 另外,我不打算发布这些gems,因为它不是一个开源项目。 我只需要一个干净的方法来管理我的依赖关系,包括第三方gems和内部gems

所以

  • 我应该创造四种不同的宝石吗
  • 我应该把它分成三个应用程序,全部依赖于我将创建的一个通用宝石吗
  • 那Gemfile.lock呢?在以下哪种情况下,将其保留在源代码控制中是明智的,为什么
  • 如果不打算发布的话,开发一个gem应用程序和开发一个普通应用程序相比,有什么缺点或优点吗
我很想听到一些经验丰富的红宝石专家关于如何做到这一点的建议和意见


谢谢。

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

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

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


至于你剩下的问题(是否以及如何将你的应用程序分割成gems)-我相信这不是一个合适的论坛,因为它太宽了,不适合这样做,但我祝你在努力使你的软件更易于管理和可重用方面好运

谢谢。但是,如果我理解正确,那么在部署场景中,仅将我的应用程序拆分为gems,然后以这种方式指定依赖项将不太可取,因为我无法控制所有依赖项的确切版本。这就是我提出问题的原因。我只想知道这两个选项中哪一个更可取,以便以一种既能管理部署依赖项又能在我自己的库中重用代码的方式拆分应用程序。希望这能缩小问题的范围。我想确保我没有遗漏任何东西。所以你确实回答了这个问题:)我收集到的是,你建议有三个非gem应用程序,每个应用程序都在git中提交Gemfile.lock,并且只在gem中放置公共代码,这样就可以重用。此外,我不应该担心gem自身特定的依赖版本,因为这三个应用程序中的Gemfile.lock会处理所有事情。对吗?没错。gem是ruby应用程序的一部分,比如
dll
s是
exe
s.hmm,是的,但是gem也用于打包工具;其中很多都带有一个bin/文件夹,用作可执行文件。所以这不完全一样。这就是为什么我问第一个选择——从技术上讲,我可以将这三个应用程序都创建为gems。
spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'