OCRAN : transformer des scripts Ruby en exécutables pour Windows, Linux et macOS
Je maintiens OCRAN, un gem Ruby qui empaquette des applications Ruby pour leur distribution. Il regroupe votre script, l’interpréteur Ruby, vos gems et les bibliothèques natives dont ils ont besoin dans un artefact autonome, de sorte que les gens peuvent lancer votre programme sans installer Ruby. Depuis la version 1.4, il fonctionne sous Windows, Linux et macOS.
OCRAN signifie « One-Click Ruby Application Next ». Dans cet article, j’explique d’où il vient, comment l’utiliser et ce qui a changé récemment.
D’OCRA à OCRAN
OCRAN est un fork d’OCRA, le One-Click Ruby Application builder lancé par Lars Christensen en 2009. Pendant de nombreuses années, OCRA a été le moyen habituel de transformer un script Ruby en .exe Windows. Sa dernière version, la 1.3.11, est sortie en mars 2020, et son changelog indique la prise en charge de Ruby 2.2 à 2.7.
En 2023, je l’ai forké pour qu’il continue de fonctionner avec les versions actuelles de Ruby. La première version d’OCRAN, la 1.3.12, prenait en charge Ruby jusqu’à 3.2. Ce n’est pas le travail d’une seule personne : shinokaro figure comme co-auteur dans le gemspec, et une grande partie des commits depuis le fork sont les siens. Lars Christensen reste lui aussi listé comme auteur, car les fondations sont son travail.
Si vous utilisez encore OCRA, j’ai écrit un court guide de migration d’OCRA vers OCRAN. Les options de ligne de commande sont les mêmes.
Ce que produit OCRAN
OCRAN propose quatre formats de sortie :
- Exécutable auto-extractible (par défaut) : un
.exesous Windows et un exécutable natif sous Linux et macOS. Il se décompresse dans un répertoire temporaire et s’exécute depuis celui-ci. - Répertoire (
--output-dir) : tous les fichiers dans un dossier, plus un script de lancement (.shsous Linux/macOS,.batsous Windows). - Archive zip (
--output-zip) : la même chose que la sortie en répertoire, emballée dans un.zip. - Bundle d’application macOS (
--macosx-bundle) : un bundle.apppour le Finder, le Dock et la signature de code.
Sous Windows, vous pouvez aussi créer un véritable installateur avec Inno Setup (--innosetup).
Premiers pas
OCRAN nécessite Ruby 3.3 ou plus récent.
gem install ocran
ocran script.rb
Cette commande exécute script.rb, enregistre les fichiers et bibliothèques qu’il charge, et construit script.exe sous Windows ou script sous Linux et macOS.
Les autres formats de sortie :
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
Vous pouvez ajouter des fichiers, des répertoires ou des motifs glob supplémentaires, et passer des arguments à votre script après -- :
ocran script.rb assets/**/*.png
ocran script.rb -- --some-option=value
ocran --help liste toutes les options.
Comment fonctionne la détection des dépendances
OCRAN n’analyse pas votre code de manière statique. Il exécute votre script pendant le build et inclut tout ce qui est chargé via require et load. Le code qui n’est chargé que sous certaines conditions n’est inclus que si ces conditions sont remplies pendant l’exécution du build.
Pour les programmes qui ouvrent une fenêtre ou attendent une saisie, vous pouvez tester la constante Ocran. Elle n’est définie que pendant le build d’OCRAN :
app = MyApp.new
app.main_loop unless defined?(Ocran)
S’il manque des fichiers d’un gem à l’exécution, essayez d’abord --gem-all=gemname, puis --gem-full=gemname. Pour les projets Bundler, --gemfile Gemfile inclut tous les gems listés dans le Gemfile.
Quand l’exécutable auto-extractible tourne, $0 pointe vers le répertoire temporaire, et la variable d’environnement OCRAN_EXECUTABLE contient le chemin complet de l’exécutable lui-même. C’est utile pour retrouver les fichiers que vous livrez à côté :
base_dir = File.dirname(ENV["OCRAN_EXECUTABLE"].to_s)
Points à garder en tête
- Pas de compilation croisée. OCRAN embarque le Ruby de la machine sur laquelle il tourne : vous construisez donc les exécutables Windows sous Windows, les binaires Linux sous Linux et les binaires macOS sous macOS. Le README contient un workflow GitHub Actions qui construit les trois.
- glibc sous Linux. OCRAN embarque des bibliothèques partagées comme libyaml ou libssl, mais la glibc vient toujours du système cible. Construisez sur la distribution la plus ancienne que vous voulez prendre en charge.
- Architecture du processeur. La sortie correspond au Ruby avec lequel vous construisez. Un Ruby ARM64 sur Apple Silicon produit un exécutable ARM64 qui ne tourne pas sur les Mac Intel.
- Temps de démarrage. L’exécutable auto-extractible se décompresse à chaque lancement. Si c’est trop lent, utilisez
--output-dir,--output-zipou un installateur Inno Setup.
Ce qui a changé récemment
- 1.3.17 (mai 2025) : noms de fichiers et de répertoires multioctets (UTF-8) sous Windows 10 1903 et plus récent.
- 1.3.18 (mars 2026) : prise en charge de Ruby 4.0, signature de code Windows Authenticode, et Ruby 3.2 comme version minimale.
- 1.4.0 (mars 2026) : prise en charge de Linux et macOS, plus
--output-dir,--output-zipet--macosx-bundle. Il existe désormais des gems spécifiques à chaque plateforme, de sorte quegem install ocranchoisit automatiquement le bon stub précompilé. La CI teste Ruby 3.2, 3.3, 3.4 et 4.0 sous Linux, macOS (ARM et Intel) et Windows. - 1.4.4 (août 2026) : sous Linux, les bibliothèques partagées détectées sont embarquées, si bien que les exécutables tournent aussi sur les distributions où elles manquent. Le Ruby empaqueté par les distributions, par exemple sur Fedora, fonctionne également. L’exécutable wrapper de style OCRA pour les installateurs Inno Setup est de retour.
- 1.4.5 (août 2026) : la nouvelle option
--chdir-exe-dirdéfinit comme répertoire de travail le dossier qui contient l’exécutable. Il y a aussi une option expérimentale--cosmo-ruby, qui empaquette un build Ruby cosmopolitan dans un seul fichier tournant sous Linux, macOS et Windows. Elle est encore expérimentale : lisez donc le README avant de vous y fier.
La liste complète se trouve dans le changelog.
Retours
Si quelque chose ne fonctionne pas, consultez d’abord les issues sur GitHub et ouvrez-en une nouvelle si votre problème n’y figure pas encore. Les rapports qui indiquent la version de Ruby, le système d’exploitation et la commande ocran exacte aident beaucoup.
- Code source : github.com/largo/ocran
- Gem : rubygems.org/gems/ocran