18 avril 2011

Ecosystème Rails: Bundler + GitHub = maîtrise de vos dépendances externes

La communauté Rails est très active et créative: elle innove constamment et tout un écosystème d'outils en résulte. Cet écosystème m'aide énormément dans mon travail, mais il peut vous aider vous aussi, même si vous n'utilisez pas Rails.

C'est pourquoi je voudrais présenter ces outils dans une série de posts. Je commence aujourd'hui avec Bundler et GitHub, une combinaison extraordinaire pour maîtriser vos dépendances externes.

Bundler

Bundler est un gestionnaire de "gems" (les librairies externes de Ruby, l'équivalent des eggs en Python, des jars en Java, etc.).

Dans un projet qui utilise Bundler, il suffit de spécifier dans un fichier "Gemfile" la liste des gems que l'on veut utiliser:

gem "pg"
gem 'will_paginate'
gem "transaction-simple"
gem "color"

Ensuite, il suffit de demander à Bundler d'installer les dépendances ("bundle install") et toutes les gems sont installées.

Si une des gems installées dépend d'autres gems, celles-ci seront également automatiquement installées par Bundler.

De plus, Bundler permet de gérer différents environnements (par exemple: test, développement, production) et d'appliquer ces environnements à différents types de serveurs (serveur de test, serveur d'intégration, serveur de production, ...).

GitHub

GitHub est un serveur Git, avec des services construits autour.

GitHub a la particularité d'être gratuit pour les projets open-source. Ce site est très populaire dans la communauté Ruby (ce qui est normal, puisque les créateurs sont des Rubyistes connus) et pratiquement toutes les "gems" de Ruby ont leur code en open-source sur GitHub.

Parmi les services apportés par GitHb, deux vont nous intéresser plus particulièrement dans ce post: fork et pull request.

Maîtrise de vos dépendances externes


L'avantage de l'open-source, c'est que si vous trouvez un bug dans une "gem", ou que vous voulez étendre la fonctionnalité d'une "gem", vous pouvez plonger directement dans le code source et le modifier par vous-même.

GitHub pousse les choses plus loin: une fois que vous avez un compte sur GitHub, il vous suffit de trouver le projet que vous voulez modifier et d'appuyer sur le bouton "Fork" pour créer, sous votre compte, un nouveau clone de la librairie:


Vous pouvez maintenant effectuer vos modifications sur votre copie de la libraire externe.


Bundler intègre cette nouvelle version de la "gem", avec un simple lien vers votre version GitHub:

gem "pg"
gem 'will_paginate', :git => "git@github.com:cbonnet99/will_paginate.git"
gem "transaction-simple"
gem "color"

Boucler la boucle: pull request


A présent, dans l'esprit open-source, si vous avez fixé un bug (avec un test, bien sûr!), vous devez proposer un patch à l'auteur de la "gem". Là encore, GitHub vous mâche le travail avec "pull request".

Lorsque votre patch est prêt, il vous suffit d'appuyer sur le bouton "Pull request" et l'auteur de la librairie originale sera notifié de votre changement:




Il ou elle pourra alors l'intégrer dans le code source avec un simple "merge" et un "commit".

Conclusion


La puissance de Bundler combiné à GitHub rendent simple un problème complexe: la gestion des dépendances externes d'un projet.
De surcroît, ces outils donnent tout son sens au concept d'open-source et permettent à tout un chacun de contribuer aux projets open-source avec un investissement de temps minimal.

16 avril 2011

Create a remote branch in Git and track it

Create a remote branch:

git push origin origin:refs/heads/new_feature_name

Make sure everything is up to date:

git fetch origin

Start tracking the branch:

git checkout --track -b new_feature_name origin/new_feature_name