MSBuild:在Visual Studio中从解决方案构建后运行目标

10
我们有一个包含多个项目的解决方案,并且需要在所有代码编译完成后运行一个工具。该工具必须以所有从解决方案构建的.dll和.exe文件作为输入(因此对于增量构建,仅提供刚刚重建的二进制文件不足够),并且所有这些二进制文件必须是最新的。
目前我们使用一个MSBuild .proj文件来完成这项任务,我们从命令行中运行该文件,其中包括所有项目,并使用MSBuild的Output元素查找解决方案中二进制文件的路径。
这种方法存在两个问题,使得它不完全符合我们的需求。该工具不需要实际运行在所有项目上,只需要在其中一些项目上运行即可。而且我们需要能够在Visual Studio中进行构建。
看起来我需要在某些项目的.csproj文件中定义一些东西,比如“在我上面运行该工具”,以收集这些项目的路径,并在这些路径上运行该工具。
但我不知道怎么做。当我从Visual Studio中进行构建时,似乎无法在项目构建之间共享状态,并且似乎没有钩子可以在解决方案构建之后运行。
在命令行中,有before.*.sln.targets和after.*.sln.targets,但这些无法在Visual Studio中使用。
看起来我想要的东西非常简单,我只需要一个工具在构建后自动查看解决方案的二进制文件,所以我认为这不应该是不可能的。但是从文档中我找不到如何做到这一点。我对MSBuild很陌生,所以我可能错过了一些显而易见的东西。

您可以将空项目添加到解决方案中,并在添加的项目中添加对其他项目的依赖项,以及定义后期构建事件。 - Nikerboker
1个回答

8

Msbuild具有可扩展性目标。这些空目标可用于项目文件中。请参见以下文章和构建过程可扩展性点的章节

例如,如果您想在构建完成后将一些相关文件与程序集一起部署,覆盖AfterBuild目标将是正确的方法,如下所示。

我更改了他们的示例,使用exec任务如下。此示例在构建完成后使用YourCustomTasks.exe处理二进制文件。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- Properties and items are deleted for clarity -->
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    <ItemGroup>
        <Binaries Include="*.dll;*.exe"/>
    </ItemGroup>
    <Target Name="AfterBuild">
        <Exec Command="YourCustomTasks.exe %(Binaries.Identity)" />
    </Target>
</Project>

如果你想要在解决方案后使目标起作用,请使用以下答案

为了执行解决方案范围的Before和After目标,您需要创建两个MSBuild项目文件,分别命名为“after.[SolutionName].sln.targets”和“before.[SolutionName].sln.targets”,放置在与您的解决方案同一文件夹中。


但是这将针对每个构建的项目运行一次,而不是在所有项目构建完成后运行一次。 - GalaxyInvader
@GalaxyInvader 更新了我的答案。但是在Visual Studio中似乎不起作用。但你可以尝试其他解决方案级别的目标,看看它们是否适用于你。 - Atilla Ozgur
1
关于您的编辑:我在我的帖子中明确提到,在Visual Studio内部无法使用before/after.*.sln.targets,这也在您链接的答案的评论中说明了。 - GalaxyInvader
@GalaxyInvader 我错过了那部分。 - Atilla Ozgur
@AtillaOzgur,你可能没有解决他的问题,但今天你解决了我的问题,谢谢。 - Ed Smilovici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接