学习编写Ruby gem

之前写过一个IP反查地理位置的服务http://pytool.sinaapp.com/。在命令行中使用的时候经常需要先根据域名反查ip。然后浏览器打开反查地理位置的网址,拼接ip。于是想把这个功能封装到命令行里。比较好的平台有Ruby gem与npm。最后选择了Ruby gem。

安装RVM

RVM是一个Ruby环境管理器。可以参考安装方法,如下:

curl -L https://get.rvm.io | bash -s stable --autolibs=enabled

新建RVM gemset

这个功能的名字使用ip2location比较贴切,但是用gem search查过已经存在。最终使用名字ip2l

rvm gemset create ip2l
rvm gemset use ip2l 

打包gem

bundler是一个管理gem依赖,创建gem模版的好工具。安装也非常简单:

gem install bundler

然后创建我们的gem:

bundle gem ip2l

目录内文件结构为:

├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── ip2l.gemspec
└── lib
    ├── ip2l
    │   └── version.rb
    └── ip2l.rb

甚至连README都生成好了,非常规范,内容齐全。需要做的仅仅是替换掉一些TODO。

编写module

在ip2l.rb内添加类来实现服务调用:

require "ip2l/version"
require 'net/http'
require 'json'

module Ip2l
  class Ip2l
    def ip_to_location(ip)
      uri = URI("http://pytool.sinaapp.com/geo?type=json&pos=1&encoding=utf-8&ip=%s" % ip)
      content = Net::HTTP.get(uri)
      result = JSON.parse(content)
      result["geo"]["loc"]
    end
  end
end

编写可执行文件

在bin下添加文件ip2l。用optparse可以实现对命令行参数的解析。不过实际使用中发现optparse有很多不好用的地方。参数必填按照Stackoverflow上一个方案解决。希望可执行文件名后直接跟一个参数,看起来不支持,手动解析了。在参数校验成功后调用之前编写的module反查并输出。

ip2l = Ip2l::Ip2l.new
puts ip2l.ip_to_location(ip)

Gemspec

Gemspec的作用类似CocoaPods的Podspec。模版生成的文件已经放了不少TODO,根据需要自行替换成真实的信息。另外需要修改两行来指明可执行文件所在位置:

  spec.bindir        = "bin"
  spec.executables   = ["ip2l"]

校验与上传

执行rake install,之后命令行中应该已经可以使用了。如果希望发布到RubyGems.org,那么需要处理Gemspec中的发布限制。最简单的方法就是按照注释移除allowed_push_host部分。确保没问题后就可以使用rake release发布了。可能会遇到需要登录的问题。只需要到RubyGems.org注册一下,发布的时候登录一次就好了。

发布后马上就可以搜到了,地址是https://rubygems.org/gems/ip2l。写博的时间内已经有22的下载了。

写在最后

Ruby gem的工具集非常完善,做下来非常轻松。感觉CocoaPods的发布应该是参考了Ruby gem。以前总觉得Python语法舒服,库齐全,无法比拟。现在看起来Ruby也不差。

安装RVM后发现Ruby和gem都变成了RVM安装的版本,以前安装的一些gemset出问题了。简单改Ruby的链接后一堆问题,干脆Ruby和gemset都使用RVM的版本,重装了一些gem后看起来没问题了。

时间: 2025-01-16 20:55:40

学习编写Ruby gem的相关文章

编写Ruby脚本来对Twitter用户的数据进行深度挖掘_ruby专题

Twitter以及一些API 尽管早期的网络涉及的是人-机器的交互,但现在的网络已涉及机器-机器之间的交互,这种交互是使用web服务来支持的.大部分受欢迎的网站都有这样的服务存在--从各种各样的Google服务到LinkedIn.Facebook和Twitter等.通过web服务创建的API,外部的应用可以查询或是操纵网站上的内容. web服务可以使用多种方式来实现.目前最流行的做法之一是表述性状态转移(Representational State Transfe, REST).REST的一种实

创建自定义的Ruby gem包的教程_ruby专题

编写一个最简单的例子 1. 建好如下文件夹 注意:lib目录下必须有个和你gem名字一样的rb文件. 复制代码 代码如下:     $ cd hola      $ tree      .      ├── hola.gemspec      └── lib          └── hola.rb  2. 编写代码 . hola.rb % cat lib/hola.rb class Hola def self.hi puts "Hello world!" end end .hola.

