Şu blog yazımın ardından Gem’leri incelemek, yapılarını öğrenmek ve yazmak üzerine biraz daha vakit ayırmak istedim ve LYK17’de Serdar Hoca‘dan Ruby’de Hash’leri dinlerken bir yandan da Gem yazmak için kolları sıvadım.
Tabiki bir Gem yazmadan önce incelediklerimden birine katkıda bulunmaya çalıştım. Sağ olsun Tolga Hoca GitHub’da açtığım pull request‘i kabul etti ve kısa bir süre içersinde rubygems‘teki paketi güncelleyeceğini belirtti.
Açıkçası Gem yazmak için aman aman orjinal bir fikir üretemedim ve sonuç olarak verdiğiniz stringin tahmini okunma süresini ‘1 hour 3 minutes‘, ‘6 minutes 18 seconds‘ vs. şekilde çeviren bir Gem yazdım. Benzerlerinin aksine süreyi saniye bazında ölçüyor ve human-readable formatta çıktı veriyor.
Yazdığım Ruby Gem’ine ulaşmak için: https://rubygems.org/gems/read_time
Bir Gem oluşturmak için her şeyden önce bundler aracına sahip olmanız gerekiyor.
1 |
$ gem install bundler |
Ve ardından Gem oluşturmak için:
1 |
$ bundle gem gem_ismi |
Böylelikle Gem’inizin yapısı oluşmuş oluyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ tree . ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── bin │ ├── console │ └── setup ├── blog-post.gemspec └── lib └── blog ├── post │ └── version.rb └── post.rb 4 directories, 9 files |
Dot files olduğu için gözükmese de bundle gem komutu projeyi bizim için git projesi olarak oluşturuyor.
Oluşturacağınız Gem için en önemli dosyalardan biri .gemspec. Bu dosya; isim, açıklama, yazar, lisans ve Gem’in bağımlılıkları gibi Gem’e ait üst veriyi tutar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# coding: utf-8 lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "blog/post/version" Gem::Specification.new do |spec| spec.name = "blog-post" spec.version = Blog-Post::VERSION spec.authors = ["Kaan Kölköy"] spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.} spec.description = %q{TODO: Write a longer description or delete this line.} spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' # to allow pushing to a single host or delete this section to allow pushing to any host. if spec.respond_to?(:metadata) spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'" else raise "RubyGems 2.0 or newer is required to protect against " \ "public gem pushes." end spec.files = `git ls-files -z`.split("\x0").reject do |f| f.match(%r{^(test|spec|features)/}) end spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] spec.add_development_dependency "bundler", "~> 1.15" spec.add_development_dependency "rake", "~> 10.0" end |
Projenizin sürüm bilgisi lib/blog-post/version.rb dosyasında bulunur.
1 2 3 |
module Blog-Post VERSION = "0.1.0" end |
Projeleriniz için semantik versiyonlama şiddetle önerilir!
Ve son olarak, projemizin temel Ruby dosyası lib/blog-post.rb‘dir.
1 2 3 4 5 |
require "blog-post/version" module Blog-Post # Your code goes here... end |
Maalesef daha ayrıntılı bir şekilde Gem yazmayı anlatamayacağım ancak yukarda bir yerlerde linkini verdiğim read_time projemi GitHub üzerinden indirebilir ve inceleyebilirsiniz. Sormak istediğiniz şeyler için lütfen e-posta atmaktan çekinmeyin.
Ruby Çok Güzel, Gelsene