MSBuild: указание цели из командной строки

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

24.10.2008 00:07:38
5 ОТВЕТОВ
РЕШЕНИЕ

Я понял, что вы хотите построить цель с помощью определенной команды: 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

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

24
16.05.2016 17:18:32
Я пытаюсь построить только определенный проект в Foo.sln.
Derek 24.10.2008 18:13:40
Msgstr "Просто убедитесь, что цель существует в файле решения или проекта." Как добавить пользовательскую цель в файл sln?
Piotr Owsiak 3.11.2010 12:22:52
Оказывается, я не единственный, кто столкнулся с проблемой, см. Форму комментария Дж. Эльстера здесь: msdn.microsoft.com/en-us/library/ms164311.aspx
Piotr Owsiak 3.11.2010 12:38:26

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

-9
24.10.2008 00:45:19
Файл .sln не имеет синтаксиса MSBuild.
Derek 24.10.2008 00:53:44

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

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

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

6
24.10.2008 05:07:41
Проблема в том, чтобы указать, что делать с каждой целью: построить, перестроить, очистить. Частично проблема заключается в том, что термин «цель» используется в командной строке, чтобы указать цель в файле msbuild, и снова указать, какой проект построить в файле решения (коллизия пространства имен).
Derek 24.10.2008 18:09:51

Используя шаблон 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.10.2008 21:04:31
Это решение не работает для VS10. Есть ли у вас какие-либо обновления по этому поводу?
Mike 9.11.2012 13:46:02

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

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

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

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

2
27.07.2012 13:44:44