{"id":1625,"date":"2016-01-12T17:25:10","date_gmt":"2016-01-12T23:25:10","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1625"},"modified":"2016-01-12T17:38:16","modified_gmt":"2016-01-12T23:38:16","slug":"asp-5-en-gnulinux-con-mono-dnvm-dnu-y-dnx","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1625","title":{"rendered":"ASP 5 en GNU\/Linux con Mono, DNVM, DNU y DNX"},"content":{"rendered":"<p>Ya hace un tiempo que Microsoft liber\u00f3 como tecnolog\u00eda abierta .NET para poder difundir su capacidad de ejecutar aplicaciones en cosas que no solo sea Microsoft. Este esfuerzo lo inicio Miguel de Icaza con Mono y Microsoft se le uni\u00f3 para cerrar filas.<\/p>\n<p>Ya antes he escrito <a href=\"https:\/\/www.lastdragon.net\/?p=1167\">art\u00edculos de como ejecutar aplicaciones .NET en GNU\/Linux usando Mono<\/a>, tanto con Winforms, WebForms y otras, algunas cosas como Entity Framework, MVC eran m\u00e1s complicadas, pero eso se termina hoy gracias a que Microsoft al fin se pasa a lado correcto de la fuerza y que quiere expandirse despu\u00e9s de ya no ser la monopolizadora de tecnolog\u00eda de anta\u00f1o, atr\u00e1s quedaron los a\u00f1os de arrogancia de esta corporaci\u00f3n.<\/p>\n<p><strong>ASP 5 en GNU\/Linux con CentOS Mono y el entorno de Microsoft.<\/strong><\/p>\n<p>1 Requerimientos b\u00e1sicos<\/p>\n<p><code>yum install unzip libunwind curl-dev<\/code><\/p>\n<p>2 Bajar y compilar Mono al momento de escribir este art\u00edculo estaba disponible la versi\u00f3n 4.2.2<\/p>\n<p><a href=\"http:\/\/download.mono-project.com\/sources\/mono\/mono-4.2.2.10.tar.bz2\">http:\/\/download.mono-project.com\/sources\/mono\/mono-4.2.2.10.tar.bz2<\/a><\/p>\n<p><code>.\/configure \u2013prefix=\/rutaainstalar<br \/>\nmake<br \/>\nmake install<\/code><\/p>\n<p>Agregar los binarios de mono al PATH para poder ejecutarlos cuando sean requeridos, en este caso uso el siguiente PATH pero eso depende de la ruta destino de instalacion<\/p>\n<p><code>PATH=$PATH:$HOME\/bin:\/usr\/mono4.2.2\/bin<\/code><\/p>\n<p>3 Compilar e Instalar librer\u00eda libuv<\/p>\n<p><a href=\"http:\/\/dist.libuv.org\/dist\/v1.4.2\/libuv-v1.4.2.tar.gz\">http:\/\/dist.libuv.org\/dist\/v1.4.2\/libuv-v1.4.2.tar.gz<\/a><\/p>\n<p><code>autogen.sh<br \/>\n.\/configure \u2013prefix=\/rutadeinstalacion<br \/>\nmake<br \/>\nmake install<\/code><\/p>\n<p>Crear los enlaces simb\u00f3licos, para este caso yo uso, esto varia dependiendo el lugar de destino de la instalacon<\/p>\n<p><code>ln -s \/usr\/lib64\/libdl.so.2 \/usr\/lib64\/libdl<br \/>\nln -s \/usr\/local\/lib\/libuv.so.1.0.0 \/usr\/lib64\/libuv.so<\/code><\/p>\n<p>4 Instalar las herramientas de Microsoft para crear un entorno donde se puedan ejecutar las aplicaciones .NET<\/p>\n<p><strong>Descargar el instalador de vnvm<\/strong><\/p>\n<p>wget <a href=\"https:\/\/raw.githubusercontent.com\/aspnet\/Home\/dev\/dnvminstall.sh\">https:\/\/raw.githubusercontent.com\/aspnet\/Home\/dev\/dnvminstall.sh<\/a><\/p>\n<p><code>chmod +x dnvminstall.sh<br \/>\n.\/dnvminstall.sh<\/code><\/p>\n<p>5 Instalar los certificados de Microsoft, si este paso no se realiza, los dnu restore no descargan las dependencias correctamente, en ocasiones ni siquiera las descarga<\/p>\n<p><code>certmgr -ssl -m https:\/\/go.microsoft.com<br \/>\ncertmgr -ssl -m https:\/\/nugetgallery.blob.core.windows.net<br \/>\ncertmgr -ssl -m https:\/\/nuget.org<\/code><\/p>\n<p>mozroots &#8211;import \u2013sync<\/p>\n<p>Eso es todo, en este punto ya est\u00e1 instalado todo lo necesario para crear un entorno tipo Microsoft amigable para cualquier aplicaci\u00f3n. A partir de aqu\u00ed es valido configurar como si se estuviera en una consola de Windows Server usando los comandos  dnvm, dnu y dnx<\/p>\n<p>Me centrare en la configuraci\u00f3n con Mono y GNU\/Linux aunque con otros par\u00e1metros aplica de la misma forma en Windows<\/p>\n<p><strong>Configurando.<\/strong><\/p>\n<p><strong>dnvm<\/strong><\/p>\n<p>Descarga los runtime con los que las aplicaciones se ejecutaran. Para indicarle que ya tenemos Mono instalado en el sistema y que ser\u00e1 nuestro core.<\/p>\n<p><code>dnvm upgrade -r mono<\/code><\/p>\n<p>Para listar los runtimes que se tienen para trabajar<\/p>\n<p><code>dnvm list<\/code><\/p>\n<p>se debe obtener una salida como la siguiente.<\/p>\n<blockquote><p>Active Version Runtime Architecture OperatingSystem Alias<br \/>\n&#8212;&#8212; &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8211;<br \/>\n* 1.0.0-rc1-update1 mono linux\/osx default<\/p><\/blockquote>\n<p>Para configurar que se usara siempre este runtime<\/p>\n<p><code>dnvm use 1.0.0-rc1-update1 -r mono -p<\/code><\/p>\n<p>En este punto el sistema est\u00e1 listo para ejecutar cualquier aplicaci\u00f3n de .NET<\/p>\n<p><strong>Ejecutando una aplicaci\u00f3n de consola<\/strong><\/p>\n<p>Esto se puede hacer usando solamente MONO, sin embargo en algunos casos las dependencias dentro del c\u00f3digo podr\u00edan solicitar DLL que no vienen incluidas con MONO y es aqu\u00ed donde este runtime salva el d\u00eda, por ahora solo se ejecutara una sencilla aplicaci\u00f3n de consola<\/p>\n<p>1 Crear una carpeta donde estar\u00e1 la aplicaci\u00f3n<\/p>\n<p>2 Crear un archivo project.json con el siguiente contenido<\/p>\n<p><code>{<br \/>\n\"frameworks\": {<br \/>\n\"dnx451\": {}<br \/>\n}<br \/>\n}<\/code><\/p>\n<p><strong>dnx451<\/strong> es compatible con mono<\/p>\n<p>3 Se crea el archivo donde est\u00e1 el Main de la aplicaci\u00f3n.<\/p>\n<p>using System;<\/p>\n<p><code>class Program<br \/>\n{<br \/>\nstatic void Main(string[] args)<br \/>\n{<br \/>\nConsole.Write(\"Hola Last Dragon\");<br \/>\nConsole.Read();<br \/>\n}<br \/>\n}<\/code><\/p>\n<p>Con el comando dnu se prepara el runtime para ejecutar la aplicaci\u00f3n, dnu lee el archivo project.json y genera otro como salida llamado project.lock.json que le indica dnx como tratar la aplicaci\u00f3n contenida en la carpeta.<\/p>\n<p><strong>dnu restore<\/strong><\/p>\n<p>finalmente se llama a dnx para ejecutar, en el caso de una aplicaci\u00f3n tan simple como la del ejemplo es suficiente con dnx run, dnx se encargar de buscar el punto de entrada de la aplicaci\u00f3n y no hace falta pasar el archivo fuente C#<\/p>\n<p><strong>dnx run<\/strong><\/p>\n<p>Hola Last Dragon<\/p>\n<p><strong>Ejecutando aplicaciones ASP 5<\/strong><\/p>\n<p>Ejecutar ASP 5 es a\u00fan m\u00e1s f\u00e1cil pues la carpeta del proyecto ya viene preparada con todo lo necesario, el mismo Visual Studio crea por si solo el archivo project.json con todos lo necesario para que el dnu restore instale todas las dependencias y con el par\u00e1metro web se inicia un proceso de servidor WEB prove\u00eddo por el mismo dnx y solicitado desde el interior de project.json<\/p>\n<p><code>dnu restore<br \/>\ndnx web<\/code><\/p>\n<p>Al entrar a la aplicaci\u00f3n se obtiene algo como esto.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/asp5.jpg\" alt=\"ASP 5 en GNU\/Linux\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/asp5.jpg\">Ver mas grande<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ya hace un tiempo que Microsoft liber\u00f3 como tecnolog\u00eda abierta .NET para poder difundir su capacidad de ejecutar aplicaciones en cosas que no solo sea Microsoft. Este esfuerzo lo inicio Miguel de Icaza con Mono y Microsoft se le uni\u00f3 para cerrar filas. Ya antes he escrito art\u00edculos de como ejecutar aplicaciones .NET en GNU\/Linux&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1630,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-1625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultoria-y-manuales","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1625"}],"version-history":[{"count":5,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1625\/revisions"}],"predecessor-version":[{"id":1631,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1625\/revisions\/1631"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/media\/1630"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}