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
André Dias
André Dias é sócio-fundador da Lambda3, Visual Studio ALM Ranger & MVP e Professional Scrum Developer Trainer pela Scrum.Org. É graduado em Ciência da Computação pela Unip, atua na área de desenvolvimento de softwares a mais de 13 anos e nos últimos anos tem se dedicado as práticas de ALM (Application Lifecycle Management) e de Agilidade. Foi consultor de ALM da Microsoft Brasil, morou na Irlanda onde trabalhou em projetos para o governo Irlandês. No Brasil atuou em dezenas de projetos, muitos deles para o governo e para grandes instituições financeiras. Tem participação ativa na comunidade através da realização de palestras, organização de eventos, seu blog e seu twitter em @AndreDiasBR