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

Gal*_*der 6 msbuild msbuild-task visual-studio

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

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

这有两个问题,使得该解决方案无法完全满足我们的需求。该工具不需要实际在所有项目上运行,只需在其中一些项目上运行即可。并且要求我们能够在Visual Studio中进行构建。

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

但是我看不到该怎么做。看起来当我从Visual Studio进行构建时,无法在项目构建之间共享状态,并且在解决方案构建之后似乎没有任何需要。

在命令行中,存在before。*。sln.targets和after。*。sln.targets,但它们在Visual Studio中不起作用。

似乎我想要的东西非常简单,我只想要一个工具在构建后自动查看解决方案的二进制文件,因此我认为这应该是不可能的。但是我从文档中看不到该怎么做。我是MSBuild的新手,所以我可能缺少明显的东西。

Ati*_*gur 9

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>
Run Code Online (Sandbox Code Playgroud)

如果您希望您的目标在解决方案后起作用,请使用以下答案

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