Чому я повинен використовувати MSBuild замість файлів Visual Studio Solution?


21

Ми використовуємо TeamCity для постійної інтеграції, і ми будуємо наші випуски через файл рішення (.sln). У минулому я використовував Makefiles для різних систем, але ніколи не створював msbuild (про що я чув, що це схожі на Makefiles + XML мешання). Я бачив багато публікацій про те, як використовувати msbuild безпосередньо замість файлів рішення, але я не бачу дуже чіткої відповіді, чому це робити.

Отже, навіщо нам турбуватися про перехід з файлів рішення на 'makefile' MSBuild? У нас є пара випусків, які відрізняються #define (featurized build), але здебільшого все працює.

Більша стурбованість полягає в тому, що зараз нам доведеться підтримувати дві системи при додаванні проектів / вихідного коду.

ОНОВЛЕННЯ:

Чи можуть люди пролити світло на життєвий цикл та взаємодія трьох наступних компонентів?

  1. Файл .sln Visual Studio
  2. Безліч файлів .csproj на рівні проекту (які я розумію в сценаріях msbuild "під")
  3. Нестандартний сценарій msbuild

Чи можна впевнено сказати, що .sln та .csproj споживаються / підтримуються, як зазвичай, із графічного інтерфейсу VisE Studio IDE, тоді як користувацький сценарій msbuild пишеться вручну та зазвичай споживає вже існуючий окремий .csproj "як є"? Ось один із способів я бачу зменшення дублювання / дублювання в обслуговуванні ...

Був би вдячний для цього з досвіду роботи інших людей


So, why should we bother migrating from solution files to an MSBuild 'makefile'?Спочатку ви повинні сказати, чому ви це навіть розглядаєте? Чи недостатньо файлу рішення?
jgauffin

3
Тому що це вважається кращою практикою. Для вашого останнього запитання; може бути, можливо, це не так. Ось чому це питання, щоб вивчити його для чіткішої відповіді.
DeepSpace101

2
Because it's reputed to be better practiceде?
jgauffin

3
Відокремлення IDE (sln-файлу) від збірки, безумовно, є гарним дизайном SE. Про це Джефф написав на codinghorror.com/blog/2007/10/…, якщо вам потрібні деталі. Крім того, приємно запускати тести і навіть упаковку програмного забезпечення (setup.exe або msi) як частину сценарію збирання випуску, а не просто компілювати збірку.
DeepSpace101

Відповіді:


16

Перший факт - це те, що файл рішення в значній мірі чарівно перетворюється на файл MSBuild, коли MSBuild виконує його. Це те, що відбувається, коли ви будуєте рішення у візуальній студії. Крім того, всі ці файли проекту - це лише файли msbuild, якими керує візуальна студія. Фактично, файли проектів обробляють більшість справжніх брудних робіт тут, незалежно від того, будуєте ви з рішень або будуєте з користувацького сценарію msbuild.

Ми також використовуємо TeamCity для створення та публікації програм, і ми зазвичай закінчуємо спеціальні сценарії msbuild для більшості проектів. Роль, яку грають ці сценарії - що не дуже легко з файлом рішення - полягає в упаковці проекту для розгортання або розповсюдження. Зазвичай ці сценарії обробляють деякі більш оперативні аспекти - наприклад, побудову веб-проекту в певній папці або копіювання в запущені конфігурації на відміну від конфігурацій розробки. Важкий підйом, як правило, обробляється в самих файлах проекту - сценарій збірки лише посилається на ті, які ми не намагаємось відтворити на цьому колесі. В цілому це чудово працює, і це насправді не дублюється код.


Таким чином, ви використовуєте sln + csproj у Visual Studio, а потім той самий, що і є csproj + користувальницький сценарій msbuild на сервері збирання? Я трохи уточнив питання. Спасибі!
DeepSpace101

Так, вони функціонально однакові.
Wyatt Barnett

15

Makefile для msbuild - це файл .sln (або файл vcproj).

Типовий командний рядок msbuild буде приблизно таким:

msbuild /p:Configuration=Release BigProject.sln

Сенс використання msbuild полягає в тому, щоб ви могли сценаріювати та автоматизувати процес збирання. Незалежно від того, знали ви це чи ні, TeamCity весь час використовує msbuild.


Що ви думаєте про останню частину, про потенційне перекриття різних компонентів? Я (сподіваюсь!) Уточнив питання ще трохи ... thx
DeepSpace101

3

Дозвольте запропонувати взяти це питання.

