Automatizando tarefas de um projeto C# com o Cake

O desenvolvimento de uma aplicação pode ser um processo repetitivo: compilação, teste e execução/publicação. Vendo apenas esses pontos, o processo pode ser algo simples, mas ao longo do desenvolvimento, toda esta repetição pode ter consumido horas.

Quando nos deparamos com uma situação assim, chegou o momento de procuramos formas de automatizar este processo e economizarmos um esforço não útil para a aplicação.

C# (C Sharp) Básico
Curso de C# (C Sharp) Básico
CONHEÇA O CURSO

Hoje em dia existem várias soluções de automação para essas tarefas repetitivas de um projeto. Neste artigo conheceremos o Cake.

Cake

O Cake (C# Make) é um sistema de automação, multiplataforma e open source, que permite definir das tarefas em C#, se tornando assim o sistema de automação ideal para o desenvolvedor desta linguagem.

Aliases e Extensibilidade

Como é voltado para aplicações da plataforma .NET, o Cake já define uma série de métodos que representam ações em aplicações desta plataforma. Por exemplo, para aplicar o restore em um projeto .NET Core, pode ser definido a tarefa abaixo:

Task("Restore")
   .Does(() =>
    {
        DotNetCoreRestore("./ExemploCake.csproj");
    });

O método DotNetCoreRestore usado acima é chamado de “alias”, e faz parte dos alises de DotNetCore. Existem aliases para uma infinidade de tarefas, e você pode ver todos na documentação do Cake.

Caso não exista um alias nativo para a ação que queira executar, a plataforma também suporta os chamados Addins, que são métodos de extensão criados pela comunidade.

Se mesmo assim não encontrar um método para a sua tarefa, você pode criar seu próprio alias, que nada mais é que um método de extensão do C#. E se fizer isso, contribua com a comunidade disponibilizando ele no NuGet.

Agora que conhecemos o Cake, vamos ver um exemplo rápido do seu uso.

Colocando a mão na massa

Para este artigo vou testar o Cake uma aplicação console simples:

dotnet new console -n ExemploCake
cd ExemploCake

Nela o Cake pode ser adicionado com o comando do PowerShell abaixo, caso esteja no Windows:

Invoke-WebRequest https://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1

Ou o comando de terminal abaixo, caso esteja no Linux:

curl -Lsfo build.sh https://cakebuild.net/download/bootstrapper/linux

Ou caso esteja no Mac OS X:

curl -Lsfo build.sh https://cakebuild.net/download/bootstrapper/osx

Com isso, será adicionado um arquivo build.ps1 no Windows e build.sh nos ambientes Unix. Será este arquivo que executaremos quando as tarefas estiverem automatizadas.

C# (C Sharp) Intermediário
Curso de C# (C Sharp) Intermediário
CONHEÇA O CURSO

Criando um script Cake

Com o Cake adicionado na aplicação, crie nela um arquivo chamado build.cake. Será neste arquivo que as tarefas devem ser adicionadas. Por exemplo:

var target = Argument("target", "Default");

Task("Default")
  .Does(() =>
{
  Information("Hello World!");
});

RunTarget(target);

A tarefa acima é simples, como é possível supor, ela apenas exibe o famoso "Hello World" no console/terminal quando o Cake for executado:

Windows

.uild.ps1

Linux / Mac OS X

# Agusta a permissão
chmod +x build.sh

# Executa o arquivo.
./build.sh

No código, a primeira linha:

var target = Argument("target", "Default");

Define a tarefa padrão, caso alguma não seja definida durante a execução, que pode ser feito da seguinte forma:

./build.sh -target Default

Por ser código C#, podemos definir elementos que são válidos nesta linguagem com uma variável:

var target = Argument("target", "Default");

var projectFile = "./ExemploCake.csproj";

Task("Default")
  .IsDependentOn("Restore-Application")
  .Does(() =>
{
  Information("Hello World!");
});

Task("Restore-Application")
  .Does(() =>
{
  DotNetCoreRestore(projectFile);
});

RunTarget(target);

Além de definirmos uma variável:

var projectFile = "./ExemploCake.csproj";

Também foi definido que antes de executar a tarefa “Default“:

Task("Default")
  .IsDependentOn("Restore-Application")
  .Does(() =>
{
  Information("Hello World!");
});

Deve ser executa a tarefa “Restore-Application“, que aplica o restore na aplicação:

Task("Restore-Application")
  .Does(() =>
{
  DotNetCoreRestore(projectFile);
});

Pode-se cascatear uma tarefa após a outra, quantas verses for necessário:

var target = Argument("target", "Default");

var projectFile = "./ExemploCake.csproj";

Task("Default")
  .IsDependentOn("Run-Application")
  .Does(() =>
{
  Information("Hello World!");
});

Task("Restore-Application")
  .Does(() =>
{
  DotNetCoreRestore(projectFile);
});


Task("Run-Application")
  .IsDependentOn("Restore-Application")
  .Does(() =>
{
  DotNetCoreRun(projectFile);
});

RunTarget(target);

Conclusão

Agora que a configuração do Cake está definida e que já temos uma estrutura básica, ele pode ser expandido com adição de novas tarefas, como aplicação de teste e ou commit dos códigos alterados.

C# (C Sharp) Avançado
Curso de C# (C Sharp) Avançado
CONHEÇA O CURSO

Caso tenha gostado da ferramenta, você pode ver mais funcionalidades dela na sua ótima documentação.

Deixe seu comentário

Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo.