пʼятниця, 3 серпня 2007 р.

Побудова власно пакету gem

Цією статтею я хочу розпочати невеликий цикл записів про створення і підтримку власного коду Ruby. В більшій мірі я це пишу для себе, як шпаргалку :). Можливо це комусь і стане у нагоді.

В цій статті я хочу поділитись досвідом побудови інсталяційного пакету gem для Ruby. Якщо Вам здається, що Ви маєте бібліотеку, яка, можливо, була б корисна для інших людей, Ви можете легко упакувати її як gem і розповсюджувати її через Інтернет (для Ruby існує спеціалізований сайт для сторонніх бібліотек - http://rubyforge.org/).
Процес перетворення Вашого коду у пакет gem складається з двох частин. Не хвилюйтесь, Вам не доведеться змінювати ваш код, щоб пристосувати його до gem. По-перше, Вам необхідно змінити(створити) структуру каталогів, яка б відповідала потребам gem. Далі для прикладу я буду використовувати свій власний проект під назвою uaenv - http://rubyforge.org/projects/uaenv/.
Структура каталогу організована, як вказано нижче:
  • /uaenv/lib : цей каталог містить весь код Ruby, який має безпосереднє відношення до проекту.
  • /uaenv/pkg : каталог, у який власне і буде згенерований gem.
  • /uaenv/tests : каталог, у якому буде знаходитись код для тестів.
  • /uaenv/README : цей файл повинен містити опис проекту, ліцензію, і взагалі будь-яку інформацію за бажанням.

Це мінімум для того щоб створити gem.
Складніші проекти можуть містити наступні директорії:
  • /uaenv/bin : каталог для будь-яких виконуваних скриптів, які є частиною проекту.
  • /uaenv/doc : додаткова документація по проекту.

Це буде корисним, якщо існує необхідність додати нові інструменти командного рядка при встановленні в систему.
RubyGems підтримує зберігання не тільки джерельних кодів Ruby. Коли користувач встановлює пакет gem на комп'ютері, gem намагається скомпілювати додатковий код як частину установки. Перевагою використання gem таким чином є, те що не-Ruby код буде пов'язаний з фактичними бібліотеками, які встановленні на комп'ютері. Наприклад, це трапляється коли Ви встановлюєте RMagick. Якщо інсталятор не знайшов належних бібліотек(ImageMagick), він потерпить невдачу. Крім того до пакету можна додати заздалегідь скомпільовані файли, щоб уникнути проблеми неможливості компілювати код на комп'ютері призначення.
Як тільки Ви влаштували свій код у коректну структуру каталогів, Ви можете зосередитись на іншій частині процесу побудови gem - специфікації gem. Це декларація, яка надає всю необхідну інформацію щоб побудувати gem. Ви можете створити специфікацію gem, як автономний файл, але простіше якщо Ви будете використовувати стандартні засоби, створите Rakefile. Це значно спростить процес побудови.
Нижче наведений приклад файлу Rakefile, який повинен міститись у кореневому каталозі проекту uaenv.
require 'rubygems'
Gem::manage_gems
require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "uaenv"
s.version = "0.0.3"
s.author = "Anton Maminov"
s.email = "anton.linux @nospam@ google.com"
s.homepage = "http://rubyforge.org/projects/uaenv"
s.rubyforge_project = "uaenv"
s.summary = "Simple processing of Ukrainian strings"
s.files = FileList['lib/**/*.rb','test/*'].to_a
s.require_path = "lib"
s.autorequire = "uaenv"
s.test_files = Dir.glob('tests/*.rb')
s.has_rdoc = true
s.extra_rdoc_files = ["README"]
end

Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_zip = true
end

task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
puts "generated latest version"

Це хороший приклад стандартного Rakefile для gem. Тут Ви можете бачити, що він включає RubyGems і додає деякі завдання для rake. Головна специфікація забезпечує всю інформацію про gem. Останнє завдання подає простого помічника який дозволяє запустити rake у каталозі і автоматично побудувати пакет gem і файл zip. Кожна лінія специфікації має спеціальне призначення. За більш детальнішою інформацією зверніться на офіційний сайт Rubygems - http://docs.rubygems.org/.

Немає коментарів: