← Articles

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 :

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

Ce qui a changé récemment

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.