Pergunta

Queremos armazenar nossas metas de construção substituído em um arquivo externo e incluir esse arquivo alvos na TFSBuild.proj. Temos um conjunto básico etapas que acontecem e gostaria de obter os passos adicionais simplesmente adicionando a linha de importação ao TFSBuild.proj criado pelo assistente.

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>

Não podemos ter uma importação em qualquer arquivo na $(SolutionRoot) porque no momento da declaração de importação é validada, a fonte não ser obtida a partir do repositório. Parece que TFS está puxando para baixo o TFSBuild.proj primeiro sem quaisquer outros arquivos.

Mesmo que se acrescente uma importação condicional, a versão no controle de origem não será importado se presente. A versão anterior, já presente no disco serão importados.

Podemos dar-se armazenar esses alvos construir com a nossa fonte, mas é a primeira dependência de sair da nossa árvore fonte por isso estamos relutantes em fazê-lo.

Existe uma maneira para qualquer um:

  1. Diga Criar equipe para puxar para baixo mais alguns arquivos para que essas declarações Import avaliar corretamente?
  2. Substituir essas metas Team Build como AfterCompile de uma forma além do Import?
  3. alvos de compilação Em última análise são executados em Criar Equipe que são mantidos sob a fonte que está tentando construir?
Foi útil?

Solução

O Team Build tem uma fase de "bootstrap", onde tudo na pasta Criar Equipe de configuração (a pasta com TFSBuild.proj) é baixado de controle de versão. Isto é realizado pelo agente de compilação antes de o agente de compilação chama MSBuild.exe dizendo que ele seja executado TFSBuild.proj.

Se você mover o arquivo de destinos de debaixo SolutionRoot e colocá-lo em sua pasta de configuração ao lado do arquivo TFSBuild.proj então você vai ser capaz de importá-lo em seu arquivo TFSBuild.proj usando um ou seja declaração de importação relativo.

<Import Project="myTeamBuild.targets"/>

Se essas metas depende de quaisquer assembleias adicionais de tarefa MSBuild personalizada, então você também pode tê-los na mesma pasta que o arquivo TFSBuild.proj e você pode referenciá-los facilmente usando um caminho relativo.

Note que em TFS2008, a configuração de compilação pasta padrão a ser menos de US $ / TeamProject / TeamBuildTypes no entanto, ele não tem que estar lá. Ela pode realmente viver em uma pasta que está dentro de sua solução - e pode até mesmo ser um projeto em sua solução dedicada ao Team Build. Isto tem várias vantagens, incluindo fazendo ramificação da compilação mais fácil. Portanto, eu normalmente têm meu construir localizado em uma pasta como esta:

$/TeamProject/main/MySolution/TeamBuild

Além disso, observe que, por padrão, durante a fase de inicialização da compilação, o agente de compilação só vai baixar arquivos que estão na pasta configuração de compilação e não irá recorrer para baixo em todas as subpastas. Se você queria para incluir arquivos em subpastas durante a fase de inicialização, em seguida, você pode definir a seguinte propriedade nos appSettings do arquivo tfsbuildserver.exe.config nas máquinas agente de compilação (localizado em% ProgramFiles% \ Visual Studio 9.0 \ Common7 \ IDE \ PrivateAssemblies)

<add key="ConfigurationFolderRecursionType" value="Full" />

Note que se você tivesse vários agentes de compilação que você tem que lembrar para definir essa configuração em todas as máquinas, e isso afetaria cada compilação realizadas pelo agente de compilação - por isso realmente é melhor apenas para manter os arquivos no raiz da pasta de configuração de compilação, se puder.

Boa sorte,

Martin.

Outras dicas

Se as metas só deve ser executado quando TFS está executando a construção e não em suas máquinas de desenvolvimento local, você pode colocar seu arquivo de alvos na pasta para a própria construção e referenciá-lo com:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />

No entanto, se você quiser que os alvos a correr para todas as compilações, você pode configurá-lo para que os projectos individuais referenciá-lo adicionando algo como:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />

No meu projeto que realmente usar ambos, o primeiro nos permite personalizar o nightly builds para que possamos fazer passos extras antes e depois de executar a compilação solução completa, eo segundo permite que projeto a projeto de personalização.

Se você criar um arquivo de substituições alvo a importação e chamá-lo de algo como TeamBuildOverrides.targets e colocá-lo na mesma pasta no controle de origem, onde TFSBuild.proj vive para o seu tipo de compilação, ele vai ser puxado primeira e estar disponível para importação no arquivo TFSBuild.proj. Por padrão, o arquivo TFSBuild.proj é adicionado aos TeamBuildTypes pasta no controle de origem diretamente sob a pasta raiz do seu projeto.

usar a seguinte declaração de importação em seu arquivo TFSBuild.proj:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />

Certifique-se de que você não tem quaisquer substituições duplicados em seu arquivo TFSBuild.proj ou as substituições importados não será demitido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top