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

时间:2011-12-06 17:27:15

标签: msbuild msbuild-task

我正面临MSBuild的问题我自己无法克服它。因此,我依靠社区的智慧。

我遇到麻烦的实际情况

我有一个soluiton文件,其中包含几个与同一解决方案中的其他项目具有依赖关系的项目。我想将一个自定义目标附加到项目的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

  4. 结果

    没有运气,面对错误

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

    我怀疑MSBuild认为某些内容与我想要的内容有根本的不同......

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

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

    我很乐意为进一步调查提供任何帮助或帮助!

2 个答案:

答案 0 :(得分:3)

您可以尝试创建一个新的独立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 :(得分:0)

一种选择是通过覆盖相应的DependsOn属性将SampleTarget绑定到标准Build目标。在这种情况下,你可以告诉BeforeBuild它DependsOn SampleTarget或你用AfterBuild做同样的事情。这将确保MSBuild在指示的标准目标之前处理您的目标。