domingo, 3 de julio de 2016

.Net Core Hola Mundo

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:

Así que con esta herramienta y un editor de texto tenemos todo lo necesario para programar con .Net Core. Empezamos: Creamos un directorio y ejecutamos dotnet new y veremos que nos genera dos ficheros. program.cs y proyect.json
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).

  1. Eliminar "type": "platform" de todas las dependencias del proyecto
  2. Añadir como dependencia Microsoft.NETCore.App
  3. 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)
  4. Una vez modificadas las dependencias ejecutamos dotnet restore para descargarlas
  5. 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