Почему значение свойства работает при использовании в качестве значения атрибута, а не значения элемента в msbuild?

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

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top