2009-06-26 23 views
15

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

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

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

,但我的项目是一个大的构建的一部分,并且所有输出到一个共同的位置,我希望能够exculde DLL和内容那不属于。

任何想法?

回答

23

再次看到您的评论后,我意识到我误解了您真正需要的东西。这是你手上有趣的问题。

如果你不介意编辑项目文件本身,你可能会得到漂亮的关闭到你想要的。有一个项目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,要么在构建和结束时再一次查看添加的内容。比方说,你把原来的文件到一个项目的开始文件,并在构建结束把所有的文件放到一个名为项EndFiles你可以在做:

<Target Name="SomeTargetHere"> 

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

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

</Target> 

总之我不知道是否有一个很好的解决方案,不涉及任何自定义任务或自定义记录仪:(

赛义德·易卜拉欣·哈希米

的My Book:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

感谢您的详细解答。 – 2009-07-07 13:20:09

11

如果您使用的是MSBuild task,那么您可以获取使用TargetOutputs输出生成的文件。这是所以当YourProject.csproj是建立了创建将被放置在YourProjectOutputs项目里面的文件该情况的一个例子

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

前段时间我创建了一个博客条目,详细介绍了这个,MSBuild: How to Get All Generated Outputs

赛义德·易卜拉欣·哈希米

的My Book:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

感谢您的建议,问题是TargetOutputs只包含输出程序集,并且GetOutputs任务包括输出目录中的所有内容,即使msbuild项目未创建/复制它。 – 2009-06-30 14:36:23

3

看看我以前的博客条目MSBuild: Find Many Project References。在那篇文章中,我将描述如何创建一个可以提取Reference ItemGroup的值的MSBuild文件。在你的情况下,只需将我创建的目标替换为从OutputPath中找到的所有文件填充项目的目标。让我知道你是否希望我扩大这一点。

0

我们做什么战斗是这种情景每个版本创建“部署”主任Ÿ(你可以称它为你想要的)。

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

它重复了一些位,但它可以让你访问所有的dll如果需要,建立。

+0

我想有一个共同的“部署”目录,但能够确定哪些文件是由每个项目创建的 – 2009-07-07 13:19:37