Anteriormente en NoCompila comentamos que por fin salió la primera versión de .Net Core.
Es un momento excelente para aprender una tecnología, ya que si comienzas desde el principio entenderás los, fundamentos y las decisiones que se toman al evolucionar.
Así que qué mejor manera de comenzar con el típico hola mundo y ver qué nos ofrece el sistema.
Lo primero es descargar las herramientas necesarias para descargar desde la página de Microsoft.
Una vez instaladas las herramientas vamos a comenzar a jugar desde la línea de comandos para ver qué sucede entre bambalinas.
Lo primero que veremos es que tenemos a nuestra disposición el comando dotnet desde la consola (ya sea en windows, linux o mac os).
Los comandos que acepta dotnet son:
- dotnet new: Inicializa una proyecto de consola
- dotnet restore: Restaura las dependencias del proyecto
- dotnet build: compila el proyecto
- dotnet publish: Publica el proyecto
- dotnet run: Ejecuta el proyecto
- dotnet test: Lanza los test si hay un lanzador de pruebas definido en el proyecto
- dotnet pack: Genera un paquete de NuGet con el código
E:\Desarrollo>md TestCore01 E:\Desarrollo>cd TestCore01 E:\Desarrollo\TestCore01>dotnet new Created new C# project in E:\Desarrollo\TestCore01. E:\Desarrollo\TestCore01>dir Directorio de E:\Desarrollo\TestCore01 03/07/2016 19:15 <dir> . 03/07/2016 19:15 <dir> .. 21/06/2016 20:10 214 Program.cs 21/06/2016 20:10 367 project.json 2 archivos 581 bytes
El fichero Program.cs tiene el típico Hola Mundo. El punto de entrada de las aplicaciones c# es un método public static void Main en una clase pública y eso es lo que tenemos:
using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
El fichero project.json diseñado para que se pueda mantener manualmente que sirve para describir el proyecto. En este tenemos:
{ "version": "1.0.0-*", "buildOptions": { "debugType": "portable", "emitEntryPoint": true }, "dependencies": {}, "frameworks": { "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "imports": "dnxcore50" } } }
Si os fijáis en el fichero json, tenemos dependencias, asi que lo primero que vamos a hacer es resolverlar:
E:\Desarrollo\TestCore01>dotnet restore log : Restoring packages for E:\Desarrollo\TestCore01\project.json... log : Writing lock file to disk. Path: E:\Desarrollo\TestCore01\project.lock.json log : E:\Desarrollo\TestCore01\project.json log : Restore completed in 1024ms. E:\Desarrollo\TestCore01>
Este comando lo que ha hecho es crear un nuevo fichero project.lock.json que contiene todas las dependencias del proyecto. Este fichero se separa del project.json para mantenerlo limpio y fácil de leer.
Ahora el siguiente paso es ejecutar la aplicación:
>E:\Desarrollo\TestCore01>dotnet run Project TestCore01 (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing Compiling TestCore01 for .NETCoreApp,Version=v1.0 Compilation succeeded. 0 Warning(s) 0 Error(s) Time elapsed 00:00:01.0436049 Hello World!
Al no haber ninguna compilación previa, el comando decide compilar el proyecto (dotnet build)para poder ejecutarlo. Por defecto la salida del proyecto está en .\bin\[configuration]\[framework]\ en el ejemplo en concreto lo tenemos en .\bin\Debug\netcoreapp1.0\ donde encontraremos una dll, un pdb (para depurar la dll) y varios ficheros de configuracion .json
En .Net Core existen varias formas de publicar las aplicaciones, pero en resumidas cuentas hay dos: portables y autocontenidas.
Las portables son las que se compilan en una dll y dependen del framework que esté instalado en la máquina que se va a ejecutar, es decir con una única compilación se puede ejecutar en distintos sistemas operativos, siempre que tengan .Net Core instalado.
Mientras que las autocontenidas llevan el runtime específico para un sistema de tal manera que tengan o no .net core instalado. Es decir que la salida será un ejecutable con todo lo necesario para funcionar.
Antes compilamos una aplicación portable, pero para poder generar un ejecutable debemos hacer varios cambios en la configuración (en el fichero project.js).
- Eliminar "type": "platform" de todas las dependencias del proyecto
- Añadir como dependencia Microsoft.NETCore.App
- Añadir los runtime id (RID) en los que queremos desplegar. El catálogo de runtimes de .Net Core está aquí (aunque no está actualizada la documentación, lo mejor es ver el fichero en el repositorio)
- Una vez modificadas las dependencias ejecutamos dotnet restore para descargarlas
- Ejecutar el comando build indicando el runtime que queremos usar.
Una vez realizados los cambios el fichero de configuración me ha quedado así:
{ "version": "1.0.0-*", "buildOptions": { "debugType": "portable", "emitEntryPoint": true }, //"dependencies": {"Microsoft.NetCore.App":"1.0.0"}, "frameworks": { "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0" } }, "imports": "dnxcore50" } }, "runtimes": { "win10-x64": {}, "ubuntu.16.04-x64": {}, "osx.10.11-x64":{} } }y después ejecuto el restore y el build para obtener un exe para windows 10>
E:\Desarrollo\TestCore01>dotnet restore log : Restoring packages for E:\Desarrollo\TestCore01\project.json... log : Installing runtime.win7-x64.Microsoft.NETCore.DotNetHost 1.0.1. log : Installing runtime.win7-x64.Microsoft.NETCore.Jit 1.0.2. log : Installing runtime.win7-x64.Microsoft.NETCore.DotNetHostResolver 1.0.1. log : Installing runtime.win7-x64.Microsoft.NETCore.DotNetHostPolicy 1.0.1. log : Installing runtime.unix.System.Private.Uri 4.0.1. log : Installing runtime.osx.10.10-x64.runtime.native.System.IO.Compression 1.0.1. log : Installing runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHost 1.0.1. log : Installing runtime.osx.10.10-x64.Microsoft.NETCore.Jit 1.0.2. log : Installing runtime.osx.10.10-x64.runtime.native.System.Net.Http 1.0.1. log : Installing runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography 1.0.1. log : Installing runtime.osx.10.10-x64.runtime.native.System.Net.Security 1.0.1. log : Installing runtime.osx.10.10-x64.runtime.native.System 1.0.1. log : Installing runtime.unix.System.Net.Sockets 4.1.0. log : Installing runtime.unix.System.Net.Primitives 4.0.11. log : Installing runtime.unix.System.IO.FileSystem 4.0.1. log : Installing runtime.unix.System.Console 4.0.0. log : Installing runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostPolicy 1.0.1. log : Installing runtime.osx.10.10-x64.Microsoft.NETCore.Runtime.CoreCLR 1.0.2. log : Installing runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostResolver 1.0.1. log : Installing runtime.unix.System.Diagnostics.Debug 4.0.11. log : Installing runtime.unix.System.Runtime.Extensions 4.1.0. log : Installing runtime.unix.Microsoft.Win32.Primitives 4.0.1. log : Writing lock file to disk. Path: E:\Desarrollo\TestCore01\project.lock.json log : E:\Desarrollo\TestCore01\project.json log : Restore completed in 6047ms. E:\Desarrollo\TestCore01>dotnet build -r win10-x64 Project TestCore01 (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing Compiling TestCore01 for .NETCoreApp,Version=v1.0 Compilation succeeded. 0 Warning(s) 0 Error(s) Time elapsed 00:00:01.0553350
El directorio de la salida de las aplicaciones autocontenidas es .\bin\[configuration]\[framework]\[runtime] en el caso del build lanzado es .\bin\Debug\netcoreapp1.0\win10-x64\ que es donde encontramos el exe
Es una pena que la compilación nativa de .netcore la hayan aplazado, pero seguro que en breve la veremos y será mucho mejor. Con estas build lo único que va en el ejecutable es el framework y como lanzar la aplicación (lo mismo que nosotros hacemos con dotnet run) si os fijáis junto al exe está la dll que contienen el código en IL
No hay comentarios:
Publicar un comentario