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

Posted

技术标签:

【中文标题】MSBuild:从 Visual Studio 中构建解决方案后运行目标【英文标题】:MSBuild: Run target after solution builds from within Visual Studio 【发布时间】:2015-06-25 22:18:10 【问题描述】:

我们有一个包含多个项目的解决方案,并且需要在我们编译完所有代码后对我们编译的代码运行一个工具。该工具必须采用从解决方案构建的所有 .dll 和 .exe 文件作为输入(因此对于增量构建,仅提供刚刚重建的二进制文件是不够的),并且所有这些二进制文件必须达到日期。

现在我们使用从命令行运行的 MSBuild .proj 文件执行此操作,该文件包括所有项目并使用 MSBuild 的 Output 元素来查找解决方案中二进制文件的路径。

这有两个问题使这个解决方案不太适合我们的需要。该工具不需要在所有项目上实际运行,只需要在其中一些项目上运行。并且要求我们能够从 Visual Studio 中构建。

似乎我需要的是,在某些项目的 .csproj 文件中,定义“在我身上运行该工具”的内容,收集这些项目的路径,并在该路径集合上运行该工具。

但我不知道该怎么做。看起来当我从 Visual Studio 构建时,我无法在项目构建之间共享状态,并且看起来解决方案构建后没有挂钩。

在命令行中,有 before.*.sln.targets 和 after.*.sln.targets,但这些在 Visual Studio 中不起作用。

我想要的似乎可笑很简单,我只想要一个工具在构建后自动查看解决方案的二进制文件,所以我认为这应该不是不可能的。但我无法从文档中看到如何做到这一点。我是 MSBuild 的新手,所以我可能遗漏了一些明显的东西。

【问题讨论】:

您可以在解决方案中添加一个空项目,添加对其他项目的依赖关系,并在添加的项目中定义构建后事件。 【参考方案1】:

Msbuild 具有可扩展性目标。这些空目标可以在项目文件中使用。见following article and section Build process extensibility points。

例如,如果您想将一些相关文件与 程序集一旦构建,覆盖 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>

如果您希望您的目标在您的解决方案之后工作,请使用following answer。

要执行解决方案范围的 Before 和 After 目标,您需要创建 两个名为“after..sln.targets”的 MSBuild 项目文件和 “before..sln.targets”与您的文件夹位于同一文件夹中 解决方案。

【讨论】:

但是在所有个项目已经被构建之后,这将为每个项目运行一次,而不是一次建成。 @GalaxyInvader 更新了我的答案。但这似乎在 Visual Studio 中不起作用。但是您可以尝试其他解决方案级别的目标,看看它们是否适合您。 关于您的编辑:我在帖子中特别提到 before/after.*.sln.targets 在 Visual Studio 中不起作用,这在您链接到的答案的 cmets 中也有说明。 .... @GalaxyInvader 我错过了那部分。 @AtillaOzgur 你可能还没有解决他的问题,但今天你解决了我的问题,谢谢

以上是关于MSBuild:从 Visual Studio 中构建解决方案后运行目标的主要内容,如果未能解决你的问题,请参考以下文章

从Visual Studio构建定义UI添加MSBuild的引用搜索文件夹

使用 MSBuild 从 Visual Studio 2013 命令行发布 Clickonce 找不到 SignTool.exe

是否可以从 Mono 的命令行构建 MSBuild 文件(visual studio sln)?

MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板

如何只用visual c++编译器而不安装visual studio

msbuild 是不是知道它是从 Visual Studio 调用还是从命令行调用?