указать файл проекта решения с помощью msbuild

116

Мне нужна командная строка для создания конкретного проекта решения с использованием msbuild, как мы делаем с devenv.com. В devenv.com мы можем указать проект решения, используя следующую командную строку

devenv.com /Build Release|x86 test.sln /project "testproject"

Используя приведенную выше командную строку, я могу создать тестовый проект в test.sln, используя devenv.com. Какова командная строка для msbuild для того же решения.

Спасибо

сомнения
источник
По какой причине вы не просто передаете сам тестовый проект в msbuild?
Марк Смит
2
Поскольку я больше не могу редактировать свой комментарий. Я имею в виду прямую ссылку на проект, а не на решение. «msbuild testproject / p: Configuration = Release / p: Platform = x86»
Марк Смит,
в разное время мне приходится создавать разные проекты. используя devenv.com, это легко, указав проект этого решения
tjdoubts
Если это единственная проблема, у вас должна быть возможность использовать msbuild для сборки необходимых проектов в нужное время. У вас уже есть разные команды, которые вы выполняете в разное время в решении, так почему бы просто не ссылаться на проекты в нужное время с помощью разных команд msbuild? Если ваши проекты настроены правильно, они должны вычислить все свои ссылки без использования файла sln.
Марк Смит

Ответы:

202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Обратите внимание на то, что присвоено /t в решении имя проекта, оно может отличаться от имени файла проекта.

Кроме того, как указано в разделе Практическое руководство. Создание конкретных целей в решениях с помощью MSBuild.exe :

Если название проекта содержит любой из символов %, $, @, ;, ., (, ), или 'заменить их с _в указанном имени цели.

Вы также можете создать сразу несколько проектов:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Чтобы восстановить или очистить, измените /t:projectна /t:project:cleanили/t:project:rebuild

Истон Л.
источник
99
Одно важное замечание: если в вашем проекте есть расширение "." в названии, вам нужно будет заменить его на '_' при указании с / t
Ватусимото
4
@easton Для создания нескольких проектов в моем msbuild был синтаксис, чтобы повторять /tпараметр для каждого проекта, который нужно построить:msbuild test.sln /t:project /t:project2
Филипп
46
Кроме того, если вы используете папку решения, вы должны поставить перед именем проекта имя папки и косую черту. Как и в @Watusimoto, упомянутом выше, если у вас есть точки (.) В имени, вы должны заменить их символами подчеркивания (_). Я в конечном итоге с чем - то вроде этого: /t:SlnFolder\My_Project_name.
Travis Parks
28
@TravisParks: Также стоит упомянуть, что «папка решения» относится не к папке файловой системы, а к папке в представлении обозревателя решений.
joshbodily
4
Мне также пришлось заменить '(' и ')' на '_' в имени папки (проекты, созданные GYP). Думаю, все специальные символы заменены подчеркиванием.
Maxime Viargues
15

MSBuild на самом деле работает за счет использования проектов, а не решения. Решение используется только для внутреннего синтаксического анализа во временный файл проекта в MSBuild. Вы должны иметь возможность просто создать интересующий проект непосредственно через MSBuild, выполнив следующую команду.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Я знаю, что есть одна серьезная проблема, с которой вы можете столкнуться при использовании проекта напрямую вместо решения: если вы используете решение для выражения зависимостей между проектами, вместо добавления ссылок на проект и разрешения системе сборки автоматически определять зависимости. .

Если вы обеспечиваете порядок сборки с помощью файла sln, я рекомендую работать с этими зависимостями непосредственно в файлах proj и удалять их из файла sln. Это позволит вам напрямую вызывать любой proj-файл из MSBuild, и все проекты будут построены независимо без какой-либо дополнительной работы. Вам действительно следует рассматривать файл sln как группу проектов, чтобы упростить работу в Visual Studio, а не как входные данные для сборки.

Марк Смит
источник
4
Укажите, как можно принудительно установить порядок сборки из файлов proj. Спасибо.
ProgramCpp
4
Вот еще одна проблема с прямым использованием имени проекта. Например, в вашем решении 5 проектов. В некоторых проектах есть конфигурация DebugPro, а в других ее нет. Если вы создаете проект с конфигурацией, в которой все проекты имеют все файлы, но только файл решения, знайте, какую конфигурацию проекта использовать для каждого проекта, если вы выбрали конфигурацию решения DebugPro.
Alex
@ProgramCpp Когда вы добавляете ссылки из одного проекта в другой, он автоматически определяет, что проект, на который указывает ссылка, необходимо сначала построить.
jpaugh
Еще одним недостатком этого подхода является то, что относительный путь в проекте разрешается относительно файла решения. Как только вы создадите проект, относительный путь изменится. Вывод может быть где-то еще, и модульные тесты могут искать неправильные каталоги.
Tomas Kubes
Проблемы также могут возникнуть, если вы используете переменные решения в конфигурации проекта, например $ (SolutionDir)
Alex Che
8

Размещение информации для будущих соискателей

Добавьте следующее в сценарий сборки и запустите его один раз. Это сгенерирует точные цели и другую информацию, которую действительно будет использовать msbuild.

Пример: если у вас есть .имя проекта или папки, которые будут ожидать msbuild _вместо ..

set MSBuildEmitSolution=1

После получения информации обновите скрипт сборки, указав необходимые данные.

Freshprinze
источник
6
"Если у вас есть". в имени проекта или папок msbuild будет ожидать '_' вместо '.'. `
dhcgn
2

Для этого вам нужно знать, какое целевое имя проекта проекта, а не обязательно имя проекта.

Один из способов узнать это - использовать MSBuild для вашего SLN с заданными параметрами после установки специальной переменной среды, вызываемой MSBuildEmitSolutionдля значения 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Недавно мне пришлось сделать это из-за очень специфического имени цели во вложенных каталогах. Итак, из моего сгенерированного файлаmy_stuff.sln.metaproj я нашел эту строку:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Это означает, что в конечном итоге используемая командная строка выглядит так:

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64
kayleeFrye_onDeck
источник
2
Это было то, что мне было нужно. Подсказка, если вы не хотите запускать это: ваша цель - это структура папок из текущего пути к вашему файлу проекта, за вычетом расширения файла проекта ( .csprojв моем случае). Я <3 ТАК!
Нет возврата, нет возврата
1

Чтобы добавить дополнительную информацию, выполнение msbuild в папке проекта по умолчанию создаст файл проекта, поскольку он единственный там.

>msbuild

Есть много вариантов использования msbuild таким образом. Вы можете указать файл proj напрямую.

>msbuild helloworld.csproj -t:Build.

Ознакомьтесь с документацией msbuild, чтобы узнать об использовании, требованиях к файлам proj, а также о преимуществах сборки проекта вместо решения.

Документация по MS MSBuild

Как упоминал mark-smith выше, у такого строительства есть свои преимущества.

CJ
источник