代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

从MSBuild项目获取输出文件

  •  15
  • Scott Weinstein  · 技术社区  · 17 年前

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

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

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

    但是我的项目是一个更大构建的一部分,所有的输出都到一个公共的位置,我希望能够导出DLL和不属于它们的内容。

    有什么想法吗?

    4 回复  |  直到 17 年前
        1
  •  24
  •   Sayed Ibrahim Hashimi    17 年前

    再次看了你的评论后,我意识到我没有说出你真正需要的东西。这是你手头上的一个有趣的问题。

    如果您不介意编辑项目文件本身,您可能会变得非常漂亮 你想要什么。有一个项目 文件写入 后建

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

    这种方法也存在一些问题

    • 您必须编辑项目文件本身
    • obj )和输出目录(即。 箱子 )
    • 如果存在生成自定义项,则不需要写入此项

    您可能认为您可以用 MSBuild: Find Many Project References

    通过使用FindUnderPath任务仅获取放置在中的文件,可以克服第二个限制 输出路径

    您可以做但并不真正可靠的事情是在构建开始时检查OutputPath,然后在构建结束时再次检查并查看添加的内容。假设您将原始文件放入一个项目StartFiles,并在构建结束时将所有文件放入一个名为EndFiles的项目,您可以执行以下操作:

    <Target Name="SomeTargetHere">
    
    <ItemGroup>
        <FilesWritten Include="@(EndFiles)" />
        <FilesWritten Remove="@(StartFiles)"/>
    </ItemGroup>
    
    <!-- Now FilesWritten contains the difference between EndFiles & StartFiles -->
    
    </Target>
    

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

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

        2
  •  12
  •   Sayed Ibrahim Hashimi    17 年前

    如果您正在使用 MSBuild task 然后,您可以获得使用targetOutput输出生成的文件。这里有一个例子

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

    YourProject.csproj 创建的文件将放置在 您的项目输出

    我在不久前创建了一篇博客文章,详细介绍了这一点, MSBuild: How to Get All Generated Outputs .

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

        3
  •  3
  •   Bill the Lizard    13 年前