Tutorial - Votre premier projet .NET Core 1.1.1 sous Windows

L'année dernière, j'avais écrit un article dans ce blog pour partager avec vous mes premiers pas avec le framework .NET Core sous Ubuntu. Depuis, j'avoue que j'avais un peu abandonné mes expérimentations pour me lancer dans l'apprentissage du langage Go et de Node.js.

Pendant ce temps, .NET Core a poursuivi son évolution grâce à la communauté Open Source. Avec la sortie de la version 1.1.1, j'ai décidé de me replonger dedans et je dois dire que j'ai été agréablement surpris.
Bien entendu, Visual Studio (désormais disponible en version 2017) reste l'environnement de choix pour développer en .NET.
Cependant, dans cet article, j'ai choisi d'utiliser le SDK en ligne de commande, d'une part parce que je peux ainsi travailler sous n'importe quel OS et d'autre part, parce que l'installation est ridiculement rapide et permet de se créer un environnement de test sans polluer son poste de travail ni devoir installer de machine virtuelle.

.NET Core est d'ailleurs désormais disponible sur Raspberry Pi et Samsung a annoncé une première collaboration avec Microsoft pour intégrer le framework dans son OS Tizen. Il se positionne donc comme un bon candidat pour le développement d'objets connectés et de micro-services.

Place donc aux tests!



.NET Core, pour quoi faire?

Premier point important: Microsoft et l'Open Source, ce n'est pas qu'une histoire de marketing. De nombreux outils Open Source sont devenus aujourd'hui des standards de l'industrie web; les ignorer aurait été une grosse erreur de stratégie de la part de Microsoft.

Second point important: en plus de sa portabilité et de sa grande modularité, le framework .NET Core a visiblement été conçu pour inciter les développeurs a adopter de bonnes pratiques de programmation. Vous rencontrerez par exemple de l'injection de dépendances à presque tous les niveaux ;)

L'approche "code-first" pour la conception des base de données, la gestion des fichiers de configuration multiples sur base de variables d'environnements, les tests unitaires, les migrations de schémas relationnels avec EF Core... on ressent dans chaque service et classe du framework une grande maturité, fruit de nombreuses années d'expérience.

En conclusion, si vous cherchez un outil RAD pour développer vos applications Web, passez votre chemin! Mais si vous êtes familiarisé avec d'autres framework Open Source, .NET Core devrait vous plaire.

D'autant plus que le chaos initial des différents outils (DNX, DNU, DNVM - voir mon premier article) a été remplacé par un seul et même outil: dotnet.exe. Un peu la même philosophie que GoLang.


Installer .NET Core 1.1.1

Allez sur le site https://www.microsoft.com/net/core et choisissez le SDK en command-line pour l'OS de votre choix. Dans mon cas, j'ai sélectionné  la version Windows 64 bits (dotnet-1.1.1-sdk-win-x64.exe).

Il y a quelques semaines, je vous aurais conseillé de télécharger et d'installer les versions 1.0 et 1.1 en parallèle, certaines librairies étant partagées dans les templates de projet proposés.

Ce n'est plus le cas aujourd'hui; la version 1.1.1 inclut désormais les deux versions du framework.



Une fois l'installation terminée, ouvrez une console et tapez la commande suivante pour tester la version de l'outil dotnet.exe installée:

dotnet --version
1.0.1


Installer Node.js, NPM, Bower et Gulp

Comme expliqué précédemment, Microsoft a inclut dans .NET core de nombreux outils Open Source.

La plupart d'entre-eux ayant été développés sous Node.js (Bower, Gulp...), l'installation de ce dernier est obligatoire.

Pour rappel, Node.js est disponible en téléchargement à cette adresse:

https://nodejs.org

Je recommande également d'installer Git pour Windows, car le gestionnaire de package Bower l'utilise pour récupérer certaines librairies.

https://git-for-windows.github.io/


Il faut ensuite installer globalement NPM, le gestionnaire de package de Node.js:

npm install -g npm


NPM étant installé, il est maintenant possible d'installer globalement Bower et Gulp. Ce dernier est utilisé pour automatiser des tâches de pré-publication, comme la minification et le packaging des CSS et du Javascript.

npm install -g bower
npm install -g gulp


Créer un projet MVC avec .NET Core 1.1.1

Sur ma machine, j'ai déjà un dossier c:\Projects\NetCore. Je vais maintenant créer un sous-répertoire pour mon projet, sobrement baptisé mvc:

c:
cd \
cd Projects
cd NetCore
md mvc
cd mvc


Pour créer une nouvelle solution de type Web/MVC, il suffit de taper:

dotnet new mvc

(dans la version 1.0, la commande était dotnet new --type Web)


Voici la liste des templates disponibles (Plus besoin de Yeoman) :

  • Class library: classlib
  • Unit Test Project: mstest
  • xUnit Test Project: xunit
  • ASP.NET Core Empty: web
  • ASP.NET Core Web App: mvc
  • ASP.NET Core Web API: webapi
  • Solution File: sln



Notre projet fait référence à de nombreuses librairies du Framework. Pour rappel, .NET Core permet de déployer chaque projet avec sa propre version du Framework, en n'utilisant que les librairies requises. Toutes ces informations sont stockées dans le fichier project.json.

En ce qui concerne les librairies Javascript, c'est Bower qui se chargera de les rapatrier, selon les instructions du fichier bower.json situé à la racine du projet.


