现在的位置: 首页 > 综合 > 正文

如何写gem

2018年04月19日 ⁄ 综合 ⁄ 共 2733字 ⁄ 字号 评论关闭

第一步:用bundle gem gem_name生成基本结构,如下:

Shell代码  收藏代码
  1. [root@arch demo]$ bundle gem rename_url  
  2.       create  rename_url/Gemfile  
  3.       create  rename_url/Rakefile  
  4.       create  rename_url/.gitignore  
  5.       create  rename_url/rename_url.gemspec  
  6.       create  rename_url/lib/rename_url.rb  
  7.       create  rename_url/lib/rename_url/version.rb  
  8. Initializating git repo in /home/suchj/programs/demo/rename_url  

注:

Gemfile # 描述依赖

Rakefile # 发布和打包的 rake tasks
GEM_NAME.gemspec # gem 的 spec
GEM_NAME/lib/GEM_NAME.rb 与 GEM_NAME/lib/GEMNAME/ # gem 里的 library
GEM_NAME/lib/GEM_NAME/version.rb # 版本记录
第二步:写Gems规范文件,rename_url.gemspec
Ruby代码  收藏代码
  1. # -*- encoding: utf-8 -*-  
  2. $:.push File.expand_path("../lib", __FILE__)  
  3. require "rename_url/version"  
  4.   
  5. Gem::Specification.new do |s|  
  6.   s.name        = "rename_url"  
  7.   s.version     = RenameUrl::VERSION  
  8.   s.authors     = ["xx"]  
  9.   s.email       = ["xx@gmail.com"]  
  10.   s.homepage    = ""  
  11.   s.summary     = %q{TODO: Write a gem summary}  
  12.   s.description = %q{TODO: Write a gem description}  
  13.   
  14.   s.rubyforge_project = "rename_url"  
  15.   
  16.   s.files         = `git ls-files`.split("\n")  
  17.   s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")  
  18.   s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }  
  19.   s.require_paths = ["lib"]  
  20.   
  21.   # specify any dependencies here; for example:  
  22.   # s.add_development_dependency "rspec"  
  23.   # s.add_runtime_dependency "rest-client"  
  24. end  
 
第三步:写实现,lib/rename_url.rb
Ruby代码  收藏代码
  1. require "rename_url/version"  
  2.   
  3. module RenameUrl  
  4.   def self.included(base)  
  5.     base.extend(ClassMethods)  
  6.   end  
  7.   
  8.   module ClassMethods  
  9.     def urlize  
  10.       include RenameUrl::InstanceMethods  
  11.     end  
  12.   end  
  13.   
  14.   module InstanceMethods  
  15.     def to_param  
  16.       "#{id}_#{title}"  
  17.     end  
  18.   end  
  19. end  
  20.   
  21. ActiveRecord::Base.send(:include, RenameUrl) #在model中引入  
 第四步:打包gem
Shell代码  收藏代码
  1. [root@arch rename_url]$ gem build rename_url.gemspec   
  2. WARNING:  no homepage specified  
  3.   Successfully built RubyGem  
  4.   Name: rename_url  
  5.   Version: 0.0.1  
  6.   File: rename_url-0.0.1.gem  
 注:如果规范文件有信息没写全,会有警告
第五步:使用,在项目的Gemfile中加入
Ruby代码  收藏代码
  1. gem 'rename_url':path => '~/programs/rename_url'  
 注:gem文件在哪就写哪个路径
post.rb
Ruby代码  收藏代码
  1. class Post < ActiveRecord::Base  
  2.   urlize #相当于include RenameUrl::InstanceMethods  
  3. end  
测试:
Shell代码  收藏代码
  1. [root@arch demo]$ rails c  
  2. Loading development environment (Rails 3.0.4)  
  3. 1.8.7 :001 > Post  
  4.  => Post(id: integer, name: string, title: string, content: text, created_at: datetime, updated_at: datetime)   
  5. 1.8.7 :002 > Post.create(:title => "test")  
  6.  => #<Post id: 2, name: nil, title: "test", content: nil, created_at: "2012-02-03 08:38:53", updated_at: "2012-02-03 08:38:53">   
  7. 1.8.7 :003 > Post.find_by_title("test").to_param  
  8.  => "2_test"   

 OK,打完收工

抱歉!评论已关闭.