Якщо ви вже давно хочете опублікувати гем, то беріться за мишку та клавіатуру, сьогодні ми й будемо це робити. Навіть якщо ваш код невеличкий за обсягом, але може бути корисний іншим — не вагайтесь, оформлюйте його в гем та публікуйте.
Сьогодні я розкажу як опублікувати свій перший гем на прикладі мого власного першого гему — final_redirect_url.
TL; DR;
Просто виконуйте команди з цієї статті в консолі.
Детальніше
Перш за все нам знадобиться:
-
Встановлений Ruby. Якщо його в вас ще немає, я дуже рекомендую встановлювати його за допомогою RVM.
-
Встановлений гем bundler
gem install bundler
- Назва для вашого гему. Я буду використовувати final_redirect_url для більшої наочності.
Крок перший: створення заготовки
Створити шаблон для гему можна за допомогою bundler:
$ bundle gem final_redirect_url
Ця команда зробить за вас багато брудної роботи. Зверніть увагу на структуру директорії з гемом та формату версій. Зауважте, що формат для версій суворо визначений і не потрібно придумувати щось своє.

Відповідно до Semantic Versioning, ось так повинні збільшуватися ваші числа в версії гему:
-
MAJOR коли ви робите несумісні з минулими версіями зміни в API.
-
MINOR коли ви додаєте нову функціональність, що не ламає старий код.
-
PATCH коли ви фіксите баги та не впливаєте на старий код.
Також вам потрібно додати такі дані як версія гему, його автор та опис у файл final_redirect_url.gemspec
.

Крок другий: напишіть сам код та тести
Бажана функціональність і визначає що вам потрібно робити на цьому етапі. Але я маю декілька порад як краще оформити ваш код:
-
Назвіть простір імен для ваших класів та модулів так само як і гем.
-
Надавайте публічний доступ лише до інтерфейсу. Внутрішні та системні методи повинні бути приватними.
-
Опишіть залежності вашого гему в файлі
Gemfile
. -
Додайте до 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':
Не забудьте замінити своє ім'я користувача в команді:
Тепер ви можете опублікувати свій гем за допомогою цієї команди:
$ 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'
Просто закоментуйте як вказано на зображенні в першому кроці.
Ще немає коментарів