如何开发一个自己的 RubyGem?

什么是 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  7月  2 15:52 Gemfile
drwxrwxr-x 3 lizhe lizhe 4096  7月  2 15:52 lib
-rw-rw-r-- 1 lizhe lizhe 1062  7月  2 15:52 LICENSE.txt
-rw-rw-r-- 1 lizhe lizhe  850  7月  2 15:52 mygem.gemspec
-rw-rw-r-- 1 lizhe lizhe   29  7月  2 15:52 Rakefile
-rw-rw-r-- 1 lizhe lizhe  556  7月  2 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         = ["[email protected]"]
  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/[email protected]/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:149:in `sh‘
/home/lizhe/.rvm/gems/[email protected]/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:57:in `build_gem‘
/home/lizhe/.rvm/gems/[email protected]/gems/bundler-1.7.12/lib/bundler/gem_helper.rb:39:in `block in install‘
/home/lizhe/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `eval‘
/home/lizhe/.rvm/gems/[email protected]/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官方技术博客

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

时间: 2024-10-20 09:40:36

如何开发一个自己的 RubyGem?的相关文章

用python+django+twistd 开发一个属于自己的运维系统

开源的运维系统不少,比如nagios.zabbix.cati等等,但是遇到自己个性化的运维需求的时候,总是显的力不从心!最近在学习python,所以就考虑用python+django+twisted来定做一个完全个性化的运维系统. 运维系统有几个主要的功能:监控.分析.报警.更甚者直接根据分析的结果进行反应操作.而以上几点通过上述的框架可以比较容易的实现. 下面上图说明: 使用freemind整理了下思路: 下面是一些代码段,完整的代码下载见文档底部: Server: #!/usr/bin/en

【如何快速的开发一个完整的iOS直播app】(原理篇)

一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的. 直播易:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架,就能快速的搭建一个直播app,也就是传说中的站在大牛肩膀上编程. 二.了解直播 热门直播产品 映客,斗鱼,熊猫,虎牙,花椒等等 直播效果图 直播效果.jpeg 1.一个完整直播ap

【如何快速的开发一个完整的iOS直播app】(播放篇)

前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦 本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成[ijkplayer]遇见的各种坑. 很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以

使用内部类开发一个存放数据的容器

案例介绍:开发一个容器用来存放键值对,键存放英文名字,值存放中文名字,对键值对使用内部类来进行封装; 案例设计: ①   使用静态内部类封装键值对数据; ②   容器默认大小为5,超过就扩容其2倍; ③   通过调用entryArrays方法返回容器中的数据; 1 import java.util.Arrays; 2 public class EntryDemo{ 3 public static void main(String []args){ 4 MyContainer container=

2.3为方便旅客,某航空公司拟开发一个机票预定系统。 写出问题定义并分析系统的可行性。

为方便旅客,某航空公司拟开发一个机票预定系统.旅行社把预定机票的旅客信息(姓名.性别.工作单位.身份证号码.旅行时间.旅行目的地等)输入进 入该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞机起飞的前一天凭取票通知和账单交款取票,系统校对无误即印出机票给旅客. 写出问题定义并分析系统的可行性. 1>     目标:在一个月内建立一个高效率,无差错的航空公司机票预定系统 2>     存在的主要问题:人工不易管理,手续繁琐 3>     建立新系统 ①  经济可行性        

[原创]快速开发一个PHP扩展

http://blog.csdn.net/taft/article/details/596291 http://blog.csdn.net/heiyeshuwu/article/details/3453854 [原创]快速开发一个PHP扩展,布布扣,bubuko.com

作业1开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 hint: re.search(r'\([^()]+\)',s).group() '(-

怎么开发一个npm包

一.注册npm账号* 怎么将代码提到github,大家都知道需要一个github账号* 同样,开发一个npm包,当然也需要一个npm账号,将npm包发布到npm的托管服务器* 注册地址:[http://npmjs.org](http://npmjs.org)* 该实例包含了模块的局部调用和全局调用两种方式 二.开发npm包 1.目录构建* npm init* 项目结构:```javascript.├── bin //命令配置├── README.md //说明文档├── index.js //主

开发一个 App 有多难?说出来你可能不信!

上图为程序员客栈儿童类视频APP 1.开发一个APP有多难?说实话,单纯地从开发来说,开发一个APP没有那么难.如果一款APP的基本功能点确定了,开发时间一般为1-2个月就完成了,费用大约5-10万的样子.当然了如果1.0版本就要求很多功能,那开发时间就会延长,费用也会增加. 2.需要经历那些流程?简单来说一款APP的开发一般流程是这样的:原型(合格的原型)——设计(合格的设计)——前端——后端——测试. 3.需要哪些人员进行开发?原型:产品经理,根据确定的需求,画原型.设计:UI设计师,负责软