从MSBuild项目获取输出文件

时间:2009-06-26 16:48:04

标签: .net msbuild build-process

是否可以从MSBuild项目中获取所有输出文件的列表?

在一个简单的项目中,我可以做类似

的事情
<CreateItem Include="$(OutputDir)**\*">
      <Output ItemName="AllOutputs" TaskParameter="Include"/>
</CreateItem>

但我的项目是更大版本的一部分,所有输出都转到一个公共位置,我希望能够排除不属于的dll和内容。

有什么想法吗?

4 个答案:

答案 0 :(得分:24)

在再次查看您的评论之后,我意识到我错误地表达了您真正需要的内容。这是你手上的一个有趣问题。

如果你不介意编辑项目文件本身,你可能会非常关闭到你想要的。有一个 FileWrites 项可以跟踪构建过程中写出的所有文件。要开始玩这个,请编辑项目文件以获得 AfterBuild 目标

<Target Name="AfterBuild">
  <Message Text="FileWrites: @(FileWrites)" Importance="high"/>
</Target>

此方法也存在一些问题

  • 您必须自己编辑项目文件
  • 这将包含写入中间输出目录的文件(即 obj )和输出目录(即 bin
  • 如果有构建自定义项,则不需要写入此项

您可能认为可以使用MSBuild: Find Many Project References技术解决第一个问题,并在执行构建后输出FileWrites项。这只有在包装器proj文件放在与原始项目本身相同的文件夹中时才有效,因为.csproj文件中的所有项都是用相对路径声明的。所以大部分都是这样。

您可以使用FindUnderPath任务来获取放置在 OutputPath 文件夹中的文件,从而克服第二个限制。

你可以做但是不可靠的是在构建开始时检查OutputPath,然后在构建结束时再次查看添加的内容。假设您将原始文件放入项目StartFiles中,并在构建结束时将所有文件放入名为EndFiles的项目中,您可以这样做:

<Target Name="SomeTargetHere">

<ItemGroup>
    <FilesWritten Include="@(EndFiles)" />
    <FilesWritten Remove="@(StartFiles)"/>
</ItemGroup>

<!-- Now FilesWritten contains the difference between EndFiles & StartFiles -->

</Target>

简而言之,我不确定是否有一个不涉及自定义任务或自定义记录器的好解决方案:(。

Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

答案 1 :(得分:12)

如果您使用的是MSBuild task,那么您可以获取使用TargetOutputs输出构建的文件。这是一个例子

<MSBuild Projects="YourProject.csproj">
      <Output ItemName="YourProjectOutputs" TaskParameter="TargetOutputs"/>
</MSBuild>

因此,在构建 YourProject.csproj 的情况下,创建的文件将放在 YourProjectOutputs 项目中。

前段时间我创建了一个博客文章,详细讨论了这个问题,MSBuild: How to Get All Generated Outputs

Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

答案 2 :(得分:3)

查看我以前的博客文章MSBuild: Find Many Project References。在那篇文章中,我描述了如何创建一个可以提取Reference ItemGroup值的MSBuild文件。在您的情况下,只需将我创建的目标替换为从OutputPath中找到的所有文件中填充项目的目标。如果您希望我对此进行扩展,请告诉我。

答案 3 :(得分:0)

我们在这种情况下的战斗是每个构建创建一个“部署”目录(您可以根据需要调用它)。

deploy目录只包含实际应用程序所需的那些可执行文件和dll(即测试dll不会放在那里)。每个项目都需要将其“可部署”内容放入该目录(我们甚至添加子目录(即Web,服务等)。)

它复制了一些位,但它允许您在需要时访问构建中的所有dll。