in C#

Automatizando a criação de NuGet Packages

Criar um NuGet Package é uma excelente maneira de distribuir nossos projetos e bibliotecas entre as diferentes aplicações que irão  consumi-los. Já apresentei um Codificando Livre explicando como criar o seu próprio servidor Nuget (http://live.codificando.net/2013/09/edicao-6-nuget-principais-recursos-e-funcionamento/).

A ideia deste post é mostrar como automatizar o processo de criação de um Nuget Package, utilizando um XMLde configuração, o nuspec file. Para isto, vamos começar entendendo que o NuGet.exe é um utilitário que possui diversos comandos para o gerenciamento de nossos packages, comandos como adicionar um package, listar, remover, etc (http://docs.nuget.org/docs/reference/command-line-reference).

Uma ferramenta (ainda de maneira manual) que indico para editar, criar packages é o NuGet Package Explorer ( http://nuget.codeplex.com/releases/view/59864 ).

Pack Command

O comando pack cria um NuGet package baseado em um projeto ou em um xml de configuração, o .nuspec

> nuget pack <nuspec | project> [options]

Entre as principais opções disponíveis, as principais são:

  • OutputDirectory – diretório em que o package será gerado, caso não seja especificado ele será gerado no diretório que está o nuget.exe
  • BasePath – diretório de base dos arquivos que estão definidos no nuspec
  • Version – versão do package que está sendo gerado, esta configuração sobrescreve a que está no nuspec
  • Build – determina se o projeto precisa ser compilado antes de gerar o package

Pack com .csproj

Neste exemplo, vou criar um projeto de um class library com o Visual Studio 2013, e habilitar o reestore dos NuGets, clicando com o botão direito em cima da solutions. Após isto, teremos o seguinte projeto:

image

Neste caso, eu vou automatizar a criação do package do meu projeto: DemoNuPack com base do .csproj dele, para isto basta eu abrir o diretório .nuget no command prompt e executar o seguinte comando:

>NuGet.exe pack ..\DemoNuPack\DemoNuPack.csproj -Build

image

Notem que com isso no diretório .nuget do meu projeto já existe um NuGet Package gerado \o/

image

Neste caso, como não informamos o parâmetro Version, ele utilizou a informação do AssemblyVersion do meu projeto, agora alterei ele para [assembly: AssemblyVersion(“1.2.0.0”)] e executei o comando novamente.

Com isso foi gerado o NuGet Package: DemoNuPack.1.2.0.0.nupkg

image

Lembrando que um próximo passo seria criar um script com este comando em um pós build do projeto ou em uma ferramenta de CI.

Pack com .nuspec

Da mesma maneira que é possível criar um package com base em um .csproj também é possível criar um package com base em um arquivo de configuração, onde é possível incluir diversas coisas como descrição, versão, arquivos para serem incluídos, dependências, etc.

Continuando com o mesmo projeto, vou criar um arquivo chamado DemoNuPack.nuspec e deixar o xml da seguinte maneira:

<?xml version=”1.0″?>
<package xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”>
<metadata xmlns=”http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd”>
<id>DemoNuPack</id>
<title>Demo Nu Pack</title>
<version>1.3.1</version>
<authors>Rodolfo Fadino</authors>
<owners>RFJ</owners>
<licenseUrl>http://rodolfofadino.com.br</licenseUrl>
<projectUrl>http://rodolfofadino.com.br</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Projeto responsável pelo teste de package.</description>
<tags></tags>
<releaseNotes>
Relese Notes
</releaseNotes>
<summary>
Demo
</summary>
<language>en-US</language>
<dependencies>
<dependency id=”EntityFramework” version=”6.1.1″ />
<dependency id=”EntityFramework.de” version=”6.1.1″ />
<dependency id=”structuremap” version=”2.6.4.1″ />
</dependencies>
</metadata>
<files>
<file src=”..\DemoNuPack\bin\Debug\DemoNuPack.dll” target=”lib\net45″ />
<file src=”..\DemoNuPack\bin\Debug\DemoNuPack.pdb” target=”lib\net45″ />
</files>
</package>

http://docs.nuget.org/docs/reference/nuspec-reference

Notem que é possível configurar quais arquivos serão inclusos do projeto, e até quais serão as dependências, no caso coloquei o EF e o Structuremap.

Para criar o package utilizei o seguinte comando:

DemoNuPack\.nuget>NuGet.exe pack DemoNuPack.nuspec

image

Se eu abrir (no NuGet Package Explorer) o package que foi gerado, podemos ver que as configurações funcionaram.

image

Outro parâmetro bem importante é o OutputDirectory, com ele é possivel já gerar o NuGet Package em um servidor local de NuGets, ou mesmo mover para o diretório apropriado.

Este post é só uma idéia de como podemos automatizar a geração de NuGet Packages de nossos projetos. Por exemplo: podemos adicionar estes comandos como um passo em um servidor de CI e publicar um package novo a cada versão gerada.

Bom espero que este post seja útil, estou a disposição para dúvidas, criticas e sugestões.

abs

Rodolfo Fadino