Як створити власний Ruby gem

5 хв. читання

Якщо ви вже давно хочете опублікувати гем, то беріться за мишку та клавіатуру, сьогодні ми й будемо це робити. Навіть якщо ваш код невеличкий за обсягом, але може бути корисний іншим — не вагайтесь, оформлюйте його в гем та публікуйте.

Сьогодні я розкажу як опублікувати свій перший гем на прикладі мого власного першого гему — final_redirect_url.

TL; DR;

Просто виконуйте команди з цієї статті в консолі.

Детальніше

Перш за все нам знадобиться:

  • Встановлений Ruby. Якщо його в вас ще немає, я дуже рекомендую встановлювати його за допомогою RVM.

  • Встановлений гем bundler

gem install bundler
  • Назва для вашого гему. Я буду використовувати final_redirect_url для більшої наочності.

Крок перший: створення заготовки

Створити шаблон для гему можна за допомогою bundler:

$ bundle gem final_redirect_url

Ця команда зробить за вас багато брудної роботи. Зверніть увагу на структуру директорії з гемом та формату версій. Зауважте, що формат для версій суворо визначений і не потрібно придумувати щось своє.

Як створити власний Ruby gem

Відповідно до Semantic Versioning, ось так повинні збільшуватися ваші числа в версії гему:

  1. MAJOR коли ви робите несумісні з минулими версіями зміни в API.

  2. MINOR коли ви додаєте нову функціональність, що не ламає старий код.

  3. PATCH коли ви фіксите баги та не впливаєте на старий код.

Також вам потрібно додати такі дані як версія гему, його автор та опис у файл final_redirect_url.gemspec.

Як створити власний Ruby gem
Закоментуйте виділену ділянку якщо будете публікувати ваш гем на rubygems

Крок другий: напишіть сам код та тести

Бажана функціональність і визначає що вам потрібно робити на цьому етапі. Але я маю декілька порад як краще оформити ваш код:

  1. Назвіть простір імен для ваших класів та модулів так само як і гем.

  2. Надавайте публічний доступ лише до інтерфейсу. Внутрішні та системні методи повинні бути приватними.

  3. Опишіть залежності вашого гему в файлі Gemfile.

  4. Додайте до README інструкції по встановленню.

Ось кінцевий код мого модулю:

require 'final_redirect_url/version'
require 'net/http'
require 'logger'

module FinalRedirectUrl

  def self.final_redirect_url(url, options={})
    final_url = ''
    if is_valid_url?(url)
      begin
        redirect_lookup_depth = options[:depth].to_i > 0 ? options[:depth].to_i : 10
        response_uri = get_final_redirect_url(url, redirect_lookup_depth)
        final_url =  url_string_from_uri(response_uri)
      rescue Exception => ex
        logger = Logger.new(STDOUT)
        logger.error(ex.message)
      end
    end
    final_url
  end

  private
  def self.is_valid_url?(url)
    url.to_s =~ /\\A#{URI::regexp(['http', 'https'])}\\z/
  end

  def self.get_final_redirect_url(url, limit = 10)
    uri = URI.parse(url)
    response = ::Net::HTTP.get_response(uri)
    if response.class == Net::HTTPOK
      return uri
    else
      redirect_location = response['location']
      location_uri = URI.parse(redirect_location)
      if location_uri.host.nil?
        redirect_location = uri.scheme + '://' + uri.host + redirect_location
      end
      warn "redirected to #{redirect_location}"
      get_final_redirect_url(redirect_location, limit - 1)
    end
  end

  def self.url_string_from_uri(uri)
    url_str = "#{uri.scheme}://#{uri.host}#{uri.request_uri}"
    if uri.fragment
      url_str = url_str + "##{uri.fragment}"
    end
    url_str
  end
end

Крок третій: згенеруйте пакунок

Тепер, заповнивши файл .gemspec, ви можете створити пакунок, який можна встановлювати. Для цього виконайте наступну команду:

gem build final_redirect_url.gemspec

Встановити свій гем ви можете ось так:

gem install ./final_redirect_url-0.1.0.gem

Тепер ви можете протестувати свій гем в irb:

chandan@~/Workspace/Faodail/OpenSource ○ ➜ irb
2.4.0 :001 > require 'final_redirect_url'
 => true
 
2.4.0 :002 > FinalRedirectUrl.final_redirect_url('')
 => ""
 
2.4.0 :003 > FinalRedirectUrl.final_redirect_url('https://web.archive.org/web/20230327102249/http://google.com')
redirected to http://www.google.co.in/?gfe_rd=cr&ei=e-oPWaSoHaX98wfuqYuoCw
 => "http://www.google.co.in/?gfe_rd=cr&ei=e-oPWaSoHaX98wfuqYuoCw"
 
2.4.0 :004 > FinalRedirectUrl.final_redirect_url('https://web.archive.org/web/20230327102249/http://google.co.in')
redirected to http://www.google.co.in/
 => "http://www.google.co.in/"
 
2.4.0 :005 > FinalRedirectUrl.final_redirect_url('https://web.archive.org/web/20230327102249/https://google.co.in')
redirected to https://www.google.co.in/
 => "https://www.google.co.in/"
 
2.4.0 :006 > FinalRedirectUrl.final_redirect_url('https://web.archive.org/web/20230327102249/https://www.google.co.in')
 => "https://www.google.co.in/"

Крок четвертий: публікація

Ви можете розмістити свій гем як на власному сервісі, так і на rubygems. Якщо ви хочете зробити свій гем доступним публічно, опублікувати його на rubygems.org буде гарною ідеєю.

  • Ввійдіть в свій акаунт на rubygems

  • Завантажте авторизаційні дані:

chandan@ ○ ➜ curl -u indyarocks https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Enter host password for user 'indyarocks':

Не забудьте замінити своє ім'я користувача в команді:

Як створити власний Ruby gem

Тепер ви можете опублікувати свій гем за допомогою цієї команди:

$ gem push final_redirect_url-0.1.0.gem

Якщо ви отримуєте таку помилку, то значить ви не надали потрібної уваги файлу .gemspec на першому кроці.

ERROR: While executing gem … (URI::InvalidURIError)
bad URI(is not URI?): TODO: Set to 'http://mygemserver.com'

Просто закоментуйте як вказано на зображенні в першому кроці.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація