MSBuild: указание цели из командной строки - PullRequest
23 голосов
/ 24 октября 2008

У меня есть задача 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 = Очистить 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:" не существует в проекте.

Ответы [ 5 ]

23 голосов
/ 24 октября 2008

Я понял, что вы хотите построить цель с помощью определенной команды: Build, Clean и т. Д.

Вот как бы я это сделал.

Создайте свойство для получения вашей команды сборки, если не указано, по умолчанию Build

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

После этого создайте цель, которая запустит MSBuild с указанной целью в параметре:

<Target Name="Stackoverflow">
  <MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" />
</Target>

Затем вызовите файл MSBuild с параметром target и BuildCmd следующим образом:

msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean

Просто убедитесь, что цель существует в файле решения или проекта.

6 голосов
/ 24 октября 2008

От: http://msdn.microsoft.com/en-us/library/ms164311.aspx

/ целевые: цели

Строит эти цели в этом проекте. Используйте точку с запятой или запятую для разделения нескольких целей или укажите каждую цель отдельно. / т также приемлемо. Например: / целевые: ресурсы; Compile

2 голосов
/ 27 июля 2012

Ключ является условным свойством свойства BuildCmd.

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

Таким образом, если установлены параметры Очистить или Перестроить, добавляется двоеточие. Если ничего не добавлено, BuildCmd будет просто пустым, по умолчанию используется цель Build.

Примечание - группа свойств должна находиться в целевом объекте, иначе она будет переопределена, если вы укажете ее в командной строке.

0 голосов
/ 25 октября 2008

Используя шаблон 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>
0 голосов
/ 24 октября 2008

Просто отредактируйте файл sln и узнайте - MSBuild - это действительно простой синтаксис, просто ищите цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...