Почему значение свойства работает, когда оно используется как значение атрибута, а не как значение Item в msbuild? - PullRequest
0 голосов
/ 25 марта 2009

Я пытаюсь собрать документацию для своего приложения, используя Sandcastle Help File Builder. Одно из требований заключается в том, что я должен указать источник документации, например ::100100

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

Все отлично работает. Есть идеи?

1 Ответ

2 голосов
/ 25 марта 2009

Использование обозначения @ (myType) позволяет развернуть коллекцию элементов типа myType в список строк, разделенных точкой с запятой (;), и передать их параметру. Если параметр имеет тип string, то значением параметра является список элементов, разделенных точками с запятой. Если параметр представляет собой массив строк (string []), каждый элемент вставляется в массив на основе расположения точек с запятой. Если параметр задачи имеет тип ITaskItem [], значение является содержимым коллекции элементов с любыми прикрепленными метаданными. Чтобы разделить каждый элемент символом, отличным от точки с запятой, используйте синтаксис @ (myType, 'separator').

Если вы хотите, чтобы каждый элемент был отдельно, используйте запись метаданных: % (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...