MSBuild:从命令行指定目标

时间:2008-10-24 00:07:39

标签: msbuild

我有一个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:”。

5 个答案:

答案 0 :(得分:23)

我知道您希望使用特定命令构建目标:Build,Clean等。

我就是这样做的。

创建一个属性以接收构建命令,当未指定默认为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

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

答案 1 :(得分:6)

来自:http://msdn.microsoft.com/en-us/library/ms164311.aspx

/目标:目标

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

答案 2 :(得分:2)

键是条件化BuildCmd属性。

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

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

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

答案 3 :(得分:0)

使用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>

答案 4 :(得分:-8)

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