【问题标题】:MsBuild PostBuild targetsMsBuild PostBuild 目标
【发布时间】:2018-08-07 20:07:41
【问题描述】:

我已将AfterBuild 目标添加到 Visual Studio 项目中,该项目是包含多个 Visual Studio 项目的解决方案的一部分。

示例解决方案设置

例子.sln

  • ExampleProj.csproj

  • ExampleProj.Test.csproj

目标示例:

  <Target Name="PostBuildScript" AfterTargets="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <PropertyGroup>
      <BuildCommand>"SomeApplication.exe")</BuildCommand>
    </PropertyGroup>
    <Exec Command="$(BuildCommand)" ConsoleToMSBuild="true" LogStandardErrorAsError="true" WorkingDirectory="$(ProjectDir)" />
  </Target>

我希望此目标仅在构建解决方案中的所有 Visual Studio 项目后执行

有没有办法做到这一点。

注意:我需要在使用 dotnet build 以及 Visual Studio 中的构建命令时保持相同的行为。

【问题讨论】:

  • 你有什么问题?
  • 目标运行测试(除其他外),我发现目标有时在测试项目构建它的程序集之前运行,因此测试失败。注意:我只是将目标添加到主项目中,这样某些命令只会出现一次。我试图避免将其他目标添加到其他项目,因为这样跨项目的目标执行顺序变得难以管理。
  • 我发现在解决方案中相互引用项目的最佳方式是使用项目引用。这样,项目本身决定了构建顺序,而不是解决方案文件本身。如果我是你,我会将那个后期构建目标附加到总是最后构建的项目上(如果你有的话)。

标签: c# msbuild visual-studio-2017 csproj msbuild-target


【解决方案1】:

我希望仅在解决方案中的所有 Visual Studio 项目都已构建后才执行此目标

根据文档MSBuild Extending The Solution Build,您可以在与您的解决方案相同的文件夹中创建一个名为after.&lt;SolutionName&gt;.sln.targets 的MSBuild 项目文件。

作为测试,我将其添加到我的 After.Solution.sln.targets 文件中(使用香蕉而不是 SomeApplication.exe),并将此文件设置在与我的解决方案文件 .sln 相同的文件夹中:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="PostBuildScript" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'">
    <Message Text="*** BEGIN BANANA ***" Importance="high" />
    <Message Text=" _                                          " Importance="high" />
    <Message Text="//\                                         " Importance="high" />
    <Message Text="V  \                                        " Importance="high" />
    <Message Text=" \  \_                                      " Importance="high" />
    <Message Text="  \,'.`-.                                   " Importance="high" />
    <Message Text="   |\ `. `.                                 " Importance="high" />
    <Message Text="   ( \  `. `-.                        _,.-:\" Importance="high" />
    <Message Text="    \ \   `.  `-._             __..--' ,-';/" Importance="high" />
    <Message Text="     \ `.   `-.   `-..___..---'   _.--' ,'/ " Importance="high" />
    <Message Text="      `. `.    `-._        __..--'    ,' /  " Importance="high" />
    <Message Text="        `. `-_     ``--..''       _.-' ,'   " Importance="high" />
    <Message Text="          `-_ `-.___        __,--'   ,'     " Importance="high" />
    <Message Text="             `-.__  `----'''    __.-'       " Importance="high" />
    <Message Text="                  `--..____..--'            " Importance="high" />
    <Message Text="*** END BANANA ***"  Importance="high" />
  </Target>

</Project>

然后我用dotnet build 命令构建它:

dotnet build "xxxx\TestSolutionTarget.sln" --configuration Release --verbosity n

此目标在解决方案中的所有 Visual Studio 项目都已构建之后执行。

或者,您还可以创建单独的空项目,引用所有项目的子集并将此目标添加到空项目中。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。
  • @Ibz,随时欢迎您。 SO论坛好像有问题,图片无法正确加载。所以我在这里分享一下onedrive的测试结果:1drv.ms/u/s!Ai1sp_yvodHf2VjaF3gem2iYWd1X
  • 虽然上述方法在命令行中有效,但我发现 after.&lt;SolutionName&gt;.sln.targets 似乎被 Visual Studio 2017 忽略,并且香蕉未显示在输出中。请帮忙。
  • @Ibz,是的,这个目标似乎只由命令行触发。在引用的文档中,我发现 如果您是从命令构建解决方案文件,那么您可能会对这项技术感兴趣。。因此,如果您仍想在 Visual Studio 输出窗口中显示香蕉,您可以尝试在我的回答中使用第二种方法:创建单独的空项目,引用所有项目的子集并将此目标添加到空项目.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多