我正在尝试使用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>
一切正常。有什么想法吗?
答案 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