如何开发一个自己的 RubyGem?

原创 2015年07月06日 23:44:32

什么是 RubyGem

RubyGem 是 Ruby 语言的标准源码打包格式。

大家一直都在用gem这个命令,但是很少有人知道这个东西是怎么来的,这里我从网上扒下一些资料汇总一下,分享给大家。最后面会有这些链接,想进一步了解的,可以点进去看看。Ruby 语言深受其他几种脚本语言的影响,其中就有 Perl,而 Perl 有个 CPAN(Comprehensive Perl Archive Network),这个东西也就像是现在的 RubyGems.org ,但是当时 Ruby 是没有这样一个东西的。像 CPAN 和 RubyGem ,它们仅仅是定义好的一种源码的打包和安装方式,另外还有一些组织,会提供这种免费的公共的源码包的存储,这也就现在大家每天都要使用的安装方式:

gem install rails

在 RubyGem 的发展历史当中,有几位重要的人物,这里也作为八卦知识给大家晒一晒,就当做大家茶余饭后的谈点吧。Ruby 社区的人应该都知道 Jim Weirich 这个人,他已经在2014年2月份去世了,是一个可爱的白胡子大叔,他和另外的四位 Rich Kilmer, Chad Fowler, David Black, Paul Brannan在2003年制定了 RubyGem 的基本规范和实现,但是其实 RubyGem 最早是 Ryan Leavengood 在2001年开发的,可惜没有流行起来,最后到了2003年,前面的5个人经过 Ryan Leavengood 的同意,使用了 RubyGem 这个名称,开发了新版的 RubyGem,其中并没有使用 Ryan Leavengood 的代码。这里附上 rubygems 的执行文件链接,看看注释,里面有上面几个人的名字 rubygems/blob/master/bin/gem

rubygems 有默认的源,也可以更改,国内的基本就是 https://rubygems.taobao.org 了,有些公司有自己的需求,也会搭建自己的私源。当前的官方源为https://rubygems.org,这个源也是几经辗转,早期的 Ruby 用户都知道 http://gems.rubyforge.orghttp://gemcutter.org,甚至github都曾经作为源使用过,也就是 http://gems.github.com,这三个现在都已经弃用了。

看看,一个简单的gem install 历史还不少啊。

RubyGem的基本使用方法

gem install rails  //安装rails
gem install rails -v 4.2.0   //安装指定版本的rails
gem search rails  //查找所有名称中含有rails的gem
gem search ^rails  //查找所有名称中以rails开头的gem
gem search ^rails -d  //查找所有名称中以rails开头的gem,并显示描述
gem build package.gemspec  //构建一个gem,就是把你自己写的gem源码,打包成一个.gem文件
gem push pack-1.0.gem  //发布到源上,默认是rubygems.org

这里只是简单列出了最常用的使用方法,大家看看就好,命令很有限,也很简单,执行gem --help,基本上所有的东西你都能10分钟内学会。

如何制作一个自己的RubyGem

前几年还是有这样那样的工具,现在用bundler就够了。

$ bundler gem mygem
      create  mygem/Gemfile
      create  mygem/Rakefile
      create  mygem/LICENSE.txt
      create  mygem/README.md
      create  mygem/.gitignore
      create  mygem/mygem.gemspec
      create  mygem/lib/mygem.rb
      create  mygem/lib/mygem/version.rb
Initializing git repo in /home/lizhe/Workspace/mygem

一个bundler命令就搞定了。来看看mygem这个文件夹下的东西:

total 24
-rw-rw-r-- 1 lizhe lizhe   90  72 15:52 Gemfile
drwxrwxr-x 3 lizhe lizhe 4096  72 15:52 lib
-rw-rw-r-- 1 lizhe lizhe 1062  72 15:52 LICENSE.txt
-rw-rw-r-- 1 lizhe lizhe  850  72 15:52 mygem.gemspec
-rw-rw-r-- 1 lizhe lizhe   29  72 15:52 Rakefile
-rw-rw-r-- 1 lizhe lizhe  556  72 15:52 README.md

现在来看看gemspec这个文件,它描述了这个Gem的各种信息

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

Gem::Specification.new do |spec|
  spec.name          = "mygem"
  spec.version       = Mygem::VERSION
  spec.authors       = ["lizhe"]
  spec.email         = ["lizhe@oneapm.com"]
  spec.summary       = %q{TODO: Write a short summary. Required.}
  spec.description   = %q{TODO: Write a longer description. Optional.}
  spec.homepage      = ""
  spec.license       = "MIT"

  spec.files         = `git ls-files -z`.split("\x0")
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.7"
  spec.add_development_dependency "rake", "~> 10.0"
end

我发现有人看到这个文件的内容时,倒是关心那个'git ls-files -z'.split("\x0")是什么意思?以及那个\x0是什么?附上一个链接,解释一下,参考链接。这个文件最上面先把 lib 文件夹添加到 load path 中,Gem::Specification 的第一部分主要是描述这个 gem 的信息,包括名称,版本等等,第二部分是这个 gem 都包括哪些文件,执行文件,测试文件以及哪些路径下的文件可以添加到 load path 中。第三部分是开发 mygem 需要依赖的其他 gem。这些信息都可以自定义,先按照默认走。让我们 build 第一个 gem 吧。

$ rake build

rake aborted!
WARNING:  See http://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    "FIXME" or "TODO" is not a description
/home/lizhe/.rvm/gems/ruby-2.1.5@global/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:149:in `sh'
/home/lizhe/.rvm/gems/ruby-2.1.5@global/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:57:in `build_gem'
/home/lizhe/.rvm/gems/ruby-2.1.5@global/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:39:in `block in install'
/home/lizhe/.rvm/gems/ruby-2.1.5@global/bin/ruby_executable_hooks:15:in `eval'
/home/lizhe/.rvm/gems/ruby-2.1.5@global/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => build
(See full trace by running task with --trace)

