MSBuild:从命令行指定目标
我有一个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"
<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>