← Articoli

OCRAN: script Ruby come eseguibili per Windows, Linux e macOS

Mantengo OCRAN, una gem Ruby che impacchetta applicazioni Ruby per la distribuzione. Raccoglie lo script, l’interprete Ruby, le gem e le librerie native di cui hanno bisogno in un pacchetto autonomo, così le persone possono eseguire il vostro programma senza installare Ruby. Dalla versione 1.4 funziona su Windows, Linux e macOS.

OCRAN sta per “One-Click Ruby Application Next”. In questo articolo spiego da dove viene, come si usa e cosa è cambiato di recente.

Da OCRA a OCRAN

OCRAN è un fork di OCRA, il One-Click Ruby Application builder avviato da Lars Christensen nel 2009. Per molti anni OCRA è stato il modo abituale per trasformare uno script Ruby in un .exe per Windows. L’ultima release, la 1.3.11, è uscita a marzo 2020 e il suo changelog indica il supporto per Ruby dalla 2.2 alla 2.7.

Nel 2023 ne ho fatto un fork per mantenerlo funzionante con le versioni attuali di Ruby. La prima release di OCRAN, la 1.3.12, supportava Ruby fino alla 3.2. Non è stato un lavoro solitario: shinokaro figura come coautore nel gemspec e buona parte dei commit successivi al fork sono suoi. Anche Lars Christensen resta elencato tra gli autori, perché le fondamenta sono opera sua.

Se usate ancora OCRA, ho scritto una breve guida alla migrazione da OCRA a OCRAN. Le opzioni da riga di comando sono le stesse.

Cosa produce OCRAN

OCRAN offre quattro formati di output:

Su Windows potete anche creare un vero programma di installazione con Inno Setup (--innosetup).

Primi passi

OCRAN richiede Ruby 3.3 o successivo.

gem install ocran
ocran script.rb

Questo comando esegue script.rb, registra quali file e librerie carica e crea script.exe su Windows oppure script su Linux e macOS.

Gli altri formati di output:

ocran --output-dir myapp/ script.rb
ocran --output-zip myapp.zip script.rb
ocran --macosx-bundle --output MyApp --bundle-id com.example.myapp --icon icon.icns script.rb

Potete aggiungere file, cartelle o pattern glob supplementari e passare argomenti al vostro script dopo --:

ocran script.rb assets/**/*.png
ocran script.rb -- --some-option=value

ocran --help elenca tutte le opzioni.

Come funziona il rilevamento delle dipendenze

OCRAN non analizza il codice staticamente. Esegue lo script durante la build e include tutto ciò che viene caricato tramite require e load. Il codice caricato solo in determinate condizioni viene incluso soltanto se tali condizioni si verificano durante l’esecuzione di build.

Per i programmi che aprono una finestra o attendono un input, potete verificare la costante Ocran, definita solo mentre OCRAN sta creando il pacchetto:

app = MyApp.new
app.main_loop unless defined?(Ocran)

Se a runtime mancano file di una gem, provate prima --gem-all=gemname, poi --gem-full=gemname. Per i progetti Bundler, --gemfile Gemfile include tutte le gem elencate nel Gemfile.

Quando l’eseguibile autoestraente è in esecuzione, $0 punta alla directory temporanea, mentre la variabile d’ambiente OCRAN_EXECUTABLE contiene il percorso completo dell’eseguibile stesso. È utile per trovare i file distribuiti accanto a esso:

base_dir = File.dirname(ENV["OCRAN_EXECUTABLE"].to_s)

Cose da tenere presenti

Cosa è cambiato di recente

L’elenco completo si trova nel changelog.

Feedback

Se qualcosa non funziona, consultate prima le issue su GitHub e aprite una nuova issue se il vostro problema non è ancora presente. Le segnalazioni che indicano la versione di Ruby, il sistema operativo e il comando ocran esatto sono di grande aiuto.