为什么在用作msbuild中的属性值而不是Item值时,属性值是否有效?

时间:2009-03-25 08:00:53

标签: msbuild sandcastle

我正在尝试使用Sandcastle帮助文件生成器为我的应用程序构建文档。一个要求是我必须指定文件来源,例如:

<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 个答案:

答案 0 :(得分:2)

  

使用符号@(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