网页设计师学习编写代码的一些理由

通常,在完成了一件网页设计后,设计师的无知都会显露无遗而备受指责.他们把创建网页代码的繁重工作都留给了程序员们.这种现象不只出现在网络开发行业,在软件及游戏开发业也是如此. 残酷的事实就是:开发进度可能会因设计师而停滞不前.为了追求最佳效率,设计师不仅需要描描画画,还需要能把它做出来!本文中,我想与读者分享一些为什么设计师需要学习编写代码的理由. 做现实可行的设计 有了一个最终产品将如何实现的明确印象,设计师将拿出更多实际可行的概念.作为开发进程中不可或缺的一份子,设计师肩负着确保他们的设计能够

学习编写C#服务程序,遇到了问题,求指教

问题描述 学习编写C#服务程序,遇到了问题.按照步骤写了个空的C#服务程序,.安装上电脑之后,直接就被电脑管家给设定为禁用...这是怎么回事儿..如何避免..最后,我手动设置启动,重启才出现我的服务程序.怎么才能不被电脑管家禁用? 解决方案 解决方案二: 解决方案三:那你应该问这个什么管家的作者,为什么要禁用你的服务解决方案四:卸载管家......解决方案五:添加白名单解决方案六:一般管家都会提示是否允许服务启动,选择允许就可以了.解决方案七:引用3楼plcly1的回复: 卸载管家......

Ruby中使用SWIG编写ruby扩展模块实例_ruby专题

在使用ruby/rails的过程中,确实发现有时性能不尽人意,如生成一个拥有600项的item的3层树形结构目录要花去20ms,为提高性能在学习用c/c++写ruby模块的过程中,认识了swig,rubyInline等一系列帮助编写c/c++来提升ruby性能的辅助工具. rubyInline用于内嵌c/c++程序,简单快捷,swig则帮助我们更容易地用c/c++写出独立的ruby模块. swig的入门使用方法 目标:用swig/c++编写一个ruby模块Test,并提供add方法作加法运算.

Ruby学习笔记之gem 命令详解_ruby专题

ruby -v #查看ruby 版本 ruby -e ''require"watir"; puts Watir::IE::VERSION'' #查看watir版本 rvm list known #列出已知的ruby版本 rvm install 1.9.3 rvm use 1.9.3 | rvm use system rvm use 1.9.3 --default rvm list #列出本地ruby版本 rvm remove 1.9.2 具体详情见RVM实用指南  https://ru

关于ruby gem无法连接到rubygems.org的解决方案

RubyGems 镜像 - 淘宝网 为什么有这个? 由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败.所以你会与遇到 gem install rack 或 bundle install的时候半天没有响应,具体可以用 gem install rails -V 来查看执行过程. 这是一个完整 rubygems.org 镜像,你可以用此代替官方版本,同步频率目前为15分钟一次以保证尽量与官方服务同步. 如何使用? $ gem sour

使用C++来编写Ruby程序扩展的教程_ruby专题

Ruby 最酷的功能之一就是使用 C/C++ 定义的应用程序编程接口 (API) 扩展它.Ruby 提供了 C 头文件 ruby.h,它随附提供了许多功能,可使用这些功能创建 Ruby 类.模块和更多内容.除了头文件,Ruby 还提供了其他几个高层抽象来扩展基于本地 ruby.h 构建的 Ruby,本文要介绍的是 Ruby Interface for C++ Extensions 或 Rice.创建 Ruby 扩展 在进行任何 Ruby 的 C API 或 Rice 扩展前,我想明确地介绍一下创

编写Ruby代码注释时需要注意的一些问题_ruby专题

    写出自解释文档代码,然后让这部分歇息吧.这不是说着玩.     使用英文编写注释.     使用一个空格将注释与符号隔开.     注释超过一个单词了,应句首大写并使用标点符号.句号后使用 一个空格     避免多余的注释. # bad counter += 1 # increments counter by one     随时更新注释,没有注释比过期的注释更好.     不要为糟糕的代码写注释.重构它们,使它们能够"自解释".(Do or do not - there is