Esse post foi motivado pelo seguinte tweet que recebi do @TucaZ: “@AndreDiasBR Poxa, eu só queria fazer FTP dos meus arquivinhos aqui 🙁”. Na verdade, essa foi à mensagem final depois de diversas sugestões “mais robustas” que tanto Eu como o Igor Abade demos ao Tuca.

Entre as sugestões que mencionamos, estão a utilização do Web Deploy, que é uma ferramenta fantástica para fazer automação de deployment, que pode empacotar a sua solução, enviar para o servidor, criar o site do IIS, configurá-lo, entre outras coisas, e o BRD Lite dos ALM Rangers, que nada mais do que é um template de build que simplifica diversas atividades comuns de Build, Release e Deployment que temos que fazer no nosso dia a dia.

Essas duas soluções fazem muito mais do que o Tuca precisa, mas sem dúvida tem um custo de implantação e configuração que muitas pessoas podem achar desnecessário e, que no caso dele, faz total sentido não utilizar, uma vez que ele já tinha todo o pacote montado e queria apenas enviar o pacote para o servidor ftp.

Vamos lá! Vamos entender como fazer isso então:

MSBuild Extension Pack

Para essa solução, vamos utilizar um projeto open source chamado MSBuild Extension Pack, que contém diversas tasks úteis para o MSBuild e é coordenado pelo Mike Fourie, Visual Studio ALM Ranger e pelo Sayed Hashimi, autor do livro Inside the Microsoft Build Engine: Using MSbuild and Team Foundation Build.

A instalação desta ferramenta é bastante tranquila e segue o padrão next, next, finish. Ao final da instalação, você verá que uma pasta chamada ExtensionPack foi criada dentro da pasta C:\Program Files\MSBuild.

O próximo passo é criar um script MSBuild que fará uso das novas tasks fornecidos pelo Extension Pack.

<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks"/>

<Target Name="PublicacaoFTP">
  <Message Text="Iniciando Publicao FTP" Importance="high" />

  <ItemGroup>      
    <FilesToUpload Include="$(ProjectDir)\**\*.aspx" />
    <FilesToUpload Include="$(ProjectDir)\**\*.js" />
    <FilesToUpload Include="$(ProjectDir)\**\*.css" />
    <FilesToUpload Include="$(ProjectDir)\**\*.dll" />
    <FilesToUpload Include="$(ProjectDir)\**\*.config" />
  </ItemGroup>

  <MSBuild.ExtensionPack.Communication.Ftp TaskAction="UploadFiles" 
                                            Host="localhost" 
                                            UserName="ftpuser" 
                                            UserPassword="P2ssw0rd" 
                                            FileNames="@(FilesToUpload)"/>

  <Message Text="Publicao FTP Concluída" Importance="high" />

</Target>

Note que o script não é nada complexo. No início, ele faz a importação das tarefas do Extension Pack, em seguida cria uma target para agrupar as atividades, então ele seleciona quais os arquivos que serão publicados e por último e o mais importante, ele chama a task MSBuild.ExtensionPack.Communication.Ftp que fará todo o trabalho pesado de enviar os arquivos para o servidor FTP.

Essa tarefa também pode ser utilizada para fazer download de servidores FTP caso você mude o parâmetro TaskAction para “DownloadFiles”.

Executando o Script

O script acima está praticamente pronto para ser executado através de linha de comando usando o MSBuild.exe, mas a solução fica mais “elegante” se a integrarmos com o processo de build do Visual Studio.

Para isso, vamos criar uma simples Web Application e modificar o arquivo do projeto para que toda vez que a solução for compilada em modo Release, ele seja também publicada em um servidor FTP.

Depois da Web Application criada, clique com o botão direito no projeto e selecione a opção Unload Project, depois clique com o botão direito novamente sobre o projeto e clique em Edit. O que você verá nada mais é do que um XML que é um script MSBuild.

Vá ao final do arquivo, descomente o target AfterBuild e dentro dele utilize a task CallTarget para chamar o script que nós criamos. Utilize também o atributo Condition para garantir que essa chamada seja realizada apenas se o modo de compilação for Release. O seu código deverá ficar parecido com o script abaixo:

<Target Name="AfterBuild">
  <CallTarget Targets="PublicacaoFTP" Condition="'$(Configuration)' == 'Release'" />
</Target>

Está pronto! Para testar é só compilar a sua solução em modo Release e tudo deverá funcionar.

É isso aí pessoal. Espero que essa solução ajude, não apenas o Tuca, mas também a todos os Build Masters.

Abraços e até a próxima
André Dias