Tạo Gem bằng Bundler

I. Giới thiệu

Gem là một gói thư viện Ruby. Trong giới hạn bài viêt này, chúng tôi sẽ giới thiệu về cách thức xây dựng, biên dịch, cài đặt và công bố Gem.

II. Tạo Gem

Khởi tạo

Có nhiều công cụ để xây dựng và quản lý Gem được phát triển trong nhiều năm qua. Ví dụ như echoe gem, jewler. Trong bài viết này chúng tôi sẽ dùng bundler để xây dựng, quản lý gem

Dưới đây là câu lệnh tạo 1 gem với tên mixi

$ bundle gem mixi
create mixi/Gemfile
create mixi/Rakefile
create mixi/LICENSE
create mixi/README.md
create mixi/.gitignore
create mixi/mixi.gemspec
create mixi/lib/mixi.rb
create mixi/lib/mixi/version.rb

Initializating git repo in

/home/nghialv/project/gem/tmp/mixi

Khi chạy câu lệnh bundle gem, thư mục mixi với 1 số file sẽ được tạo ra. Đầu tiên chúng ta hay quan tâm đến file mixi.gemspec

# -*- encoding: utf-8 -*-
require File.expand_path('../lib/mixi/version', __FILE__)
Gem::Specification.new do |gem|
  gem.authors = ["levannghia"]
  gem.email = ["[email protected]"]
  gem.description = %q{TODO: Write a gem description}
  gem.summary = %q{TODO: Write a gem summary}
  gem.homepage = ""
  gem.files = `git ls-files`.split($\)
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
  gem.name = "mixi"
  gem.require_paths = ["lib"]
  gem.version = Mixi::VERSION
end

Đây chính là file quan trọng nhất của gem. Nó chứa metadata về gem mà chúng ta đang tạo.

Gemfile

Trong Rails application, Gemfile quản lý những gói gem phụ thuộc được sử dụng trong ứng dung.

source 'https://rubygems.org'

Specify your gem's dependencies in

mixi.gemspec
gemspec

Ở đây sẽ sử dụng add_dependency để khai báo các gói gem phục thuộc trong gemspec, bundler sẽ nạp tự động thông qua Gemfile.

# -*- encoding: utf-8 -*-
require File.expand_path('../lib/mixi/version', __FILE__)
Gem::Specification.new do |gem|
  add_dependency “rspec”
end

Rồi dùng lệnh bundle install để cài đặt gem

$ bundle install
 Using diff-lcs (1.1.3)
Using mixi (2.0.1) from source at .
Using rspec-core (2.11.1)
Using rspec-expectations (2.11.3)
Using rspec-mocks (2.11.2)
Using rspec (2.11.0)
Using bundler (1.1.4)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

Rakefile

Rakefile khai báo helper task cho bundler

!/usr/bin/env rake
require "bundler/gem_tasks"

Dùng lệnh rake -T để xem 3 task mặc định khai báo trong Rakefile

$ rake -T
rake build # Build mixi-2.0.1.gem into the pkg directory
rake install # Build and install mixi-2.0.1.gem into system gems
rake release # Create tag v2.0.1 and build and push mixi-2.0.1.gem to Ruby...

Viết test

Khai báo thêm helper task trong Rakefile

require "rake/testtask"
Rake::TestTask.new do |t|
  t.libs << 'test'
end
desc "Run tests"
task :default => :test

Tạo test file trong thư mục test

$ emacs test/test_mixi.rb
require 'test/unit'
require 'mixi'
class MixiTest < Test::Unit::TestCase
  def test_something
    assert_equal "hello world", "hello world"
  end
end

Bây giờ có thể dùng lệnh rake test để chạy test

$ rake test
Run options:
# Running tests:
.
Finished tests in 0.000359s, 2787.7440 tests/s, 2787.7440 assertions/s.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

III. Dịch, cài đặt, công khai gem trên rubygems

rake build : dịch
rake install : cài đặt
rake release: công khai gem trên rubygems

IV. Mixi gem (https://github.com/dainghiavotinh/mixi)

Cấu trúc gem

.
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── mixi
│   │   ├── authentication.rb
│   │   ├── calendar.rb
│   │   ├── checkin.rb
│   │   ├── check.rb
│   │   ├── client.rb
│   │   ├── connection.rb
│   │   ├── diary.rb
│   │   ├── group.rb
│   │   ├── message.rb
│   │   ├── people.rb
│   │   ├── people_search.rb
│   │   ├── persistance.rb
│   │   ├── photo.rb
│   │   ├── profile_image.rb
│   │   ├── update.rb
│   │   ├── user.rb
│   │   ├── version.rb
│   │   └── voice.rb
│   └── mixi.rb
├── LICENSE
├── mixi.gemspec
├── pkg
│   ├── mixi-0.0.2.gem
│   └── mixi-1.0.0.gem
├── Rakefile
├── README.md
└── test
└── test_mixi.rb
4 directories, 28 files

Cài đặt

Khai báo trong Gemfile

gem 'mixi', git: "https://github.com/dainghiavotinh/mixi.git"

Sau đó chạy lệnh để cài đặt gem

bundle install

Cách sử dụng

  • Khởi tạo mixi:
mixi = Mixi::Client.new(CUSTOMER_KEY, CUSTOMER_SECRET, MIXI_TOKEN, MIXI_REFRESH_TOKEN)

Trong đó:

CUSTEMER_KEY : customer key
CUSTOMER_SECRET : customer secret
MIXI_TOKEN : mixi token (obtained by omiauth)
MIXI_REFRESH_TOKEN : mixi refresh token (obtained by omiauth)
  • Danh sách bạn bè
friends = mixi.friends
  • Cập nhật status có đính kèm ảnh
data = IO.binread("path to photo")
results = mixi.posting_with_photo("status", data)