Update: Este artigo foi escrito em uma época onde a única opção para rodar .NET no linux era o MONO, hoje em dia o .NET tem suporte nativo ao linux através do .NET Core.

Acredito que a essa altura do campeonato você, meu nobre leitor,  já conheça o mono, já que eu sou um entusiasta do sistema e vira e mexe posto algo a respeito dele por aqui.

Para quem ainda não conhece, o mono é uma plataforma que possibilita rodar aplicações desenvolvidas no Framework .NET no linux, na sua versão mais atual que no momento é a 3.2.7, ele já roda com sucesso código desenvolvido com C# 5.0, o mono está em constante desenvolvimento, isso significa que você  ainda pode encontrar alguns problemas, mas a correção desses problemas é bem rápida, visto que a comunidade é bem ativa, caso você queira dar uma conferida no que o mono não faz, basta dar uma olhadinha na lista de compatibilidade do mono.

Hoje eu vou explicar como ter a última versão do mono na sua máquina rodando o CentOS, no meu caso a VPS está rodando uma instalação zerada do CentOS 6.5, na teoria deveria ser muito fácil instalar a última versão do mono, é só baixar o tarball, compilar e está tudo certo não?

Bem, não exatamente… temos disponíveis nos fontes oficiais os seguintes build’s

Mono: 3.2.5

LibGDIPlus: 2.10

XSP: 2.10

Mod_Mono: 2.10

Primeiro será necessário instalar as bibliotecas, basta utilizar o seguinte comando

yum -y install httpd httpd-devel make glib2-devel libpng-devel libjpeg-devel giflib-devel libtiff-devel libX11-devel gcc* fontconfig-devel bison gettext bzip2 libtool automake autoconf wget unzip

depois de tudo instalado é necessário entrar no diretório tmp e baixar todos os tarballs


cd /tmp

wget http://download.mono-project.com/sources/mono/mono-3.2.5.tar.bz2
 wget http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
 wget http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2
 wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2

Agora será necessário descompactar os arquivos.


tar -xjf mono-3.2.5.tar.bz2
 tar -xjf xsp-2.10.2.tar.bz2
 tar -xjf mod_mono-2.10.tar.bz2
 tar -xjf libgdiplus-2.10.tar.bz2

Feito isso, será necessário compilar e instalar o libgdiplus

cd libgdiplus-2.10
 ./configure --prefix=/usr/local
 make ; make install

Agora vamos compilar e instalar o mono


cd ../mono-3.2.5
 ./configure --prefix=/usr/local --with-libgdiplus=/usr/local
 make ; make install

Ao dar o make no mono possivelmente você vai ser presenteado com a seguinte mensagem de erro.


/bin/sh: line 4: cd: System.Collections.Concurrent: No such file or directory

make[1]: *** [all-recursive] Error 1

Esse problema já é conhecido da equipe do mono, conforme relato aqui, mas, até o presente momento ainda não foi liberado nenhum tarball com a correção, o que nos deixa apenas com a opção de instalar direto do repositório do mono no github, não é?

Antes de instalar direto do repositório do GitHub será necessário ter uma instalação do mono funcionando, caso contrário irá ocorrer um novo erro, vamos então instalar a versão 2.10.2 e depois iremos atualizar para a versão mais recente…

como a máquina está com uma instalação limpa do CentOS será necessário instalar o git para poder baixar os fontes.

yum install git

Agora vamos clonar os repositórios do Mono, XSP, Mod_Mono e Libgdiplus.


git clone git://github.com/mono/mono.git

git clone git://github.com/mono/xsp.git

git clone git://github.com/mono/mod_mono.git

git clone git://github.com/mono/libgdiplus.git

Vamos começar a compilação dos fontes e a instalação…


cd libgdiplus

./autogen.sh --prefix=/usr/local

make ; make install

Ao fazer esse processo possivelmente irá ocorrer o seguinte erro.

libtool: Version mismatch error. This is libtool 2.4.2, but the
 libtool: definition of this LT_INIT comes from libtool 2.2.6b.
 libtool: You should recreate aclocal.m4 with macros from libtool 2.4.2

Esse erro ocorre devido à versão do libtool disponível no mono estar mais avançada que a versão do libtool que instalamos com o YUM,

Então será necessário reconfigurar o pacote, faremos isso com o comando abaixo.


autoreconf -fvi

Após isso vamos rodar o comando para compilar e instalar novamente.


./autogen.sh --prefix=/usr/local

make ; make install

Dessa vez acredito que correu tudo bem com a instalação do libgdiplus, então vamos baixar e instalar o mono 2.10.2.


wget http://download.mono-project.com/sources/mono/mono-2.10.2.tar.bz2
 tar -xjf mono-2.10.2.tar.bz2

cd ../mono-2.10.2
 ./configure --prefix=/usr/local --with-libgdiplus=/usr/local
 make ; make install

Depois disso será necessário setar as variáveis de ambiente


export PATH=$PATH:/usr/local/bin
 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

vamos nos certificar que está tudo certo, usando o comando abaixo:

mono --version

versao_mono

Agora podemos atualizar o mono.


cd ../mono

git submodule init

git submodule update

./autogen.sh --prefix=/usr/local --with-libgdiplus=/usr/local

./configure --prefix=/usr/local --with-libgdiplus=/usr/local
 make ; make install

depois disso vamos conferir qual versão do mono foi instalada (pelo menos a versão mais atual no momento que este post foi escrito)

mono --version

versao_mono_2

Já estamos com a última versão! agora vamos instalar o XSP e o Mod_Mono que é o módulo do mono para o apache…


cd ../xsp
 ./autogen.sh --prefix=/usr/local
 make ; make install

cd ../mod_mono
 ./autogen.sh --prefix=/usr/local --with-mono-prefix=/usr/local
 make ; make install

Após isso temos que copiar o arquivo de configuração para um diretório que o apache consiga enxergar.

mv /etc/httpd/conf/mod_mono.conf /etc/httpd/conf.d/

Agora vamos testar subindo um site simples feito em ASP.NET, caso esteja com preguiça pode baixar um que eu fiz, clicando aqui.

No caso de uma instalação do CentOS sem nenhum painel de controle, com acesso pelo IP, os arquivos tem que ser colocados no diretório /var/www/html, após subir os arquivos por via das dúvidas vamos reiniciar o apache.

service httpd restart

ao abrir o site  deverá ocorrer um erro

erro_site

Como pode ser visto no rodapé, a versão do ASP.NET que está sendo utilizada é a versão 2.0, precisamos alterar para que seja utilizada a versão mais recente, para isso temos que incluir uma linha no httpd.conf.

vi /etc/httpd/conf/httpd.conf

Inclua na última linha o seguinte trecho de código

MonoServerPath /usr/local/bin/mod-mono-server4

salve e reinicie o apache, agora ao atualizar a página, você deve ver os dados do ambiente e mais o trace da página

tela_dotnet

Show de boleta, mono rodando na última versão!!! 8)

Lembrando que o mono tem um recurso chamado AutoConfiguration que já é ativado por padrão ou seja, exceto se você for trabalhar com páginas ASP.NET MVC, é só pegar copiar o site pro FTP sem precisar configurar nada, é deploy & enjoy.

Se este post te ajudou ou caso tenha ocorrido algum erro não descrito aqui, deixe um comentário. eu respondo o mais rápido possível… ou não.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)