вказати файл проекту рішення за допомогою 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: Конфігурація = Випуск / p: Платформа = 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 Для побудови декількох проектів, sytax повинен був для мого msbuild повторити /tпараметр для кожного проекту, який потрібно створити:msbuild test.sln /t:project /t:project2
Philippe

46
Крім того, якщо ви використовуєте папку рішення, вам слід встановити назву проекту з назвою папки та косою рисою. Як і @Watusimoto, згаданий вище, якщо у вас є імена (.), Ви повинні замінити їх на підкреслення (_). Я в кінцевому підсумку з чим - щось на зразок цього: /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: Можливо, варто згадати, що "папка рішення" не стосується папки файлової системи, а папки у вікні Solution Explorer.
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.
Алекс

@ProgramCpp Коли ви додаєте посилання з одного проекту в інший, він автоматично з'ясовує, що спочатку проект повинен будуватися.
jpaugh

Ще одним недоліком такого підходу є те, що відносний шлях у проекті вирішується відносно файлу рішення. Після того як ви будуєте проект безпосередньо відносний шлях зміниться. Вихід може бути в іншому місці, і тестові одиниці можуть шукати неправильні каталоги.
Томаш

Проблеми можуть також з’явитися, якщо ви використовуєте змінні рішення в конфігурації проекту, як-от $ (SolutionDir)
Alex Che

8

Опублікування інформації як майбутніх шукачів

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

Наприклад: Якщо у вас є .ім'я проекту або папки, msbuild очікує _замість ..

set MSBuildEmitSolution=1

Після отримання інформації оновіть сценарій збірки з необхідними деталями.


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

2
Це було те, що мені було потрібно. Підказка, якщо ви не хочете запускати це: ваша мета - структура папки від поточного шляху до файлу проекту за вирахуванням розширення файлу проекту ( .csprojв моєму випадку). Я <3 ТАК!
Не повернено коштів, не повертається

1

Просто для додання додаткової інформації виконання msbuild у папці проекту за замовчуванням створить файл проекту, оскільки єдиний його є.

>msbuild

Існує багато варіантів використання msbuild таким чином. Ви можете вказати файл proj безпосередньо.

>msbuild helloworld.csproj -t:Build.

Перегляньте документацію msbuild на використання, вимоги до файлу proj, а також переваги побудови проекту замість рішення.

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

Існують переваги для побудови цього шляху, як згадував Марк-Сміт вище

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.