如何在构建sln时使MSBuild构建csproj中指定的自定义目标?

7
我遇到了一个与MSBuild有关的问题,我自己无法解决它。因此,我依赖社区的智慧。
我有一个包含几个项目的解决方案文件,这些项目依赖于同一解决方案中的其他项目。我想在其中一个项目的csproj文件中添加自定义目标,并从命令行构建它。这将允许我制作该项目的所有必要输出二进制文件,以便在构建自定义目标期间进行进一步处理。但主要问题是我无法弄清楚如何做到这一点,即使通过谷歌搜索也没有帮助。
为了简化事情,我决定创建一个新的C#控制台项目,向该项目的文件中添加一个简单的自定义目标,然后尝试构建它。但仍然没有成功!以下是我迄今为止所做的:
  1. Created a solution app with a default console project coreapp. This gaves me at least two files:

    • app.sln
    • coreapp\coreapp.csproj
  2. Modified coreapp.csproj with addition of my custom target inside of the Project tag

    <Target Name="SampleTarget">
      <Message Text="This is a SampleTarget" />
    </Target>
    
  3. Run on the command line the following command

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

    or even

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

结果

抱歉,遇到了错误:

MSB4057:项目中不存在目标“coreapp.csproj:SampleTarget”。

我怀疑MSBuild认为我的意图与实际不同......

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

问题是如何在简化的情况下使用解决方案文件构建SampleTarget,因为它可能包含依赖于包含此SampleTarget目标的项目?

非常感谢任何形式的帮助或进一步调查的方向!


这个有帮助吗?https://dev59.com/1XA75IYBdhLWcg3wP2gg - Syed Waqas
2个回答

5

不必在项目文件中插入自定义目标,您可以尝试创建一个新的独立的 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

1

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


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