从MSBuild项目获取输出文件

Sco*_*ein 16 .net msbuild build-process

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

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

<CreateItem Include="$(OutputDir)**\*">
      <Output ItemName="AllOutputs" TaskParameter="Include"/>
</CreateItem>
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Say*_*imi 24

在再次查看你的评论之后,我意识到我错误地将你真正需要的东西用于表达.这是你手上的一个有趣问题.

如果您不介意编辑项目文件本身,您可能会非常接近您想要的.有一个项目FileWrites可以跟踪在构建过程中写出的所有文件.要开始使用此编辑项目文件以具有此AfterBuild目标

<Target Name="AfterBuild">
  <Message Text="FileWrites: @(FileWrites)" Importance="high"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

这种方法也存在一些问题

  • 您必须编辑项目文件本身
  • 这将包含写入中间输出目录(即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>
Run Code Online (Sandbox Code Playgroud)

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

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build


Say*_*imi 12

如果您正在使用MSBuild任务,那么您可以获取使用TargetOutputs输出构建的文件.这是一个例子

<MSBuild Projects="YourProject.csproj">
      <Output ItemName="YourProjectOutputs" TaskParameter="TargetOutputs"/>
</MSBuild>
Run Code Online (Sandbox Code Playgroud)

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

我前段时间创建了一个博客文章,更详细地讨论了这个问题,MSBuild:如何获取所有生成的输出.

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build