我有一个MSBuild任务来在解决方案文件中构建特定项目。它看起来像这样:
<Target Name="Baz">
<MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" />
</Target>
在命令行中,我可以将BuildCmd
设置为Rebuild
或Clean
,然后按预期工作:
msbuild / target:Baz / property:BuildCmd =重建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 =编译MyMsbuildFile.xml Foo.sln:错误MSB4057:项目中不存在目标“bar:Compile”。
msbuild / target:Baz MyMsbuildFile.xml Foo.sln:错误MSB4057:项目中不存在目标“bar:”。
答案 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是一种非常简单的语法,只需查找目标。