Mono, des progrès totalement bluffants Par Sami Jaber (DotNetGuru.org)

Un an après notre dernier article sur le projet Mono, nous n'avons pas résisté à l'envie de faire un point avec vous sur l'avancée du projet et les horizons futurs. C'est pour nous également l'occasion  de vérifier si Mono est réellement en passe d'aboutir ou s'il est inexorablement condamné à végéter derrière les versions effrénées du géant de Redmond.  

epuis l'annonce du projet Mono, on avait vu pareil engouement et gesticulations autour d'un projet Open Source. Il y a maintenant un an, DotNetGuru testait ce qui était alors, une préversion de Mono, dépourvue il faut bien l'avouer, des fonctionnalités les plus élémentaires qu'on attend d'un outil de ce type. A l'époque nous n'avions pu tester l'accès aux données, les interfaces graphiques ou les pages ASP.NET. Le compilateur venait tout juste de voir le jour et la machine virtuelle péchait dans la finition. Pour preuve, même un hello world basique provoquait systématiquement un "core dumped" . 

Nous pouvons d'ores et déjà vous dire que cette époque est révolu. Les progrès de cette version nous ont totalement bluffé. Et si Mono 0.1 a évolué en quelques mois vers Mono 0.3, c'est bien des années lumière qui séparent aujourd'hui ces deux implémentations. Nous nous attentions à des progrès majeurs du fait de l'augmentation croissant du nombre de participants au projet, mais il faut avouer que là le résultat dépasse largement nos espérances. Mono 0.3 permet aujourd'hui de déployer sous Linux un site développé sous WebMatrix, Vous n'y croyez pas  ? Lisez la suite... 

Installation et configuration
L'installation de Mono est aujourd'hui à la portée n'importe quel geek (petit clin d'oeil sur copinedegeek.com). Nul besoin d'être un hacker fou ou un quelconque bidouilleur ténébreux pour arriver à installer l'outil. Un rapide téléchargement du package sur le site : http://www.go-mono.com/download.html et le tour est joué. Les versions 0.20 et 0.21 sont les dernières en date et ont constitué la base de nos tests.

Si votre plateforme est Linux, la démarche sera très simple du fait de la présence de nombreux fichiers RPM sur le site de Mono. Si en revanche vous êtes sous Windows, nous vous conseillons fortement d'installer l'outil cygwin permettant d'émuler l'ensemble des outils du Libre (gcc, make, ...) et de compiler efficacement le moteur XSP que vous verrons plus loin. 

Une fois le package installé, vous disposez après décompression du package d'un répertoire du type d:\mono-0.20. Il vous faudra ensuite veiller à positionner différentes variables d'environnement. Notamment le PATH qui doit pointer sur <mono>/bin et la variable LD_LIBRARY_PATH qui elle, doit pointer sur <mono>/lib.

Pour vérifier que l'installation et la configuration sont corrects, placez vous n'importe où dans l'arborescence de votre disque et tapez ">mcs" ou ">mono", vous devriez voir apparaître les messages d'aide des différents outils.

Voici ce que le répertoire /bin contient après l'installation.    

L'an dernier, seuls trois ou quatre outils avaient été implémentés. Aujourd'hui, plus de 30 outils différents constituent ce répertoire /bin. Inutile de vous dire que nous sommes déjà agréablement surpris ....

Les nouveautés 
Les nouveautés de cette version sont nombreuses. Premièrement, des langages tels que VB.NET font leur apparition avec le compilateur mbas (cf ci-dessous)

Ensuite, l'état de la migration des classes est sans aucune mesure avec Mono 0.1. Le Namespace System a été porté à 50%, avec System.Xml est à 70%, System.IO à 100%, System.Net à 90%, les Threads à 100%, les Web Services à 90% ... Quant aux API plus compliquées à migrer du fait de leur dépendances fortes avec Windows, elles ont également bénéficié des évolutions avec un Namespace System.Data porté à 90% (!). Sans même avoir testé une seule fonctionnalité, nous sommes déjà impressionné par l'ampleur des progrès réalisés dans la migration. 

Concernant les autres améliorations, nous pouvons citer pèle Melle le développement d'un débuggeur, la création d'un Framework graphique basé sur GTK#, l'intégration d'une dizaine de bases de données différentes à travers le Namespace System.Data, la prise en compte de MacOSX, etc. Voyons dans le détail chaque partie.

Windows Form
Gtk# 
Les WinForms ont constitué le point le plus délicat du projet Mono du fait de l'intégration forte entre GDI+ et Windows. Le projet a donc dû prendre une décision pour trouver un remplaçant aux WinForms de Microsoft. L'équipe de Ximian ayant déjà travaillé avec GTK, un rapide portage a été réalisé pour migrer les API GTK en C# avec pour nom GTK#.

A l'heure actuelle, l'état d'avancement du projet ne permet pas réellement de disposer d'éléments tangibles concernant l'ergonomie finale et les composants graphiques implémentés. Malgré tout, les copies d'écran suivantes sont prometteuses pour l'avenir.

Nul doute que la partie Windows Forms est la moins aboutie aujourd'hui.

ADO.NET  
De nouveaux fournisseurs ou providers

ADO.NET fait partie des évolutions les plus importantes. Pas moins de 10 nouveaux drivers ou providers ont fait leur apparition. De MySQL à Postgres en passant par Sql Server, DB2 et Oracle. Le plus gros du travail s'étant concentré sur le moteur TDS d'accès à SQL Server.   

