24

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

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

从命令行,我可以将 my 设置BuildCmdRebuildorClean并且它按预期工作:

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=Compile MyMsbuildFile.xml Foo.sln:错误 MSB4057:项目中不存在目标“bar:Compile”。

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

4

5 回答 5

24

我知道您想使用特定命令构建目标:构建、清理等。

我就是这样做的。

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

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

于 2008-10-24T14:21:24.107 回答
7

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

/目标:目标

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

于 2008-10-24T05:07:41.460 回答
2

关键是条件化 BuildCmd 属性。

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

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

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

于 2012-07-27T13:44:44.707 回答
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>
于 2008-10-24T21:04:31.017 回答
-9

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

于 2008-10-24T00:45:19.943 回答