在我们开始之前先做一下后勤工作……这本书假定你可以舒服的编写 Ruby 代码。如果不是这种情况,不用担心……有很多书和代码可以帮助你。你只要知道,这里有一些主题会深入一些更复杂的话题比如 Ruby 加载模式和命名空间。
就我个人而言,通过例子学习是最好的学习方式。我发现的最有价值的书和文章都会在涉及到一个话题后立刻展示真正的代码。我会在适当的情况下也这样做。我也会不留余力的从流行的 Ruby gems 中对比和高亮代码只要这是有意义的。我所希望的是这些 gems 可以给你提供些灵感并且最后展示给你看如何让你的想法可以被转化成可以工作的 Ruby gems。
让我们以这种方式开始吧……
什么是一个 gem?
一个 Ruby gem 是一个可以复用的打包好的 Ruby 应用程序或者类库,它专注于特定的功能。Ruby gems 可以做很多事情比如和 Twitter 交互,构建 web 应用程序,或者管理后台任务,等等。
Rubygems.org 是一个被社区认可的 Ruby gems 的托管站点。如果你用 Rails 工作过,你很可能用过 bundle install
命令来安装在一个 Gemfile
列表中 gems。在大多数情况下,它们是从 Rubygems.org 被下载和安装的。
对于 Ruby 来说很幸运的是,它的开源社区是强而广泛的。对于一个普通的应用需要的一个小功能很少会不能找到已有的 gem 去引用。然而,不要因为这种情况阻碍了你构建下一个伟大的 gem。
为什么构建一个 gem?
拿 Twitter 来举例……如果我们写了 3 个不同的应用都需要发一条推文作为一个用户行为的结果,把那些发送推文的代码写在 3 个不同的地方是很操蛋的。即使只写一次然后复制/粘贴到每个应用中也是很容易出错的。提取这些代码到一个新的 gem 是一件一劳永逸的事情。用这种方法,我们的应用会得到同一组方法和功能。但是不要担心,这个 Twitter 的 gem 已经被写好了,所以我们又少做了一件事!
一种更加复杂的情况牵涉到把一个庞大的应用拆分为微服务(由更小的致力于特定的功能的应用组成)。我们可以考虑这样做如果我们的应用程序变得庞大并且独立的组件开始变得越来越复杂。服务的基本原则和管理超出了本书的范围,但是我想说,还有一些其他理由让我们从我们的应用程序中提取代码到 gems 中。
我写了关于在我的应用中最流行的 ruby gems,再次看看这个列表, 我从这些 gems 的中得到的好处是巨大的。这是为什么使用 rails 构建 web 应用能让你快速迭代一个原因。
根据 Rubygems.org 的数据, 从 2009年7月开始已经有 66,783个 gems 被创建了,一共被下载了几乎 24 亿次。有大量的下载和大量的 gems!开源世界是对于 Ruby gems 和你的 ruby 应用程序都是一个很好的地方。花一些时间来简化你的应用并且让其他人能从你的的代码中获益,通过创建一个开源的 Ruby gem。
公开或私有?
我们将要构建的 Ruby gem (作为本书的一部分) 是开源的。然而,正如上面提到的,有些情况下把一个大的应用拆分成小的 gems 是一个好主意,在这种情况下,把这些小的 gem 作为你组织的私有 gem 是完全合理的。Github 使得创建私有代码仓库很简单所以你的代码是被保护的。
(好的)例子是很难的
很难去创建一个不无聊并且有价值的例子。那我们该创建什么呢?!?!
这本书的第一个部分将会专注于一个简单的 Ruby gem,它不会比决定文件结构和加载依赖更有趣。虽然这不会是你见过的最复杂的 ruby 代码,但我希望这个例子会足够用来展示从开始到完成一个 Ruby gem 的构建的必备步骤。
MegaLotto
我们会从一个创建随机彩票号码的叫做 MegaLotto
的 gem 开始。
MegaLotto
有两个特性:
- 它返回了一个包含 5 个 integer 的数组
- 数组的每个元素必须是一个 0 到 60 之间的随机数(不包含 0 和 60 )
这里是两个符合要求的例子:
[23, 22, 3, 7, 16]
[13, 20, 26, 1, 9]
接下来的章节的重点将会是我们构建一个 Ruby gem 的结构和步骤,和有少量 gem 自己的功能。
总结
希望我们现在构建一个 Ruby gem 的原因和我们这样做能得到的好处是很清楚的。
Stephan Hagemann 在 MountainWest RubyConf 的一个演讲叫做 Component-based Architectures in Ruby and Rails。这是我所见过的最好的关于在你已有的应用中提取类库的演讲。Stephan 的演讲从为什么你应该要从一个 Rails 应用程序中提取代码到你这样做会需要的特定方法和步骤都有涉及。我强烈建议你观看这个视频如果你从事大型 Rails 应用的开发。
如果和我一样,你大概已经在想了,『好了,快让我们看看代码!』。你是对的……下一章将会讨论一个 gem 的结构然后我们会开始我们的杰作 —— MegaLotto!