Хоча ви, звичайно, можете просто використовувати .SLN файл як "процес збирання", сам файл насправді не є процесом збирання. Файл Solution насправді є лише частиною Visual Studio і використовується для розробки. Але Visual Studio є лише частиною процесу збирання та випуску. Ви не можете розраховувати на рішення для управління своєю збіркою, і рішення, безумовно, не пропонують масштабовану ситуацію збірки.

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

Встановлення процесу збирання вимагає вкладення коштів, але в деяких випадках інвестиція потрібна. Ось кілька факторів, які сприяють процесу складання msbs:

  • У вашому продукті є кілька команд (багатофункціональних або інших), які працюють в одному проекті команди
  • У вашій організації є лише один командний проект (це стосується 99% традиційних магазинів, навіть тих, хто має більше 200 розробників)
  • У вас є більше 20 проектів, які потрібно будувати, деякі з яких залежать від інших і підтримуються різними командами
  • У вашому продукті є декілька технологій .NET (C #, C ++, VB, F #, ASP.NET тощо) або навіть не -.NET технологій (Grunt, node, npm, Java тощо)
  • Ваш продукт має важку залежність або побудований на платформі важкої ваги. Як приклад SharePoint

Дозвольте навести приклад для розширення моєї останньої точки. Моя нинішня компанія займається розробкою SharePoint. Розробка SharePoint як мінімум вимагає встановлення SharePoint для виконання збірок на проектах SharePoint. Якщо говорити про легкий сервер збірки, вимагати, щоб сервер збірки мав встановити SharePoint, абсолютно недоцільно. SharePoint не тільки є звіром з високими вимогами, але це може мати серйозні наслідки для продуктивності, і збірки повинні бути якнайшвидшими та швидшими. Використання MSBuild дозволяє мені усунути цю вимогу установки на сервері збірки. Фактично, наш сервер збирання не має інших вимог до установки, крім рамки .NET (вимагається MSBuild) та Node.

В якості довідки я рекомендую переглянути цю книгу Саєда Ібрагіма Хашімі: http://www.amazon.com/Inside-Microsoft-Build-Engine-Foundation/dp/0735645248/ref=sr_1_fkmr0_1?ie=UTF8&qid=1412014650&sr= 8-1-fkmr0 & ключові слова = msbuild + надійний + збірка


1
Що стосується використання файлів msbuild замість sln-файлів, якщо не потрібно встановлювати SharePoint на сервері збирання? Це абсолютно не пов'язані між собою поняття. Файл рішення не має ніякої залежності від нічого. Крім того, ви можете, безумовно, розраховувати на файли рішень для управління вашою збіркою, оскільки це те, що наша компанія роками працює без проблем. Я думаю, що ви можете заплутати файли рішення та msbuild із самим інструментом msbuild, який також підтримує файли рішення. Ми не використовуємо візуальну студію для складання рішення в машині збирання.
julealgon

+1 за ваше пояснення "Ваша організація має лише один командний проект". Мене болить бачити людей, які використовують декілька командних проектів, як межі для таких речей, як "товари" або "проекти" в таких маленьких магазинах. Я застосував підхід до єдиного командного проекту і, сподіваюся, ніколи не доведеться повертатися назад.
JohnZaj

2

Це саме питання, яке я задав собі кілька місяців тому! У нас все було гарно налаштовано:

  • Файл рішення непогано знаходиться в корені сховищ
  • Створіть кроки, налаштовані в Teamcity, наприклад
    • Відновити пакети NuGet
    • Будувати рішення
    • Виконати тестові одиниці
    • Налаштування тестового середовища інтеграції
    • Запустити інтеграційні тести
    • Руйнуйте тестове середовище інтеграції
    • Створіть пакет розгортання
    • Побудувати сценарій міграції

І тоді, коли мова йде про відтворюваність, стало очевидним, що це низький бал. Коли ви дозволяєте TeamCity бути вашим сценарієм зборки, стає важко відтворювати подібні результати, надійні, на вашій власній машині розвитку.

Коли у вас є сценарій збірки, сценарій збірки знає все, що потрібно зробити, і має всі змінні. Коли ви використовуєте сервер CI в якості сценарію збирання, і виникає певна проблема, як, наприклад, невдача складного тесту або необхідність складання пакету розгортання вручну (згідно з моїм прикладом), вам потрібно вручну розібрати всі етапи збирання разом.

Отже, коротше , чому (MS) сценарій збірки? Тому що ви будете мати більш високі вимоги, коли справа стосується вашої збірки. Ймовірно, ви хочете запустити деякі тести і створити з цього артефакти. Можливо, ви хочете зробити розгортання. І коли все, що ви хочете, потрібно запускати, будь то на сервері збірки або на вашій машині, воно не може закінчуватися ніде, крім сценарію складання.


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