Почему значение свойства работает при использовании в качестве значения атрибута, а не значения элемента в msbuild?
-
22-08-2019 - |
Вопрос
Я пытаюсь создать документацию для своего приложения с помощью Sandcastle Help File Builder.Одно из требований заключается в том, что я должен указать источник документации, например:
<DocumentationSources>
<DocumentationSource sourceFile="@(DocumentationSourceFiles)" xmlns="" />
</DocumentationSources>
Я определил @(DocumentationSourceFiles) в отдельном файле следующим образом:
<ItemGroup>
<DocumentationSourceFiles Include="..\src\**\*.exe"></DocumentationSourceFiles>
</ItemGroup>
Затем я импортировал этот файл в файл .shfbproj и использовал его, как указано выше.Проблема в том, что @(DocumentationSourceFiles) распознается не как список элементов, а просто как строка.Я делаю что-нибудь не так?Если бы я изменил @(DocumentationSourceFiles) на свойство с одним значением, например:
<PropertyGroup>
<DocumentationSourceFiles>S:\SVN\myApp\src\myAppName\Debug\bin\myApp</DocumentationSourceFiles>
</PropertyGroup>
И затем используйте:
<DocumentationSources>
<DocumentationSource sourceFile="$(DocumentationSourceFiles)" xmlns="" />
</DocumentationSources>
Все работает нормально.Есть какие-нибудь идеи?
Решение
Использование обозначения @(MyType) позволяет развернуть коллекцию элементов типа MyType в список строк, разделенных точкой с запятой (;), и передать параметру.Если параметр имеет тип string, то значением параметра является список элементов, разделенных точками с запятой.Если параметр представляет собой массив строк (string[]), каждый элемент вставляется в массив на основе расположения точек с запятой.Если параметр задачи имеет тип ITaskItem[], значение представляет собой содержимое коллекции элементов с любыми прикрепленными метаданными.Чтобы разделить каждый элемент символом, отличным от точки с запятой, используйте синтаксис @(MyType, 'separator').
Если вы хотите иметь каждый элемент отдельно, используйте обозначение метаданных : %(имя_коллекции элемента.Имя_данных элемента)
<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