Depois de alguns dias apanhando no TFSBuild, separei algumas dicas simples mas que valem ouro na hora de montar o script do build (TFSBuild.proj). Os exemplos (linhas de código) abaixo foram definidas somente como exemplo.
Boa prática é criar variáveis para caminhos (path), pastas (folder)
<PropertyGroup>
<WebDeployFolder>\\Servidor1</WebDeployFolder>
<WebSiteName>WebSiteDemo</WebSiteName>
</PropertyGroup>
Enviar mensagem
<Message Text="WorkspaceName: $(WorkspaceName)"></Message>
Mensagem utéis
<Message Text="BinariesRoot: $(BinariesRoot)"></Message>
<Message Text="OutDir: $(OutDir)"></Message>
<Message Text="SolutionRoot: $(SolutionRoot)"></Message>
<Message Text="BuildDirectory: $(BuildDirectory)"></Message>
<Message Text="BuildProjectFolderPath: $(BuildProjectFolderPath)"></Message>
<Message Text="DropLocation: $(DropLocation)\$(BuildNumber)"></Message>
<Message Text="WorkspaceName: $(WorkspaceName)"></Message>
<Message Text="BuildUri: $(BuildUri)"></Message>
<Message Text="TeamFoundationServerUrl: $(TeamFoundationServerUrl)"></Message>
Excluir um determinado arquivo. Mas lembre-se em qual momento (Target) deseja fazer essa operação
<Target Name="AfterBuild">
<Delete Files="$(WebDeployFolder)\$(WebSiteName)\Web.config"></Delete>
</Target>
Excluir uma determinada pasta do build
<ItemGroup>
<ExcludeFromBuild Include="$(SolutionRoot)\WebSite1\WebSite1\" />
</ItemGroup>
Criando uma variável com uma lista de arquivos
<ItemGroup>
<BinToCopy Include="$(SolutionRoot)\$(WebSiteName)\$(WebSiteName)\Bin\*.dll" />
<FilesToCopy Include="$(SolutionRoot)\$(WebSiteName)\$(WebSiteName)\**\*.*" />
</ItemGroup>
Copiando determinados arquivos para uma pasta
<Target Name="AfterDropBuild">
<ItemGroup>
<BinToCopy Include="$(SolutionRoot)\$(WebSiteName)\$(WebSiteName)\Bin\*.dll" />
</ItemGroup>
<Copy SourceFiles="@(BinToCopy)" DestinationFiles="@(BinToCopy ->'$(WebDeployFolder)\$(WebSiteName)\Bin\%(Filename).dll')" ContinueOnError="false" SkipUnchangedFiles="false" />
</Target>
Criando uma variável com determinados arquivos e com parâmetros de exclusão, e copiando os arquivos
<CreateItem Include="$(SolutionRoot)\$(WebSiteName)\$(WebSiteName)\**\*.*" Exclude="*.pdb;*.config;*.refresh" >
<Output ItemName="SiteFiles" TaskParameter="Include" />
</CreateItem>
<Copy SourceFiles="@(SiteFiles)" DestinationFiles="@(SiteFiles ->'$(WebDeployFolder)\$(WebSiteName)\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="true" SkipUnchangedFiles="false" />
Popula as 3 saídas (arquivos adicionados (get), sobrescritos (replaces) e excluídos (deletes))
<PropertyGroup>
<IncrementalGet>true</IncrementalGet>
<GetPopulateOutput>true</GetPopulateOutput>
</PropertyGroup>
O post do Aaron Hallberg fala sobre como criar uma task para recuperar essas variáveis.
Tafera customizada, fazendo referência a uma dll
<UsingTask TaskName="TaskBuild.MyTask" AssemblyFile="C:\TaskBuild.dll" />
<ItemGroup>
<AdditionalReferencePath Include="C:\" />
</ItemGroup>
<Target Name="AfterDropBuild">
<MyTask />
</Target>
Path TFS Cache
C:\Documents and Settings\[UserName]\Local Settings\Application Data\Microsoft\Team Foundation\[Version]\Cache
Microsoft.TeamFoundation.Build.Targets
http://msdn.microsoft.com/en-us/library/aa337604.aspx
30 propriedades uteís
http://www.woodwardweb.com/vsts/30_useful_team.html
São mais de 70, mas no post citado acima são listadas somente 30 (as mais úteis).
Por enquanto é isso!
;)