Úvod
V jistých situacích se může hodit celý náš program distribuovat jako jeden spustitelný soubor. V Ruby to není problém, existuje sada tří navzájem podobných utilitek, které pokryjí převážnou většinu našich potřeb ohledně distribuce naší aplikace v jediném souboru.
Co se týče podporovaných platforem, na Linuxu problém mít nebudete, podporována jsou i okénka a Mac OS X.
Instalace
Na instalaci není nic složitého, všechny tři utilitky je možné nainstalovat přes balíčkovací systém RubyGems:
sudo gem install allinoneruby rubyscript2exe tar2rubyscript
Tar2RubyScript
Tato utilitka je určena těm, kteří Ruby již nainstalováno mají – jeho výstupem je totiž jediný skript v Ruby. Vzdáleně tak připomíná javovské JAR archivy. Použití je jednoduché, stačí zabalit soubory či složku s aplikací do archivu tar a ten posléze nechat zpracovat příkazem tar2rubyscript.
# vytvoříme tar archiv ze složky script, # která obsahuje naši aplikaci: tar cf script.tar script/ # archiv zpracujeme zpět na (jediný) skript v Ruby: tar2rubyscript script.tar
init.rb
Soubor init.rb je oním spouštícím skriptem, který bude v cílovém skriptu volán. Musí být buď jedním ze souborů umístěných v archivu nebo musí být umístěn v kořenovém adresáři programu.
Protože skript obsahuje zakódovaný archiv, který jsme zadali utilitce tar2rubyscript jako parametr a protože tento archiv bude po spuštění souboru rozbalen do složky s dočasnými soubory, mohou vzniknout problémy s cestou. Stane se tak za předpokladu, že používáte relativní cesty vedoucí mimo kořenový adresář programu, jinými slovy knihovnu z podsložky lib/ můžete volat bez problémů, ale soubor umístěný v nadřazené složce už ne, resp. ne klasickým způsobem. Řešení skýtá escapování pomocí metody oldlocation:
input = oldlocation(ARGV[0])
Metodě oldlocation lze předat i blok kódu:
oldlocation do
Dir.new(".").each {|file| kód ... }
end
A konečně je také možno se do staré složky přesunout:
Dir.chdir(oldlocation)
V tom případě je ale zas nutno escapovat soubory v nové lokaci a to pomocí newlocation, které funguje obdobným způsobem jako oldlocation.
Osobně mám dojem, že některé drobnosti by to chtělo ještě vyladit a protože systémem Rake se bude zabývat následující díl, aspoň vás trochu navnadím:
require "fileutils"
directory = Dir.pwd
task :default do
Dir.chdir("..")
sh("tar cf output.tar '#{File.basename(directory)}'")
sh("tar2rubyscript output.tar")
File.open("output.rb", "r") do |output|
File.open("script.rb", "w") do |script|
script.puts("#!/usr/bin/env ruby")
script.puts(output.read)
end
end
FileUtils.chmod(0755, "script.rb")
FileUtils.remove(%w(output.tar output.rb), :force => true)
FileUtils.move("script.rb", "hello/")
end
Tento kód uložte do souboru s názvem Rakefile v hlavní složce projektu a pak už pouze jednoduše zavolejte příkaz rake, výsledný soubor s názvem script.rb naleznete v aktuální složce a o víc se již starat nemusíte.
Parametry archivu
Našemu právě vzniklému archivu je možno pochopitelně předávat parametry, které budou klasicky dostupné v proměnné ARGV. Tři specifické parametry jsou však vyhrazeny k manipulaci se archivem:
| Parametr | Význam |
|---|---|
| --tar2rubyscript-list | Vypíše obsažené soubory a složky. |
| --tar2rubyscript-justextract | Extrahuje obsah skriptu, nespustí jej. |
| --tar2rubyscript-totar | Převede skript zpět na tar archiv. |
Výpis souborů:
hello $ ./script.rb --tar2rubyscript-list d hello/ f hello/._.DS_Store (82) f hello/.DS_Store (6148) d hello/conf/ f hello/._init.rb (177) f hello/init.rb (56) f hello/._Rakefile (177) f hello/Rakefile (487)
RubyScript2Exe
Tato utilitka vezme váš kód, interpret Ruby a veškeré knihovny, které potřebuje váš program k běhu a z toho všeho vytvoří jediný komprimovaný spustitelný soubor. Použití je prosté:
rubyscript2exe [aplikace] [parametry]
| Parametr | Význam |
|---|---|
| --rubyscript2exe-rubyw | Použije binárku rubyw místo ruby, takže nebude vyskakovat okno s cmd. Pochopitelně pouze na Windows, jinde se nijak neprojeví. |
| --rubyscript2exe-ruby | Defaultní volba, okénko s cmd se objeví při spuštění programu. |
| --rubyscript2exe-nostrip | Nebude použito stripování. |
| --rubyscript2exe-verbose | „Výřečný” mód. |
| --rubyscript2exe-quiet | Tichý mód. |
Tím bychom měli naši aplikaci zabalenou. To ale není všechno, speciální parametry lze předávat i jí samé:
| Parametr | Význam |
|---|---|
| --eee-list | Vylistuje obsah spustitelného souboru. |
| --eee-info | Vypíše informace o programu. |
| --eee-justextract | Extrahuje vnitřek spustitelného souboru. |
AllInOneRuby
Prográmek AllInOneRuby není sice určen pro distribuci skriptů, ale s výše zmíněnými velmi úzce souvisí – jedná se pro změnu o utilitku, která je schopna vytvořit binárku Ruby, která již bude obsahovat všechny potřebné knihovny. Dovedu si docela dobře představit, že lidé, pro které život bez Ruby je jen ošklivou sérií nepříjemných a ještě nepříjemnějších dnů, mají svého miláčka vždy u sebe na USB pro všechny běžnější platformy a když je jim smutno, Ruby je vždy nablízku.
Funguje to jednoduše, stačí zavolat příkaz allinoneruby na cílové platformě a počkat, až se vytvoří spustitelný soubor.