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:
- Eseguibile autoestraente (predefinito): un
.exesu Windows e un eseguibile nativo su Linux e macOS. Si decomprime in una directory temporanea e viene eseguito da lì. - Cartella (
--output-dir): tutti i file in una cartella, più uno script di avvio (.shsu Linux/macOS,.batsu Windows). - Archivio zip (
--output-zip): lo stesso contenuto della cartella, compresso in un.zip. - App bundle macOS (
--macosx-bundle): un bundle.appper Finder, il Dock e la firma del codice.
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
- Nessuna cross-compilazione. OCRAN impacchetta il Ruby della macchina su cui gira, quindi gli eseguibili Windows si creano su Windows, i binari Linux su Linux e quelli macOS su macOS. Il README contiene un workflow GitHub Actions che li crea tutti e tre.
- glibc su Linux. OCRAN include librerie condivise come libyaml o libssl, ma glibc proviene sempre dal sistema di destinazione. Create la build sulla distribuzione più vecchia che volete supportare.
- Architettura della CPU. L’output corrisponde al Ruby con cui fate la build. Un Ruby ARM64 su Apple Silicon produce un eseguibile ARM64 che non gira sui Mac Intel.
- Tempo di avvio. L’eseguibile autoestraente si decomprime a ogni avvio. Se è troppo lento, usate
--output-dir,--output-zipo un programma di installazione Inno Setup.
Cosa è cambiato di recente
- 1.3.17 (maggio 2025): nomi di file e cartelle multibyte (UTF-8) su Windows 10 1903 e successivi.
- 1.3.18 (marzo 2026): supporto per Ruby 4.0, firma del codice Authenticode su Windows e Ruby 3.2 come versione minima.
- 1.4.0 (marzo 2026): supporto per Linux e macOS, più
--output-dir,--output-zipe--macosx-bundle. Ora esistono gem specifiche per piattaforma, quindigem install ocransceglie automaticamente lo stub precompilato giusto. La CI testa Ruby 3.2, 3.3, 3.4 e 4.0 su Linux, macOS (ARM e Intel) e Windows. - 1.4.4 (agosto 2026): su Linux le librerie condivise rilevate vengono incluse, così gli eseguibili girano anche su distribuzioni in cui mancano. Funziona anche il Ruby pacchettizzato dalle distribuzioni, ad esempio su Fedora. Torna l’eseguibile wrapper in stile OCRA per i programmi di installazione Inno Setup.
- 1.4.5 (agosto 2026): la nuova opzione
--chdir-exe-dirimposta come directory di lavoro la cartella che contiene l’eseguibile. C’è inoltre un’opzione sperimentale--cosmo-ruby, che impacchetta una build cosmopolitan di Ruby in un unico file eseguibile su Linux, macOS e Windows. È ancora sperimentale, quindi leggete il README prima di farci affidamento.
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.
- Codice sorgente: github.com/largo/ocran
- Gem: rubygems.org/gems/ocran