这个警告是提醒我们需要替换gemspec中的FIXMETODO,这个警告如果不解决是无法 build 一个 gem 的,直接删除掉 summary 和 description 中的TODO

  spec.summary       = %q{Write a short summary. Required.}
  spec.description   = %q{Write a longer description. Optional.}

再来执行:

$ rake build

mygem 0.0.1 built to pkg/mygem-0.0.1.gem.

好了,第一个 gem 诞生了。它就在当前目录的 pkg 下: mygem-0.0.1.gem 。如何使用呢?不考虑 bundler 的情况下,如果你开起了一个 irb 或者 pry 的 session 时,一般都会这样写:require "mygem",如果你现在这样做,那肯定不行,因为它还没有被安装到 ruby 的 load path 中,那就把它安装上。

$ rake install

mygem 0.0.1 built to pkg/mygem-0.0.1.gem.
mygem (0.0.1) installed.

安装好了,那就来使用一下,打开 irb :

require "mygem"
=> true
Mygem
=> Mygem

看,已经可以使用这个 module 了,不过这个 gem 啥也干不了,那么我们就给它添加一个方法吧,打开 lib/mygem.rb ,添加一个方法:

require "mygem/version"

module Mygem
  def self.hello
    p "hello from my gem"
  end
end

保存,然后执行rake install,这个命令会先 build 然后 install ,再重新打开 irb :

require "mygem"
=> true
Mygem.hello
=> "hello from my gem"

能够正常运行了,那就来发布第一个 gem 吧:

rake release
// 输入你在rubygems.org上的账号和密码

如果你的一个 rails 应用正好需要输出一个hello from my gem,那么现在你可以在 Gemfile 中添加这个 gem 了:

gem 'mygem'

添加完执行 bundle install,你就可以在你的 rails 应用中使用它了。

参考链接:


本文系OneAPM工程师原创文章。OneAPM是中国基础软件领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和SQL语句的实时抓取。想阅读更多技术文章,请访问OneAPM官方技术博客

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何制作自己的Ruby gem

如何生成自己的gem,以及如何组织自己的gem结构
  • yangcs2009
  • yangcs2009
  • 2014年12月30日 10:05
  • 3617

如何开发一个自己的个人网站

你应该也有过好的点子,你想做个高大上的网站来分享和传播自己,你甚至为之失眠。但你可能觉得没准备好,如果是这样,你不妨先动动手,做个简单的博客试试,注意是自己做一个,而不是安装一个wordpress。觉...
  • napoleonjk
  • napoleonjk
  • 2014年08月15日 17:22
  • 2097

如何自己开发一个简单的jquery 插件

要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统。这好比大公司们争相做平台一样,得平台者得天下。苹果,微软,谷歌等巨头,都有各自的平台及生态圈...
  • unionz
  • unionz
  • 2017年02月07日 19:34
  • 984

开发定制一个属于自己的小型数据库

一直很想开发个属于自己的小型数据库,并经历了一段时间的准备和学习,大致开发出了一个小型的数据库,这里主要介绍下核心代码的实现。     数据库的核心就是指针链表的使用和其算法的实现,关键就是对链表的灵...
  • qq498630285
  • qq498630285
  • 2010年10月12日 22:39
  • 1458

开发一套自己的操作系统

操作系统一般指电脑上使用的系统,比如咱们常用的Windows,Linux,Mac OS 等。在投资圈操作系统是指,一套买卖操作的标准。比如"均线之上做多,均线之下做空"。就是一条非常简单的规则,也可以...
  • xbsoar
  • xbsoar
  • 2017年03月19日 16:16
  • 502

开发自己的JQuery框架

模仿Jquery一步步实现自己的Jquery框架,并分析个步骤中改进的原因以及解决的问题;构造函数的返回值对new一个对象的影响等...
  • hsd2012
  • hsd2012
  • 2016年06月14日 22:10
  • 2867

如何测试你自己的 RubyGem?

如何测试一个Gemgem 开发完了,想要给别人用,那就需要测试啊,测试一个gem其实很简单,这里我们用 minitest 为例, rspec 也一样适用。先来看看我们当前这个 gem 的目录结构:-r...
  • wangpeng198688
  • wangpeng198688
  • 2015年07月07日 10:44
  • 1268

怎么开发一款区块链

要想将区块链在整体的开发和研究过程中,达到最佳的应用状态,需要的是在数据的存储,传输以及证明等方面进行更好的开发和研究,这样才能够在怎么开发一款区块链的效果上达到最好的表现形式。   就实际的操作情...
  • qq53016353
  • qq53016353
  • 2016年10月08日 20:12
  • 294

NO.1 做一个浏览器

R:      繁多的oppo浏览器推送让我厌倦。 G:一:要能安装在oppo手机上     二:全部界面只要地址栏&&确认按扭 F:    ——2016.8.12...
  • root_dream
  • root_dream
  • 2016年08月12日 20:02
  • 542

一个人如何完成一整个网站的开发(推荐好文,看完绝对让你回味无穷)

一个正规的网站开发,理论上需要一个团队的配合,各自发挥自己的长处,网站需求分析、原型设计、效果图、切图、前台美工、后台代码、算法设计、数据库设计、服务器配置等等一系列的事情。  一个人想面面俱到这...
  • u014326381
  • u014326381
  • 2015年08月22日 20:44
  • 7442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何开发一个自己的 RubyGem?
举报原因:
原因补充:

(最多只允许输入30个字)