创建你的第一个gem

第一次造轮子。

写在前面

用了很多前辈们造的轮子,没准你也想自己造个轮子,用实际行动来为open source添砖加瓦。

即便刚开始做出来的不甚理想,甚至是破砖破瓦,不过能自己做一个gem,这本身就是一件很cool的事了:P

那么一个简单的gem包括哪些文件呢?基本的框架是怎样的?如何快速创建一个gem?

创建

  • 准备工作:命名

    借用Phil Karlton的话:There are only two hard things in Computer Science: cache invalidation and naming things.

    So first of all, naming your gem. 记得去rubygems搜索下,确保你的gem名唯一。

    好,开始正式创建你的gem。

    如果你认真去看guides rubygems, 会发现步骤其实还挺多,这里我们直接抄近道。

    一个gem的基本pattern长这样:【该gem名为ice_bear,呃,谁会不喜欢ice bear?】

以下以ice_bear gem的创建为例,四步走:

  • 创建gem

    终端运行:

    bundle gem ice_bear
    

    如果是第一次创建gem,会问你要不要生成test文件(rspec/minitest),是否想要添加license等,根据需要回复即可。

    这里选择rspec,会生成如下文件:

    如果是第一次生成gem,是没有README.md的,需要自己手动添加。

  • 放到GitHub上,open source

    默认添加了version control,所以cd 到ice_bear 目录后,不需要git init.

    终端运行:

    cd ice_bear
    git add .
    git commit -m "my first gem ice_bear"
    git remote add origin https://github.com/XXX/ice_bear
    git push -u origin master
    
  • 修改文件:ice_bear_gemspec

    三处需要修改:spec.summary,spec.description,spec.homepage

    其中在spec.homepage 列添加你的public repo URL, 也就是你push到GitHub的repos 地址:

    Gem::Specification.new do |spec|
      ......
      spec.summary       = 'ice bear would have been less charming'
      spec.description   = <<-TEXT
      Ice Bear is the youngest of the trio but is undoubtedly the strongest and, in some respects, the most mature.
      TEXT
      spec.homepage      = "https://github.com/xxxx/ice_bear"
      ......
    end
    

    这里description部分太长,故用<<-TEXT TEXT【类似heredoc】包起来了。

    最近进度push到GitHub:

    git commit -am "update ice_bear_gemspec"
    git push
    
  • 运行测试文件,确保正常

    本地运行bundle exec rspec,得到如下结果:

    IceBear
      has a version number
      does something useful (FAILED - 1)
    
    Failures:
    
      1) IceBear does something useful
         Failure/Error: expect(false).to eq(true)
    
           expected: true
                got: false
    
           (compared using ==)
         # ./spec/ice_bear_spec.rb:7:in `block (2 levels) in <top (required)>'
    
    Finished in 0.08058 seconds (files took 0.55356 seconds to load)
    2 examples, 1 failure
    
    Failed examples:
    
    rspec ./spec/ice_bear_spec.rb:6 # IceBear does something useful
    

    查看测试文件:ice_bear_spec.rb

    RSpec.describe IceBear do
      it "has a version number" do
        expect(IceBear::VERSION).not_to be nil
      end
    
      it "does something useful" do
        expect(false).to eq(true)
      end
    end
    

    与预期相同,OK!gem 搭建成功,下一步,make your gem useful :P

关于发布

gem 完成后,确保你有RubyGems.org的账号,终端运行:

gem push ice_bear_0.1.0.gem

其中0.1.0是你gem的版本号,输入账号和密码即可。当然你也可以修改一些其他设置,比如set up a private gem server,具体参见publishing your gem

参考

How to setup a basic ruby project?

skeleton ruby project

guides rubygems

Ruby Project Structure

publishing your gem