domingo, 29 de agosto de 2010

Nu – gerenciamento de pacotes em .NET

UPDATE: o projeto Nu deu lugar ao NuPack, que conta com o apoio da Microsoft. Veja maiores informações aqui.

Quando desenvolvi pela primeira vez em Ruby, uma das coisas que mais me chamaram a atenção foi o gerenciamento de pacotes. Com o gem (gerenciador de pacotes do Ruby), instalar um pacote é simples assim:
gem install meu_pacote

Na plataforma .NET as coisas são um pouco mais complicadas. Para obter uma biblioteca normalmente temos que passar por uma série de passos:
  • Procurar o site que contém a biblioteca;
  • No site, achar o link para download da versão que queremos;
  • Fazer o download;
  • Descompactar a biblioteca;
  • Copiar a biblioteca para o projeto.
Por quê ninguém tentou melhorar isso? Bem… vários projetos foram criados para tentar resolver esse problema, mas nenhum até o momento teve sucesso, seja por motivos técnicos ou por falta de adoção.

Recentemente surgiu a idéia: se o gem funciona tão bem, por quê não utilizá-lo na plataforma .NET? O projeto Nubular (ou simplesmente Nu) surgiu justamente para permitir que bibliotecas .NET usem o gem.

Instalando o RubyGems

Para usar o Nu é necessário ter o Ruby (ou o IronRuby) e o RubyGems. Se você já tem, pode pular par ao próximo tópico.

Primeiro instale o Ruby. Nesse link você pode fazer o download do instalador. Eu testei com a versão 1.8.7 que pode ser baixada diretamente aqui.

Para facilitar, adicione ao PATH (nas variáveis de ambiente) o diretório do Ruby.
path
Agora, instale o RubyGems. É só fazer o download do ZIP nesse link, descompactar, via linha de comando acessar o diretório descompactado e executar o seguinte comando:
ruby setup.rb

INSTALANDO O nu

Com o Ruby e o RubyGems devidamente instalados, instalar o Nu é simples, basta executar o seguinte comando:
gem install nu
Pronto, é só isso.

Usando o Nu

Para adicionar uma biblioteca ao seu projeto, acesse o diretório do projeto e execute o seguinte comando:
nu install meu_pacote

Onde “meu_pacote” é o nome da biblioteca a ser instalada.

Veja na imagem abaixo o StructureMap sendo adicionado ao projeto.
nu - structuremap
Ao instalar um pacote que tem dependências de outros pacotes, as dependências serão automaticamente instaladas. Ao instalar o FluentNHibernate, por exemplo, outros pacotes como o log4net, NHibernate e o Castle também são instalados.
nu - fluentnhibernate Repare que na pasta do projeto foram adicionados os componentes e todas as suas dependências.
pasta projeto

O que ele não tenta resolver

Ao usar diversas bibliotecas, cedo ou tarde acabamos enfrentando o famoso problema apelidado de DLL Hell.

Imagine a seguinte situação: uso a biblioteca A na versão 1.0 e a B na versão 2.0, porém a biblioteca A também usa a biblioteca B, mas na versão 1.5. Ou seja, eu preciso da biblioteca A v2.0 e a biblioteca B precisa da biblioteca A v1.5.

Esse é um problema que não tem como ser resolvido pelo simples gerenciamento de pacotes. Para resolver problemas assim, normalmente temos que usar binding redirect ou acabar recompilando o código.

Concluindo…

O Nu realmente facilita muito o gerenciamento de pacotes, agora resta aguardar para ver como será sua adoção. Nesse pequeno tempo de vida já há dezenas de projetos disponibilizados via Nu. Na página do projeto há uma lista deles.

Para maiores informações e para saber como criar seu pacote, acesse o site do projeto. No Herding Code (podcast a respeito de software) também há uma entrevista com os desenvolvedores do projeto.