On 2013-12-18 03:02:43 -0800, hugo fabre wrote:
> J'ai avancé sur mon jeu, mais aujourd'hui je suis confronté à une
> problèmatique. J'aimerais partagé mon jeu, sous windows, mac et linux.
[…]
> J'ai donc finis par builder moi même mon jeu en gem, mais dans l'état
> actuel des choses, l'utilisateur devra installer ruby, rubygem et bundle
> pour faire fonctionner le jeu, et un gem unpack pour le recupérer, puis un
> bundle pour installer les dépendances, donc autant faire une archive.
Je ne connais pas releasy ou rubypackager, mais dans le cas d'une
gem tu n'as pas besoin de faire installer bundler à tes utilisateurs,
juste pour les développeurs. L'utilisateur aura juste à faire `gem
install space`, la gem ne dépendant pas de bundler (préférable).
> Je voulais donc savoir si vous avez un moyen de build une application ruby
> qui utilise des gems sur toutes les plateformes. Ou si en le buildant comme
> une gem si il était possible via un gem install d'installer le jeu et ses
> dépendances et de n'avoir plus qu'à le lancer via une simple commande (sans
> alias genre '> space' plutôt que '> ruby ./path/to/my/bin'
Le cas des différentes plateformes sera surtout en fonction des
dépendances de ton jeu, mais en principe oui si rubygems marche sur
une plateforme tu pourras y distribuer ta gem de la même manière.
Pour l'exécution oui tout est prévu pour pouvoir utiliser de la
manière que tu souhaites, voir plus bas les choses possible pour aider
à coller aux conventions d'une gem.
Quelques commentaires rapides qui peuvent aider pour le
fonctionnement en tant que gem, et si ça se trouve aider également
pour les outils de distributions que tu as évoqué, mais que je ne
connais pas.
https://github.com/hfabre/space/blob/master/bin/start.rb
Ajoute un shebang au début :
#!/usr/bin/env ruby
pas besoin de require_relative, rubygems patch require (de souvenir)
pour pouvoir charger tout ce qui est dans le répertoire `lib' de ta
gem, même pas besoin de lister dans le gemspec. Du coup juste :
require 'space/window' # voir juste require 'space' avec un
# lib/space.rb (require multiples ou
# autoload)
Idéalement renommer `start.rb' en `space'.
https://github.com/hfabre/space/blob/master/space.gemspec
Je ne sais plus si c'est obligatoire mais peut aider :
s.executables = s.files.grep(/\Abin\//) { |f| File.basename(f) }
Lister tes dépendances (bundler peut lire le gemspec) :
s.add_dependency 'gosu'
s.add_development_dependency 'bundler' # perso je ne liste pas même
# quand j'utilise, pour ne
# pas l'imposer aux devs
s.add_development_dependency 'rake'
s.add_development_dependency 'releasy'
https://github.com/hfabre/space/blob/master/Gemfile
source '
https://rubygems.org'
gemspec
Devrait suffire, je vois que tu listes une version de ruby, ça doit
pouvoir se faire aussi dans le gemspec, voir la doc. En bonus, avec
Gemfile-custom.rb dans le .gitignore :
eval File.read('Gemfile-custom.rb') if File.exist?('Gemfile-custom.rb')
(Pour s'ajouter des gem perso pour le dev/test).
lib/space.rb
Pas obligatoire mais peut aider d'avoir un fichier unique qui
require tout dans la lib, utilise de l'autoload, ou toute autre
stratégie.
https://github.com/hfabre/space/blob/master/lib/space/window.rb
Avec remarque précédente, plus besoin de tout require ici, pas
besoin non plus de require_relative normalement, juste :
require 'space/player'
[…]
Ensuite supprimer tout require de 'rubygems' ou 'bundler/*',
partout. ruby, rubygems ou bundler le feront eux même comme il faut et
quand il faut, en tout cas pour une gem.
En dev on peut continuer à utiliser bundler, sans l'imposer à
l'utilisateur (penser à virer le Gemfile.lock du dépôt aussi +
ignore). rubygems installera toutes les dépendances pour
l'utilisateur.
Pour l'install, rubygems suivant comment il est configuré soit
copiera le script `space' soit fera son propre wrapper. L'utilisateur
n'aura plus qu'à exécuter la commande `space` qui sera dans son PATH
comme toutes les autres gems.
--
Thibault Jouan