La Provider Factory : ADO.NET enfin générique !
S'il y a bien un reproche qui est revient souvent à l'encontre du Framework ADO.NET, c'est bien l'approche propriétaire de ses API. Aujourd'hui, chaque provider dispose d'une implémentation spécifique qui entraîne une dépendance forte entre le code ADO.NET et la base de données sous-jacente. Sous avons déjà eu sur DotNetGuru l'occasion d'évoquer ce sujet en proposant une approche basée sur le Design Pattern Factory. Et bien c'est la démarche adoptée par Mono. Dorénavant, nul besoin d'importer les Namespace Data.SqlClient ou Data.Oracle, les API IdbConnection et IdbCommand se chargent de masquer les implémentations au client sur le modèle de JDBC en Java. Pour spécifier le provider utilisé, une simple entrée dans un fichier de configuration suffit.

ASP.NET
XSP
Il faut bien avouer que jamais nous n'aurions imaginé qu'un jour Mono réussirait à porter les API WebForms d'ASP.NET. Pour ceux qui connaissent un peu ce modèle de composant, il faut reconnaître que migrer de telles API relève du défi. Ce fût notre premier test, nous étions impatient de voir un résultat aussi minime soit-il concernant les WebForms de Mono.

Tout d'abord, il nous a été nécessaire de télécharger un package supplémentaire : http://www.go-mono.com/archive/xsp-0.3.tar.gz. XSP est le nom de code de l'implémentation ASP.NET de Mono. Une fois le package décompressé, il vous suffit de compiler les sources à l'aide du makefile fourni par défaut :   

Après avoir avec succès compilé le serveur XSP, la première tentative pour afficher une page s'est avérée infructueuse. En réalité, il convient de prendre plusieurs précautions avant de lancer le serveur. Tout d'abord, la présence du fichier machine.config est obligatoire. Malheureusement sa référence étant codé en dur dans un répertoire inexistant, il nous a fallu faire pointer la variable MONO_CFG_DIR vers un fichier préalablement créé ou copié à partir du Framework de Microsoft. Ensuite, le serveur a donné des signes de faiblesse lors de son lancement. Après quelques recherches sur les listes de diffusion, il s'est avéré que l'option GC_DONT_GC=1 était indispensable. Après plusieurs essais, nous sommes enfin parvenu à faire fonctionner le serveur XSP, voici le résultat :

Le serveur s'exécute par défaut sur le port 8080 et attend des requêtes clientes. A noter qu'une version en module Apache est également disponible à l'adresse suivante. Les développeurs du projet Mono ont pris soin de nous fournir plusieurs pages ASPX d'exemples dans le but de démontrer aux utilisateurs l'état d'avancement du projet. Voici le résultat de l'appel à http://localhost:8080/index.aspx

Bluffés ? on le serait à moins. Mais la suite à été encore plus emballant, tous les contrôles standards du Framework ASP.NET ont été migrés. Cela comprend les contrôles html mais également les contrôles web et les contrôles personnalisés. Surpris, nous n'en croyons pas nos yeux ébahis. Comment est-il possible de migrer un Framework aussi  complexe contenant des composants tels que des DataGrid, des DataRepeater ou Validateurs en aussi peu de temps ? 10 mois se sont écoulés et des pas de géant ont été accomplis par les développeurs de génie du projet Mono. 

Convaincus, nous décidons d'aller plus loin. Pourquoi ne pas mettre en place un atelier de développement basé sur WebMatrix comme IDE et Mono comme environnement de déploiement ? Le premier générant des pages ASPX dans le répertoire racine du second. Aussitôt dit aussitôt fait, après quelques tests, le succès de cette implémentation est incontestable. Toutes les pages conçues en mode WYSIWYG sous WebMatrix ont été affichées avec succès par le moteur XSP de Mono. Plus encore, la session HTTP est gérée, les différents modes d'authentification, les cookies ! in-croy-able ...

Seuls quelques bugs subsistent encore, le code behind à la Visual Studio n'est pas pris en compte, les custom contrôles pêchent dans leur finition et impossible de mettre à jour un composant lorsque le serveur est lancé, des violations de partages apparaissant de temps à autres. 

Concernant l'accès aux données dans les pages ASPX, rien de plus simple. nous vous juste ajouté une ligne dans le fichier web.config pour spécifier le type de provider utilisé, en l'occurrence MySQL et notre fameux DataGrid était aussitôt rempli de données.

Bref, Mono a changé, Mono a grandi et le bout du tunnel semble de plus en plus proche ... 

Un serveur d'application à la J2EE
Nous pensions avoir atteint des sommets en terme de richesse dans cette implémentation supposée "immature" et pourtant.... Brian Ritchie a entamé les développements d'un serveur d'application absolument bluffant en terme de fonctionnalité et d'ergonomie. L'outil permet de monter et de déployer à chaud des applications Remoting ou Web Services par l'intermédiaire d'une console d'administration en HTML. Mieux encore, dans le cas d'application non interactives le déploiement peut s'effectuer directement en FTP. A faire pallir les plus grands aficionados de composants EJB. jugez-en par vous même :

 

Conclusion
Que dire de plus sinon que les tests de Mono 0.20 ont été pour nous une vraie partie de plaisir. Si les progrès continuent dans ce sens, dans quelques mois vous serez surpris de découvrir le premières applications Linux basées sur Mono. Et qui sait, un jour viendra peut-être où certains développerons sous Visual Studio (ou Borland d'ailleurs) pour déployer sur des serveurs Linux.... 

 Ressources 

 Le site officiel de Mono : http://www.go-mono.org/
 Aperçu des contrôles de XSP : xsp.htm