【问题标题】:How make MSBuild build custom target specified in csproj building sln?如何在 csproj 构建 sln 中指定 MSBuild 构建自定义目标?
【发布时间】:2011-12-06 17:27:14
【问题描述】:

我遇到了MSBuild 的问题,我自己无法克服。因此,我依靠社区的智慧。

我遇到麻烦的真实情况

我有一个解决方案文件,其中包含多个项目,这些项目依赖于同一解决方案中的其他项目。我想将自定义目标附加到项目的 csproj 文件之一并从命令行构建它。它将允许我为该项目制作所有必要的输出二进制文件,以便在构建自定义目标期间进行进一步处理。但主要是我不知道该怎么做,谷歌搜索也无济于事。

简化

为了让事情变得更简单,我决定创建一个新的 C# 控制台项目,将一个简单的自定义目标添加到项目的文件中并尝试构建它。还是没有成功!这是我到目前为止所做的:

  1. 使用默认控制台项目 coreapp 创建了一个解决方案应用。这给了我至少两个文件:

    • app.sln
    • coreapp\coreapp.csproj
  2. 修改 coreapp.csproj 并在 Project 标签内添加我的自定义目标

    <Target Name="SampleTarget">
      <Message Text="This is a SampleTarget" />
    </Target>
    
  3. 在命令行上运行以下命令

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp:SampleTarget

    甚至

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp.csproj:SampleTarget

结果

不走运,面临错误

MSB4057: The target "coreapp.csproj:SampleTarget" does not exist in the project.

我怀疑MSBuild 的想法与我希望它的想法完全不同...

除此之外,我还尝试在同一命令行上设置环境变量 MSBuildEmitSolution=1 以强制 msbuild 转储它在处理解决方案时创建的临时解决方案文件。在这个文件中,确实没有这样的目标。但是我想这不是原因,因为我要求 msbuild 在目标 SampleTarget 真正所在的位置构建 coreapp.proj。

问题是如何在这个简化的场景中使用解决方案文件构建 SampleTarget,因为它可能包含包含此 SampleTarget 目标的项目的依赖项?

对于进一步调查的任何形式的帮助或建议,我将不胜感激!

【问题讨论】:

标签: msbuild msbuild-task


【解决方案1】:

您可以尝试创建一个新的独立 msbuild 文件,而不是在项目文件中插入自定义目标,该文件将:

  • 构建解决方案文件(用于构建项目)
  • 定义你的额外目标

例如,称之为 app-custom-Debug.msbuild 。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WorkingFolder>$(MSBuildProjectDirectory)</WorkingFolder>
    <Configuration>Debug</Configuration>
    <SolutionFile>app.sln</SolutionFile>
  </PropertyGroup>

  <Target Name="Build" DependsOnTargets="Compile" />  

  <Target Name="Compile">
    <Message Text="=== COMPILING $(Configuration) configuration ===" />
    <MSBuild Projects="$(SolutionFile)"
             Properties="Configuration=$(Configuration)" />
  </Target>

  <Target Name="SampleTarget">
    <Message Text="This is a SampleTarget" />
  </Target>

</Project>

然后你执行:

msbuild.exe app-custom-Debug.msbuild /t:SampleTarget

【讨论】:

    【解决方案2】:

    一种选择是通过覆盖适当的 DependsOn 属性将 SampleTarget 绑定到标准构建目标。在这种情况下,您可以告诉 BeforeBuild 它依赖于 SampleTarget,或者您对 AfterBuild 执行相同的操作。这将确保 MSBuild 在指定的标准目标之前处理您的目标。

    【讨论】: