Pergunta

Eu li o artigo de John Robbins TFS 2010 Número da construção e versões do arquivo de montagem: completamente em sincronia com apenas o msbuild 4.0, e estou me perguntando sobre a melhor maneira de integrar isso.

O download do artigo possui dois arquivos, um é um arquivo de destino e um é um arquivo proj.

O arquivo Targets possui várias tarefas para eliminar um número de construção com base no número de construção do TFS (o mesmo usado para as compilações) e escrever esse número em algum local (ligue para o BuildNumberFile) para consumo por outros arquivos ProJ.

O arquivo proj é muito simples. Ele apenas importa o arquivo de destino mencionado acima e, em seguida, declara um alvo com o nome "All", ao mesmo tempo em que declara o DefaultTargets no elemento do projeto também.

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

Eu tenho duas perguntas sobre isso:

  • Ainda estou aprendendo msbuild. Se o nome do alvo não for especificado em outros lugares dos alvos, o alvo será executado? Como faço para garantir que esse alvo seja executado?
  • Os arquivos CSPROJ devem declarar um item de inclusão para o local em que o BuildNumberFile está, mesmo que não exista até o CompileTime?
  • Os grupos de item e incluem ter um dependente de dependência ou algo que lhes permita garantir que o arquivo exista antes de construir?
  • Todo o conteúdo do arquivo CSProj usando isso deve ser envolvido em um alvo que expressa depende -se os alvos do BuildNumberFile?

Obrigado!

Foi útil?

Solução

Acho que descobri isso, mas duas pessoas promoveram minha pergunta, então vou responder aqui:

  • Você pode garantir que um alvo seja executado expressando uma dependência de outro alvo. Microsoft.Common.Targets expõe dois alvos-para construir e pós-construção-expressamente com o objetivo de ser substituído para personalização. Eu achei a maneira mais fácil de fazer isso era <Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" /> Onde o WriteSharedCSharPassemBlyVersionFile é o alvo declarado no download do link na postagem original. Além disso, se você é novo no msbuild, esse destino antes da construção deve ser declarado depois que o Microsoft.CSharp.Targets é importado, mas o modelo CSPROJ padrão o guia para fazer isso.

  • O alvo WriteSharedCSharPASMBLEVERSIONFILEFILE deve realmente gravar o arquivo em algum local central, pois, ao criar uma solução, todos os alvos são executados apenas uma vez. Todos os projetos devem fazer referência ao arquivo desse local, mesmo que não exista, pois quando a compilação ocorre (ou, mais importante, quando as referências de tempo estiverem resolvidas), o destino antes da construção será executado e o arquivo estará em vigor.

    • Na minha estrutura, tenho esses arquivos de versão em uma pasta diretamente abaixo da pasta raiz da ramificação. Além disso, como o arquivo que está sendo criado é gerado, eu o criei no diretório de saída. Parece um pouco estranho fazer referência a coisas da saída, mas preserva o invariante de criar todos os produtos em um só lugar, para que o diretório de saída possa ser impressionado como um meio de realizar uma limpeza.
  • Nos itens MSBuild, constituem insumos no sistema (geralmente arquivos), por isso é estranho pensar neles, dependendo dos alvos. Depois de aprender, essa pergunta não faz muito sentido. De qualquer forma, a resposta é não.

  • Todo o conteúdo do arquivo não deve realmente estar em um alvo-tudo o que é necessário é importar o arquivo wintellect.tfsbuildnumber.targets no início do seu arquivo csproj e declarar antes da dependência do WriteSharedcSharPassumblyversionFile no final.

Espero que isto ajude!

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