RubyGem 开发基础教程 已翻译 100%

Wyatt 投递于 2013/04/19 11:50 (共 16 段, 翻译完成于 04-24)
阅读 1544
收藏 4
1
加载中

如果你使用过Ruby语言,你一定不会对RubyGem陌生。RubyGems就是哪些通过“gem install”命令安装的第三方插件。这些插件可能用Ruby写的库文件,或者应用。本教程将会告诉大家如何创建你自己的RubyGem,创建一个RubyGem需要的标准步骤有哪些?以及怎样把自己创建的RubyGem上传到服务器供其他开发者使用?

本文假设读者已经具备基础的Ruby编程技巧,这是使用RubyGems封装可重用库的必要前提,因为首先你必须用Ruby编写该库。

xianlinbox
xianlinbox
翻译于 2013/04/22 19:10
1

什么是RubyGems?

RubyGems指的是两种不同的东西:安装并管理gems的软件,或者gem本身。管理gem的软件伴随Ruby发行,并且当你使用gem命令的时候,就会和它做交互。

Gems,在另外一方面,指的是Ruby代码的包(如果gem中又C的扩展代码,那指的就是C代码,但是这个已超出本文的范围)。Gems允许库的作者根据版本打包并分发库,并允许应用的开发者指定对某些版本的库的依赖关系。

Ruby开发者可以依赖于RubyGem来开发,而不是查找库,并把代码复制到你的项目中。并且RubyGems帮你管理gems的安装和解决依赖关系。这样就方便作者更新库,修复库中的错误,等等。

enixyu
enixyu
翻译于 2013/04/23 00:07
1

为什么我要写一个RubyGem?

如果你是Ruby新手,我更建议你去避免写一个RubyGem,而去关注Ruby编程本身。但是,有时候注入一些代码到RubyGem会更好。

另外,一般,我们都没有写一个RubyGem的需求。当我开始使用Ruby的时候,我在使用了Ruby一年的时间后,才开始写第一个RubyGem。我并没有刻意去避免写一个RubyGem,而只是,真的没有必要。

但是,有时候写一个RubyGem会很有意义。

enixyu
enixyu
翻译于 2013/04/23 00:14
1

首先,如果你在多个项目中,重复的复制粘贴类似的代码,你就要开始思考如何把这些代码放到一个RubyGem中。如果代码对其他用户也是有用的,你可以把代码打包并发布到可重用的公共的RubyGem库上。如果代码只是对你或者你的公司有用,你仍然可以把它打包并保存到私有的RubyGem库中。

把可重用的代码打包到一个RubyGem是非常有益处的。因为,它可以允许你只维护一份代码。多个项目可以依赖于不同版本的RubyGem,所以你不必担心代码会存在迭代。

除了可重用的库,RubyGem对于打包一个应用也是非常有用的。例如,你用Ruby写了一个Twitter客户端,你可以轻易的告诉你的用户,使用gem install来安装你的项目,而不必给他们发送整个ruby项目文件。

enixyu
enixyu
翻译于 2013/04/23 00:20
1

你的第一个RubyGem

以前编写RubyGem是一个乏味而且大量手工工作的活儿。但是,今天,已经有很多令人兴奋的的工具来自动完成很多琐碎的工作,免去大量的烦恼。

开发RubyGem最好的工具就是Bundler.Bunlder本身就可以开一个教程,所以我在这里不会阐述的很详细,只是把它当做开发gems过程中一个关键工具。你不需要拥有Bundler知识。

在过去的十年里,Ruby社区总结了一系列开发RubyGems的最佳实践方法。这些方法以目录层次结构,类/模块,命名方案,测试等等的形式展现。Bundler通过bundle gem,为开发RubyGem而设置了一个惯用的开发环境。

enixyu
enixyu
翻译于 2013/04/24 21:24
1

为了达到本教程的目,我们将创建一个gem,包括一个库和一个应用,并附带基本的数学计算函数。我们把库叫做RedundantMath,因为这个库本身是多余的;你本来就可以使用Ruby内嵌的标准运算方法。但是以教程为目的的话,这个例子相当好。

在我们开始之前,安装Bundler。Bundler可以通过RubyGems安装,运行gem install bundler即可。注意,如果你是在Unix类型的操作系统上操作时,你需要sudo权限。

切换至工作目录,并运行 bundle gem redundant_math。你将会看到类似下面的信息:

$ bundle gem redundant_math
      create  redundant_math/Gemfile
      create  redundant_math/Rakefile
      create  redundant_math/LICENSE.txt
      create  redundant_math/README.md
      create  redundant_math/.gitignore
      create  redundant_math/redundant_math.gemspec
      create  redundant_math/lib/redundant_math.rb
      create  redundant_math/lib/redundant_math/version.rb
Initializating git repo in /private/tmp/gemdev/redundant_math
“redundant_math”文件夹现在包含了所有开发RubyGem所需要用到的初始文件。
enixyu
enixyu
翻译于 2013/04/24 21:30
1

