Por que uma propriedade valor do trabalho quando está sendo usado como um valor de atributo e não um valor do item em msbuild?

StackOverflow https://stackoverflow.com/questions/680618

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu estou tentando construir a documentação para o meu aplicativo usando Sandcastle Ajuda Builder Arquivo. Uma exigência é que devo especificar a fonte de documentação para por exemplo:.

<DocumentationSources>
    <DocumentationSource sourceFile="@(DocumentationSourceFiles)" xmlns="" />
</DocumentationSources>

Eu tenho definido @ (DocumentationSourceFiles) em um arquivo separado da seguinte forma:

  <ItemGroup>
     <DocumentationSourceFiles Include="..\src\**\*.exe"></DocumentationSourceFiles>
  </ItemGroup>

Eu, então, importado este arquivo no arquivo .shfbproj e usou-o como indicado acima. O problema é que @ (DocumentationSourceFiles) não está sendo reconhecido como uma lista de itens, mas apenas como uma string. Estou fazendo algo errado? Se eu fosse para a mudança @ (DocumentationSourceFiles) em uma propriedade com um único valor como:

<PropertyGroup>
    <DocumentationSourceFiles>S:\SVN\myApp\src\myAppName\Debug\bin\myApp</DocumentationSourceFiles>
</PropertyGroup>

E, em seguida, use:

<DocumentationSources>
    <DocumentationSource sourceFile="$(DocumentationSourceFiles)" xmlns="" />
</DocumentationSources>

Tudo funciona bem. Alguma idéia?

Foi útil?

Solução

Usando a notação @ (myType) permite uma coleção de itens do tipo myType a ser expandido em um ponto e vírgula (;) lista delimitada de cordas, e passado para um parâmetro. Se o parâmetro é do tipo string, então o valor do parâmetro é a lista de elementos separados por ponto e vírgula. Se o parâmetro é uma matriz de cadeias (string []), cada elemento é inserido na matriz baseada na localização do ponto e vírgula. Se o parâmetro tarefa é do tipo ITaskItem [], o valor é o conteúdo da coleção de itens com quaisquer metadados anexado. Para delimitar cada item com um carácter diferente de um ponto e vírgula, use a sintaxe @ (myType, 'separador').

Se você quer ter cada item separadamente, use a notação de metadados: % (ItemCollectionName.ItemMetaDataName)

<ItemGroup>
  <DocumentationSourceFiles Include="..\src\**\*.exe"></DocumentationSourceFiles>
</ItemGroup>

<Target Name="TestItem">
  <Message Text="Using @ Notation"/>
  <Message Text="@(DocumentationSourceFiles)"/>
  <Message Text="Using Metadata Notation"/>
  <Message Text="%(DocumentationSourceFiles.RecursiveDir)%(Filename)%(Extension)"/>
</Target>

> Output:
Using @ Notation
..\src\doc1.exe;..\src\doc2.exe;..\src\subdir\doc3.exe
Using Metadata Notation
..\src\doc1.exe
..\src\doc2.exe
..\src\subdir\doc3.exe
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top