Pergunta

Eu tenho tentado fazer uma tarefa na minha TFS constrói mais genérico, e uma das coisas que eu estou tentando fazer é copiar alguns arquivos para pastas diferentes, dependendo da compilação usando a tarefa. Eu brinquei com a idéia de usar propriedades, mas eu não conseguia pensar em uma maneira de fazer isso de forma limpa, então eu tentei ir com o uso de metadados de item, como eu tenho sido capaz de fazê-lo em outro lugar no mesmo arquivo de destino Eu estou trabalhando, só que desta vez, eu gostaria de usar propriedades.

Aqui está o que eu quero fazer:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

E mais tarde na compilação, eu tentei copiar alguns arquivos para a pasta de destino, fazendo referência a metadados de item:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>

Infelizmente, após a compilação é executado, o meu BuildLog mostra o seguinte:

Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".

% (DestinationParentPath) tinha expandido para uma cadeia vazia, por qualquer motivo. Usando% (DestinationParent.DestinationParentPath) produziu um erro, me dizendo que eu deveria simplesmente estar usando% (DestinationParentPath). $ (DeploymentPath) é expandido para a seqüência correta como esperado em vários outros lugares na compilação.

Outra fonte de confusão é que o uso% (ConfigurationToBuild.FlavorToBuild) produziu o valor correcto, isto é, de teste, como pode ser visto a seguir:

EDIT: isto é definido na raiz do nó do projeto, enquanto o ItemGroup com DestinationParentPath é definido em um nó de destino. Será que isso também faz a diferença?

<ItemGroup>
  <ConfigurationToBuild Include="Test|Any CPU">
    <FlavorToBuild>Test</FlavorToBuild>
    <PlatformToBuild>Any CPU</PlatformToBuild>
  </ConfigurationToBuild>
</ItemGroup>

Não parece como se o Incluir atributo é relevante quando você está interessado apenas na corda nos metadados do item desde que eu tenho certeza "Test | Qualquer CPU". Não faz referência a qualquer arquivo real

Assim, mais uma vez, por que é% (DestinationParentPath) expandindo para uma cadeia vazia?

EDIT:. Eu esqueci de mencionar que eu também tentou embutir o caminho real para DestinationParentPath, mas isso ainda resultou em% (DestinationParentPath) expandindo para uma string vazia

Foi útil?

Solução

EDIT: isto é definido na raiz do nó do projeto, enquanto o ItemGroup com DestinationParentPath é definido em um nó de destino. Será que isso também faz a diferença?

Sim, ele faz a diferença. A capacidade para definir um ItemGroup dentro de um alvo é novo para msbuild 3,5. Apesar da aparência declarativa, é realmente executado em tempo de execução, tal como se tinha chamado o velho estilo CreateItem / tarefas CreateProperty. Isso por si só leva a problemas potenciais: você precisa considerar quando a tarefa contendo é (primeiro) chamado. Ordem das operações nem sempre é óbvio para o nu olho. Pode ser sábio para tornar a tarefa onde você usa% (DestinationParentPath) depende da tarefa em que ele é criado, mesmo se não há nenhuma dependência "lógico".

Além disso, há o msbuild antigo escopo peculiaridades / bugs. dinamicamente criado propriedades e itens são não é visível para tarefas "irmãos" . Além disso, itens atualizados em aninhada constrói nem sempre são borbulhava .

Confira as soluções nos links, você deve ser capaz de encontrar algo que funciona para você mesmo se é nojenta.

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