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?
-
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?
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