`

如何制作自己的gem

阅读更多
Rails支持多种方式的扩展,包括plugin,gem, 或者放到lib文件下等多种方式。 但是随着bundler的出现, Rails3时代我们还是写gem比较好, 方便管理。

所以下面只介绍如何制作属于自己的gem。开始之前先确保你机器了安装了git。

在我们的项目里面, 我看到在config/initializers/下有一个hash.rb文件, 是使用了一个monkey patch的方式来对Hash进行了一个扩展:

  class Hash
    def # my_reverse
        hash_new = Hash.new
        self.each {|key,value|
           if not hash_new.has_key?(key) then hash_new[value] = key end
         }
         return hash_new
      end
   end
像这种扩展方式不是很好, 我想把它修改为一个gem, 如果以后有其他的扩展,比如对Array,Hash等其他方法扩展,我们可以升级gem,这样就方便管理了,不至于那么混乱。

我们开始吧:
1. 安装bundler, 因为我要用bundler来生成一个基础gem结构。

          gem install bundler
    
2. 使用bundler来生成一个基础gem结构:

           bundle gem ruby_extendsions
     
命令执行以后会看到生成下面这些文件:

      create  ruby_extendsions/Gemfile
      create  ruby_extendsions/Rakefile
      create  ruby_extendsions/.gitignore
      create  ruby_extendsions/ruby_extendsions.gemspec
      create  ruby_extendsions/lib/ruby_extendsions.rb
      create  ruby_extendsions/lib/ruby_extendsions/version.rb
Initializating git repo in /Users/alex/work/mygems/test/ruby_extendsions
     
说明一下:
1). ruby_extendsions.gemspec , 类似于这样的.gemspec文件,就相当于gem的说明书, 将来你打gem包的时候, 就靠这个文件了。
2). lib下放我们的代码实现
3). 整个项目至于git版本控制下。方便我们push到rubygem.org.

3. 使用Rspec进行TDD方式开发我们的代码:
确保我们能用rspec, 在ruby_extendsions.gemspec里添加:

s.add_development_dependency "rspec"
然后,执行:

bundle install
这下我们就可以使用rspec了。
在根目录下增加一个spec文件夹, 考虑到我们要实现的功能, 是对ruby的一些扩展, 所以我暂时就命名为了ruby_extendsions, 而此次只是针对Hash类的扩展, 所以我们需要在spec目录下建立一个测试文件hash_spec.rb和spec_helper.rb来测试我们对Hash扩展功能是否正确:

#spec/hash_spec.rb

require File.expand_path(File.dirname(__FILE__) + '/spec_helper')

describe "RubyExtend::HashExtendsions" do
  before(:each) do
    @hash1 = {:a => 1, :b => 2}
  end

  it "A hash data should not be reversed if havn't use ruby_extend " do
    #当没有使用我们的扩展的时候, Hash类是不应该包含hash_reverse这个方法的, 这个测试也保证了我们在扩展一个Ruby内部类的时候不会和其内部方法名冲突。
    @hash1.respond_to?("hash_reverse").should eql false 
  end

  it "A hash data should be reversed" do
    require 'ruby_extendsions'
    @hash1.hash_reverse.should eql({1=>:a, 2=>:b} )
  end
end
    
上面的代码:spec_helper.rb文件为将来准备,如果扩展其他方法, 会用到一些公用的配置。
测试由一 个正例和一个反例组成。

4. 运行测试:

bundle exec rspec spec, bundle exec确保rspec是使用我们在.gemspec文件里声明的版本。
当然,测试结果是会失败,因为我们还没有扩展hash_reverse方法呢。

5. 实现代码:
打开lib/ruby_extendsions.rb:

         require 'ruby_extendsions/hash_extendsions'   #我们今天要实现的Hash扩展
         require 'ruby_extendsions/array_extendsions'  #以后有可能用到对Array方法的扩展,我们就放这个文件里。
    然后在lib下建立hash_extendsions.rb文件:module RubyExtendsions     
  module HashExtendsions      #注意模块的命名要和文件名和路径保持一致。
    def self.included(base)     #hook, 当这个module在被include的时候触发
      base.send :include, InstanceMethods  #引入实例方法
      base.send :extend, ClassMethods          # 引入类方法
    end

    module InstanceMethods
      def hash_reverse   #我们的hash_reverse是实例方法
        hash_new = {}
        self.each {|key,value|
          if not hash_new.has_key?(key) then hash_new[value] = key end
        }
        return hash_new
      end
    end#InstanceMethods

    module ClassMethods
      #TODO
    end#ClassMethods

  end #HashExtendsions
end #RubyExtendsions

#真正的扩展
class Hash
  include RubyExtendsions::HashExtendsions
end

上面的代码都带注释了。
然后我们运行测试, oK, 都通过了。大功告成了。

6. 发布我们的gem:
我们修改一下.gemspec文件, 把项目相关信息都写里面去:

# -*- encoding: utf-8 -*-

Gem::Specification.new do |s|
  s.name        = "ruby_extendsions"
  s.version     = "0.1"
  s.platform    = Gem::Platform::RUBY
  s.authors     = ["blackanger"]
  s.email       = ["blackanger.z@gmail.com"]
  s.homepage    = "http://rubygems.org/gems/ruby_extendsions"
  s.summary     = "Ruby Extendsions For Hash"
  s.description = "Ruby Extendsions"

  s.required_rubygems_version = ">= 1.3.6"
  s.rubyforge_project         = "ruby_extendsions"

  s.add_development_dependency "bundler", ">= 1.0.0"
  s.add_development_dependency "rspec"

  s.files        = `git ls-files`.split("\n")
  s.executables  = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
  s.require_path = 'lib'
end

然后, 我们在根目录下执行命令:    rake install

这个命令会生成pkg/ruby_extendsions-0.1.gem.   到此为止,我们的gem包就打好了。你可以把你的gem项目上传到github。 但是github从去年开始就停止了自动打包服务。所以你如果想使用gem install ruby_extendsions命令来安装你的gem, 需要把它上传到rubygems.org里。 首先,你需要在rubygems.org里注册一个帐号。 其次, gem install gemcutter然后你就push吧。   gem push ruby_extendsions-0.1.gem如果碰到权限的错误,那说明在rubygems里面已经有了和你一样名字的gem包,换个名字就oK了。
1
1
分享到:
评论

相关推荐

    gem5-tutorial

    - **鼓励共享精神**:文档中明确表示鼓励用户分享自己的研究成果和经验,共同推动gem5的发展。 - **持续的更新与维护**:gem5项目组致力于保持项目的活跃度,定期发布新版本,并对已知问题进行修复。 总之,gem5...

    制作一个简单的gem

    制作一个简单的gem。

    DerivaGem软件

    - **导出和报告**:可能提供数据导出功能,便于进一步分析或报告制作。 如果你在使用DerivaGem过程中遇到任何问题,或者需要深入理解二叉树模型及其应用,可以与其他用户或专家联系,共享知识和经验。这个软件是...

    GPU gem1 PDF

    通过阅读《GPU Gem1》,读者不仅可以学习到GPU编程的基本概念,还能了解到当前图形学领域的前沿技术,这对于从事视觉艺术、游戏开发、虚拟现实、动画制作等相关工作的专业人士来说,是一份宝贵的参考资料。

    Gem Shader.zip

    "Gem Shader.unitypackage"的导入,将为开发者提供一个现成的工具,他们可以直接应用到自己的项目中,或者作为学习Shader编程的起点。在实践中,你可以通过调整Shader中的参数,观察它们如何影响最终的渲染结果,...

    SDHCAL GEM方案进展报告-王宇1

    这种自张紧工艺制作的探测器具备无死区、组装便捷、气流均匀等优点,且已成功制造出50cm×100cm的大面积GEM探测器。读出电子学系统由探测器阳极读出板、前端电子学板和数据获取板构成,每个读出单元为1cm²,总有效...

    国家重点研发计划GEM_HCAL初步设计方案20171019(王宇修改)1

    设计中采用了一种名为自张紧工艺的创新方法来制作双层GEM探测器。此工艺已成功应用于制造3-2-2-2结构的50cm×100cm和3-1-1结构的30cm×30cm GEM探测器。自张紧工艺的优势在于能确保大面积GEM探测器的均匀性和稳定性...

    Gem:开源代码编辑器-Source code editor

    宝石 具有简单但可自定义设计的现代...Gem是一个开源项目,它是用JavaFX制作的。 如果您愿意帮助改进Gem并想为该项目做出贡献,请单击以获取更多信息。 执照 版权所有:copyright:2020 Adel Senhadji 该项目已获得许可。

    中兴OLT的专线业务制作脚本

    con t con t interface gpon-olt_1/ 2 / 5 interface gpon-olt_...gemport 1 name gemport-1 unicast tcont 1 gemport 1 name gemport-1 unicast tcont 1 gemport 1 traffic-limit upstream gem-10M downstream gem-10M

    make-ruby-gem:想要制作Ruby宝石的人的教程

    制作Ruby宝石 想要制作Ruby宝石的人的教程。 为什么是宝石? 在开发Ruby或Rails应用程序时,您希望将代码公开给具有相同功能的开发人员。 因此,您使代码像libarary。 是的,这是一颗宝石。 环境 Ruby2.2.3 栏杆...

    openbabel-gem:用于 openbabel 的 Ruby GEM

    制作 卷曲 tar、sed、make(无论如何都应该存在) 安装 gem 安装 openbabel 它下载 OpenBabel 源代码。 如果尚未安装,它会编译并安装 OpenBabel 库。 它安装 OpenBabel ruby​​ 绑定。 如果 OpenBabel 尚未...

    微博:请原谅潜在的安全漏洞。 不推荐使用该gem,而推荐使用较新的api的gem

    注意: ... 如果我错过了一些东西,或者新浪添加了一些东西,请随意将其添加并自己添加。 我会尽力使宝石保持最新状态。 这个宝石是在创建的过程中制作的,请花点时间去检查该项目。 我认为这是与新浪

    gem:直接使用Web服务制作原型网站

    标题中的“gem:直接使用Web服务制作原型网站”指的是利用Web服务工具来快速构建Flask网站的原型。在Web开发中,原型设计是先于实际开发的重要步骤,它帮助开发者和设计师快速创建出一个功能简单但能展示核心概念的...

    companies_nz:用于查询新西兰公司办公室 API 的 Ruby gem 包装器

    目前,这个 gem 仅涵盖授权标头 HMAC SHA 256 签名,并且只返回 JSON 以供您制作。 未来的版本可能会在 Structs 中构造数据。 安装 将此行添加到应用程序的 Gemfile 中: gem 'companies_nz' 然后执行: $ ...

    prybaby:一个用 Pry 做一些额外事情的 Ruby gem

    我还想尝试自己制作一个 Ruby gem(我的第一个!),所以我决定制作一个从我的代码中删除所有binding.pry实例的宝石。 就这样,Prybaby 诞生了。安装只需运行gem install prybaby即可gem install prybaby它。使用它...

    一种超高精度同心环PCB的制作工艺探讨.pdf

    除了上述提到的关键技术外,文献还提到了在制作GEM专用PCB时会涉及到的材料特性、电路设计要求以及特殊设备的使用。例如,为了获得高精度的同心环,对所用的CCL(Copper Clad Laminate,覆铜层压板)和PCB基材的品质...

    rom-fmp:用于rom-rb数据映射和持久性gem的ruby filemaker适配器

    rom-fmp 用于rom-rb数据映射和持久性gem的文件制作适配器。 有关Ruby Object Mapper的更多信息,请参见github上的或 。安装将此行添加到您的应用程序的Gemfile中: gem 'rom-fmp'然后执行: $ bundle或将其自己安装...

    quickstrings:quickstrings gem,有助于快速生成样本数据

    我发现很多时候,当我制作一些种子数据或在IRB中测试一些呼叫时,我正在输入某些数据,例如电子邮件,URL,或者可能需要指定图像。 我浪费了无数的按键! 因此,我创建了这个小宝石来帮助简化事情,希望它也能对您...

    coffee_routes:Gem 允许从 Coffeescript 访问您的命名路由

    阅读 的制作。 安装 将此行添加到您的应用程序的Gemfile中: gem 'coffee_routes' 然后执行: $ bundle 或者自己安装: $ gem install coffee_routes 用法 在您的应用程序中包含coffee_routes.coffeee # =...

    aws_upload:一个 ruby​​ gem,它提供了一种帮助方法来构建表单 HTML 以使用 POST 方法将目录上传到 Amazon S3 存储

    或者自己安装: $ gem install aws_upload 用法 制作初始化脚本来配置上传参数。 在 config/initializers/aws_uplaod.rb AwsUpload . configure do | config | config . aws_access_key_id = ENV [ 'AWS_...

Global site tag (gtag.js) - Google Analytics