Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Rodando Nuget no Mono


Fala galera, beleza? Esses dias eu quis experimentar o Nuget(com Mono) no meu Mac. Aparentemente não temos um console pro Nuget no Monodevelop, mas isso não é o que nos impediria de tentar já que o Nuget possui uma command-line tool certo?

Baixando o Nuget

A primeira coisa que fiz foi baixar a command-line tool do Nuget no codeplex http://nuget.codeplex.com/releases (sim vamos baixar um .exe mesmo)

Rodando o Nuget

Suponho que você já possui o Mono instalado em seu ambiente. Vamos abrir o terminal e digitar:

mono NuGet.exe

Feito isso vamos receber um erro como esse:

vquaiato [nuget_testes] $ mono NuGet.exe

WARNING: The runtime version supported by this application is unavailable. Using default runtime: v2.0.50727

Unhandled Exception: System.TypeLoadException: Could not load type 'NuGet.Program' from assembly 'NuGet, Version=2.0.30619.9000, Culture=neutral, PublicKeyToken=null'. [ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type 'NuGet.Program' from assembly 'NuGet, Version=2.0.30619.9000, Culture=neutral, PublicKeyToken=null'.

Isso acontece pois o Nuget roda com a runtime 4.0 do .NET e o default do Mono é a runtime 2.0, mas isso é facilmente contornável:

mono --runtime=v4.0.30319 NuGet.exe

E o resultado disso deve ser parecido com isso:

Compilando o Mono

Até aí tudo perfeito, se quisermos por exemplo procurar um pacote podemos digitar:

mono --runtime=v4.0.30319 NuGet.exe list nunit

E com isso teremos uma listagem de pacotes com o termo "nunit":

O problema acontece quando tentamos instalar algum pacote:

mono --runtime=v4.0.30319 NuGet.exe install nunit

Obteremos um erro parecido com isso:

vquaiato [nuget_testes] $ mono --runtime=v4.0.30319 NuGet.exe install nunit

Missing method System.Security.Cryptography.CryptoConfig::get_AllowOnlyFipsAlgorithms() in assembly /Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/mscorlib.dll, referenced in assembly /Users/vquaiato/Projects/nuget_testes/NuGet.exe

Method not found: 'System.Security.Cryptography.CryptoConfig.get_AllowOnlyFipsAlgorithms'.

O motivo é muito simples: este método não está implementado na versão de release atual do Mono! Para nossa alegria este método já está implementado no github do Mono há bastante tempo, então basta compilarmos o Mono usando o repositório do github.

Eu assumo que você já possui uma versão do Mono(e do Git) instalada. Então vá ao terminal e digite:

git clone git://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=/local-para-instalar-sua-versao-do-mono
make

O comando make pode demorar um pouco. Quando ele terminar:

make install

Isso também pode demorar. Mas quando terminarmos poderemos finalmente baixar nossos pacotes utilizando o Nuget:

/./local-onde-instalou-o-novo-mono/bin/mono NuGet.exe install MvcScaffolding

Neste caso estamos instalando o MVCScaffolding, veja que realmente ele baixa todas as dependências:

Deixando mais elegante

Para deixarmos tudo mais elegante crie um script chamado nuget em um local que esteja no seu PATH:

#!/bin/sh
exec /local-onde-instalou-o-novo-mono/bin/mono --gc=sgen /local-onde-colocou-o-nuget/NuGet.exe "$@"

Dê permissão de execução para esse script:

chmod +x /local-onde-criou-o-script/nuget

Agora podemos digitar:

nuget install nome-do-pacote

Resumindo

Bastante simples hein? A princípio pode assustar um pouco mas garanto que é tudo tranquilo. Se você tiver alguma dúvida ou problema para compilar o Mono o README deles no github vai ajudar. Bom é isso. Pra quem quiser (assim como eu) usar um pouco de .NET no Mac e usar as facilidades do Nuget.

Voltar

Fork me on GitHub