【问题标题】:MSBuild: Specifying a target from the command lineMSBuild:从命令行指定目标
【发布时间】:2023-04-08 22:19:01
【问题描述】:

我有一个 MSBuild 任务来在解决方案文件中构建特定项目。它看起来像这样:

<Target Name="Baz">
  <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" />
</Target>

从命令行,我可以将我的BuildCmd 设置为RebuildClean,它可以按预期工作:

msbuild /target:Baz /property:BuildCmd=重建 MyMsbuildFile.xml msbuild /target:Baz /property:BuildCmd=Clean MyMsbuildFile.xml

但是我应该使用什么词来设置BuildCmd 以便构建?我尝试了BuildCompile,只是将其留空或未定义,但总是出错。

msbuild /target:Baz /property:BuildCmd=Build MyMsbuildFile.xml Foo.sln : 错误 MSB4057: 项目中不存在目标“bar:Build”。

msbuild /target:Baz /property:BuildCmd=编译 MyMsbuildFile.xml Foo.sln : 错误 MSB4057: 项目中不存在目标“bar:Compile”。

msbuild /target:Baz MyMsbuildFile.xml Foo.sln : 错误 MSB4057: 项目中不存在目标“bar:”。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    我了解到您想使用特定命令构建目标:构建、清理等。

    这就是我的做法。

    创建一个属性来接收你的构建命令,如果没有指定默认为 Build

    <PropertyGroup>
      <BuildCmd Condition=" '$(BuildCmd)' == ''">Build</BuildCmd>
    </PropertyGroup>
    

    之后,使用参数中指定的目标创建将启动 MSBuild 的目标:

    <Target Name="Stackoverflow">
      <MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" />
    </Target>
    

    然后使用 target 和 BuildCmd 参数调用您的 MSBuild 文件,如下所示:

    msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean
    

    只要确保目标存在于解决方案或项目文件中即可。

    【讨论】:

    • 我正在尝试在 Foo.sln 中构建一个特定的项目。
    • "只要确保目标存在于解决方案或项目文件中。"。如何将自定义目标添加到 sln 文件?
    • 原来我不是唯一遇到问题的人,请在此处查看 J.Elster 的 cmets:msdn.microsoft.com/en-us/library/ms164311.aspx
    【解决方案2】:

    发件人:http://msdn.microsoft.com/en-us/library/ms164311.aspx

    /目标:目标

    在此项目中构建这些目标。使用分号或逗号分隔多个目标,或分别指定每个目标。 /t 也是可以接受的。例如: /target:资源;编译

    【讨论】:

    • 问题在于指定如何处理每个目标:构建、重建、清理。部分问题是在命令行中使用术语“目标”来指定 msbuild 文件中的目标,并再次指定在解决方案文件中构建哪个项目(命名空间冲突)。
    【解决方案3】:

    关键是对 BuildCmd 属性进行条件化。

     <Target Name="Baz">
       <PropertyGroup>
         <BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd>
       </PropertyGroup>
       <MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" />
     </Target>
    

    这样,如果设置了 Clean 或 Rebuild,则会添加冒号。如果没有添加任何内容,BuildCmd 将只是空白,默认为 Build 目标。

    注意 - 属性组必须驻留在目标中,否则当您在命令行中指定它时它将被覆盖。

    【讨论】:

      【解决方案4】:

      使用 CheGueVerra 的模板,我想出了以下解决方案:

      <PropertyGroup>
          <ProjBuildCmd Condition="'$(BuildCmd)' != 'Build'">:$(BuildCmd)</ProjBuildCmd>
          <SolnBuildCmd Condition="'$(BuildCmd)' != 'Build'">$(BuildCmd)</SolnBuildCmd>
      </PropertyGroup>
      

      然后我不直接使用$(BuildCmd),而是使用$(ProjBuildCmd)$(SolnBuildCmd),如下所示:

      <!-- Build the 'bar' project only -->
      <Target Name="Baz">
        <MSBuild Projects="Foo.sln" Targets="bar$(ProjBuildCmd)" />
      </Target>
      
      <!-- Build the whole solution -->
      <Target Name="Baz2">
        <MSBuild Projects="Foo.sln" Targets="$(SolnBuildCmd)" />
      </Target>
      

      【讨论】:

      • 此解决方案不适用于 VS10。你有这方面的最新消息吗?
      【解决方案5】:

      只需自己编辑 sln 文件并找出 - MSBuild 是一种真正简单的语法,只需查找目标。

      【讨论】:

      • .sln 文件不是 MSBuild 语法。
      猜你喜欢
      • 2010-09-14
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多