Pour récupérer toutes les dépendances d'un projet, il suffit de taper:

dotnet restore

log  : Restoring packages for C:\Projects\NetCore\mvc\project.json...
warn : Dependency specified was Microsoft.NETCore.App (>= 1.1.0-preview1-001153-00) but ended up with Microsoft.NETCore.App 1.1.0.
log  : Restoring packages for tool 'Microsoft.AspNetCore.Razor.Tools' in C:\Projects\NetCore\mvc\project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Server.IISIntegration.Tools' in C:\Projects\NetCore\mvc\project.json...
log  : Restoring packages for tool 'Microsoft.EntityFrameworkCore.Tools' in C:\Projects\NetCore\mvc\project.json...
log  : Restoring packages for tool 'Microsoft.Extensions.SecretManager.Tools' in C:\Projects\NetCore\mvc\project.json...
log  : Restoring packages for tool 'Microsoft.VisualStudio.Web.CodeGeneration.Tools' in C:\Projects\NetCore\mvc\project.json...
log  : Writing lock file to disk. Path: C:\Projects\NetCore\mvc\project.lock.json
log  : C:\Projects\NetCore\mvc\project.json
log  : Restore completed in 42901ms.


Enfin, il ne nous reste plus qu'à compiler notre projet. Cette commande invoque l'outil MSBuild, lui aussi utilisé dans Visual Studio.

dotnet build

Project mvc (.NETCoreApp,Version=v1.1) will be compiled because expected outputs are missing
Compiling mvc for .NETCoreApp,Version=v1.1
C:\Projects\NetCore\mvc\project.json(5,30): warning NU1007: Dependency specified was Microsoft.NETCore.App >= 1.1.0-preview1-001
153-00 but ended up with Microsoft.NETCore.App 1.1.0.

Compilation succeeded.
    1 Warning(s)
    0 Error(s)

Time elapsed 00:00:05.9586870


Au moment ou j'écris cet article, le template MVC proposé par .NET Core 1.1.1 n'inclut plus de base de données SQLite par défaut.

Cette base de données portable était utilisée dans la version Preview 1.1 pour stocker les droits et les rôles des utilisateurs du site. J'ignore si ce choix est définitif ou non. Peut-être de nouveaux templates de projets feront leur apparition dans peu de temps.

Je le répète, la manière la plus conviviale de développer en .NET Core est d'utiliser Visual Studio. Mais comme je l'ai expliqué plus haut, j'ai volontairement choisi de travailler avec le SDK seul.
Je trouve personnellement que cette façon de procéder permet de mieux comprendre ce qui se passe lorsqu'on appuie sur la touche [F5] :)

En tous cas, si votre projet utilise Entity Framework Core, il est possible de créer la base de données à partir de son modèle objet, à l'aide des Migrations.

Pour cela, taper la commande suivante:

dotnet ef database update

Project mvc (.NETCoreApp,Version=v1.1) was previously compiled. Skipping compilation.
Done.


Dans le cas de SQLite, un fichier .db sera créé dans le répertoire bin/Debug du projet.

Si vous cherchez un outil pour consulter et éditer cette DB locale, vous pouvez installer l'extension SQLite Manager pour Firefox.



Il est temps maintenant de lancer notre application. A ce stade, le seul problème rencontré était l'utilisation du port 5000 utilisé par défaut par le serveur web Kestrel, déjà utilisé sur un de mes postes de travail.


dotnet run

Project mvc (.NETCoreApp,Version=v1.1) was previously compiled. Skipping compilation.
info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
User profile is available. Using 'C:\Users\fk\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
Hosting environment: Development
Content root path: C:\Projects\NetCore\mvc
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.


Comme indiqué dans le message ci-dessus, notre application web est maintenant démarrée et écoute sur le port 5000.

Ouvrez votre navigateur et surfez sur l'adresse ci-dessous pour y accéder:

http://localhost:5000




Héberger une application .NET Core sous IIS

Pour héberger une application .NET Core sous IIS (version 7 minimum), il faut installer ASP.NET Core Server Hosting Bundle, disponible en téléchargement ici: https://go.microsoft.com/fwlink/?linkid=837808

Ce module crée un reverse-proxy entre IIS et Kestrel. Une fois installé, pensez à redémarrer IIS afin qu'il puisse accéder aux variables d'environnement.

Nous allons pour finir créer une version déployable de notre application web, dans un répertoire temporaire.

dotnet publish --output "c:\temp\mvc" --configuration Release


Sous IIS, je conseille de créer un IIS App Pool Identity avec un autre utilisateur que ApplicationPoolIdentity pour garantir que votre application ait accès aux ressources dont elle a besoin.



Inutile de sélectionner une version de framework .NET puisque IIS sert ici uniquement de proxy.

Lors de mes tests, le projet déployé crashait immédiatement. Pour pouvoir afficher les erreurs, il m'a fallu créer une variable d'environnement:

set ASPNETCORE_ENVIRONMENT=Development



Je me suis ensuite rendu compte que le fichier project.json devait (pour une raison que j'ignore encore) être copié dans le répertoire de déploiement.

Et voilà le travail! L'application tourne sur le port 80:




Conclusion

J'espère que cet article, certe un peu décousu, aura pu vous aider. Il existe déjà de nombreuses ressources sur le web, mais le framework évoluant très vite, elles sont malheuresement très vite obsolètes.

A bientôt pour de nouvelles expérimentations sur le web!

Commentaires