在MSBuild中,我想调用一个任务来提取特定解决方案中所有项目中的所有文件,并将这些文件保存在一个属性中,该属性可以传递给其他任务(用于处理等)。
我正在思考以下几点:
<ParseSolutionFile SolutionFile="$(TheSolutionFile)">
<Output TaskParameter="FilesFound" ItemName="AllFilesInSolution"/>
</ParseSolutionFile>
<Message Text="Found $(AllFilesInSolution)" />
将输出解决方案中项目中所有文件的列表,我可以使用AllFilesInSolution属性作为其他分析任务的输入。这是一个已经存在的任务还是我需要自己构建它?如果我需要自己构建它,那么任务应该输出一个字符串数组还是ITaskItems或其他东西?
答案 0 :(得分:2)
我不了解任务,但已有属性包含所有项目。只需查看典型的项目文件,您就会看到它们被添加到哪个集合中。
注意属性内容,编译,文件夹 ...每次向项目添加文件时,都会将其置于一个项目中像这样的主要收藏品:
<ItemGroup>
<Content Include="Default.aspx" />
<Content Include="Web.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="Default.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
<DependentUpon>Default.aspx</DependentUpon>
</Compile>
<Compile Include="Default.aspx.designer.cs">
<DependentUpon>Default.aspx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="App_Data\" />
</ItemGroup>
然后你可以做这样的事情把现有属性的值放到你的属性中(Condition属性作为过滤器):
<CreateItem Include="@(Content)" Condition="'%(Extension)' == '.aspx'">
<Output TaskParameter="Include" ItemName="ViewsContent" />
</CreateItem>
或者您可以手动执行(Include属性使用现有属性OutputPath,但它指示包含所有文件的路径):
<CreateItem Include="$(OutputPath)\**\*">
<Output TaskParameter="Include" ItemName="OutputFiles" />
</CreateItem>
MSDN MSBuild文档中有更多详细信息,当我使用自定义构建任务和非常有用的内容时,我会阅读这些文档。阅读CreateItem任务,你将能够更好地理解我在这里发布的内容。这很容易接受。
答案 1 :(得分:0)
我将以下内容用于SSRS项目的解决方案(在构建盒上安装的TFS w / o vs下不构建)。基本上我们要求将RDL捆绑到构建输出中,以便我们可以标记要发布的构建。
<Target Name="CopyArtifactstoDropLocation">
<CreateItem Include="$(SolutionRoot)\**\*.*">
<Output TaskParameter="Include" ItemName="YourFilesToCopy" />
</CreateItem>
<Copy
SourceFiles="@(YourFilesToCopy)"
DestinationFiles="@(YourFilesToCopy->'$(DropLocation)\$(BuildNumber)\Release\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
只需将复制任务的用法替换为您需要对捆绑包执行的操作。当然,这将在您的解决方案根目录中获得所有内容,但如果您使用TFS,那么您应该只有可构建的工件。