MSBuild:从命令行指定目标

MSBuild:从命令行指定目标,msbuild,Msbuild,我有一个MSBuild任务,用于在解决方案文件中生成特定项目。它看起来像这样: <Target Name="Baz"> <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" /> </Target> <!-- Build the 'bar' project only --> <Target Name="Baz"> <MSBuild Projects="Foo.sln"

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

<Target Name="Baz">
  <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" />
</Target>
<!-- 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>

在命令行中,我可以将我的
BuildCmd
设置为
Rebuild
Clean
,并按预期工作:

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

但是我应该用什么词来设置
BuildCmd
来进行构建呢?我尝试了
Build
Compile
并将其保留为空或未定义,但我总是得到一个错误

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

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

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


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

来自:

/目标:目标

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

我知道您希望使用特定命令构建目标:build、Clean等

我会这样做的

创建一个属性以接收生成命令(如果未指定默认值为build)

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

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

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

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

关键是将BuildCmd属性条件化

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

:$(BuildCmd)
这样,如果设置了“清理”或“重建”,则会添加冒号。如果没有添加任何内容,BuildCmd将为空,默认为构建目标


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

该.sln文件不使用MSBuild语法。问题是指定如何处理每个目标:生成、重新生成、清除。部分问题在于,命令行中使用术语“target”来指定msbuild文件中的目标,并再次指定要在解决方案文件中生成的项目(命名空间冲突)。我正在尝试仅在Foo.sln中生成特定项目。“只需确保解决方案或项目文件中存在该目标。”。如何将自定义目标添加到sln文件中?事实证明,我不是唯一遇到问题的人,请参见此处的J.Elster评论表:此解决方案不适用于VS10。你对此有任何更新吗?
<!-- 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>
 <Target Name="Baz">
   <PropertyGroup>
     <BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd>
   </PropertyGroup>
   <MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" />
 </Target>