你的第一个库函数

在解释各种各样的文件是做什么的之前,先让我们在RubyGem中新增一个函数,然后小用一下,找找感觉。

修改文件"lib/redundant_math.rb", 如下:

require "redundant_math/version"

module RedundantMath
  def self.add(x, y)
    x + y
  end
end

然后,运行 bundle console 看看好不好用:

$ bundle console
irb(main):001:0> RedundantMath.add(1,2)
=> 3

太爽了!真简单.

bundle console 把你扔进了一个交互式的Ruby控制台并且提前加载了一些你能用到的gem(所有依赖的gem). 在你开发的时候,这是一种简单的方式手动测试你的 RubyGem.

咸鱼
咸鱼
翻译于 2013/04/24 20:30
1

Gem说明文档

RubyGem其中一个核心组件就是Gem说明文档,或者简称”gem spec“。这个一个以gemspec为扩展名的Ruby文件,描述RubyGem的一些元数据。

你可以在你创建的库中,查找gem spec,叫做"redunant_math.gemspec"。打开这个文件,看看它的内容。里面是非常标准的Ruby代码,可以学习一下。

花点时间修改一下RubyGem的作者,邮箱,描述和概述。RubyGem实际上不会让spec中的描述包含”TODO“的包,打包至gem中。这些字段用于在类似RubyGems.org站点上展现信息,但对于gem的函数本身并非十分重要。其他却不是。

enixyu
enixyu
翻译于 2013/04/24 21:42
1

可执行文件,测试文件,还有require路径设置文件对于RubyGem的函数却是十分重要。这些文件的目的是自解释:它们描述了某一个函数需要的一系列文件。例如,如果某个文件为在"file"配置中出现,那么它就不会被打包到RubyGem中,并在用户使用这个gem的时候提示丢失文件。如果你把可执行文件与RubyGem一起打包,那么它们必须出现在"executables"一节中,以此类推。

看看Bundler是如何配置gem 说明文档的。它使用 Git 来获取文件的列表,然后把可执行文件,测试文件等等的列表做转换。这非常聪明,因为Git是Ruby社区中一个非常标准的工具,可以让你开发gems的时候,免去手工管理gem的文件列表。

除了配置字段,gem说明文档通常用于说明RubyGem的依赖关系。我们现在没有任何依赖关系,但是它却是是这么去用的。

如果你不想去手工编辑文件,只想跟随别人的设置,那么你可以把以下代码复制粘贴到你的gemspec文件中:

# -*- encoding: utf-8 -*-
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'redundant_math/version'

Gem::Specification.new do |gem|
  gem.name          = "redundant_math"
  gem.version       = RedundantMath::VERSION
  gem.authors       = ["John Doe"]
  gem.email         = ["john.doe@gmail.com"]
  gem.description   = %q{Redundant math library.}
  gem.summary       = %q{Redundant math library.}
  gem.homepage      = ""

  gem.files         = `git ls-files`.split($/)
  gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
  gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
  gem.require_paths = ["lib"]
end
enixyu
enixyu
翻译于 2013/04/24 21:53
1

将你的第一个RubyGem打包

完成了gem 说明的配置,并已经把RedundantMath.add添加到库中,让我们来打包这个RubyGem。

Bundler再一次帮我们这个忙。作为配置目录结构的一部分,Bundler同样设置一个”Rakefile“,包含一些基本的任务去管理gem:

$ rake -T
rake build    # Build redundant_math-0.0.1.gem into the pkg directory
rake install  # Build and install redundant_math-0.0.1.gem into system gems
rake release  # Create tag v0.0.1 and build and push redundant_math-0.0.1.gem to Rubygems

运行rake build来构建第一个gem:

$ rake build
redundant_math 0.0.1 built to pkg/redundant_math-0.0.1.gem
非常容易!如果你进入“pkg”文件夹,你就可以看到你的RubyGem。

然后,运行rake install,在本地安装RubyGem到你的系统gem中。这相当于运行gem install。这只是一个捷径:

$ rake install
redundant_math 0.0.1 built to pkg/redundant_math-0.0.1.gem
redundant_math (0.0.1) installed
档gem安装后,切换到任何一个目录,使用irb来看看这个gem是否已经可用:
$ irb
irb(main):001:0> require 'redundant_math'
=> true
irb(main):002:0> RedundantMath.add(1,2)
=> 3
噢!!成功了!!你的第一个RubyGem已经可以工作了。不知道你会怎么样,但是当我第一次看到它可以工作后,我非常开心。我觉得我的ruby编程技能已经到达一个更高的水平了。你也会这么觉得的。你不再是一个纯粹的使用者了,也同样是一个ruby的创造者。恭喜。
enixyu
enixyu
翻译于 2013/04/24 22:01
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(1)

青怪
青怪
噢!!成功了!!
感谢翻译!
返回顶部
顶部