Различные директивы препроцессора в одной конфигурации решения

В одном из наших проектов мы адаптируем части нашего программного обеспечения к конкретным требованиям заказчика (например, логотипы и коробки). Каждый из клиентов получает свой собственный выпуск, который не включает специфику другого клиента. В настоящее время это реализуется с помощью директив препроцессора и отдельных конфигураций сборки для каждого из клиентов. Однако по мере того, как число проектов в решении увеличивается, становится сложно поддерживать эту конфигурацию (и это тоже становится грязным). По сути, все конфигурации представляют собой сборки "Release" с именами "Release X", "Release Y", "Release Z". Все они одинаковы, за исключением одной директивы препроцессора для различения между сборками клиента (например, для использования правильного значка приложения). Кроме того, конфигурации должны быть одинаковыми для обеспечения согласованности между сборками.

Для сборки на сервере сборки я могу создать скрипт MSBuild, установить свойство "DefineConstants" и собрать решение в конфигурации "Release". Как насчет того же в Visual Studio? Я хочу, чтобы разработчики все еще могли запускать сборки для определенных клиентов локально (для целей отладки / тестирования), но я действительно хочу избавиться от конфигураций для конкретного клиента. Потому что, если я что-то изменяю в сборке релиза, это не распространяется непосредственно на сборки, специфичные для клиента, и мне придется делать это снова для каждой из них.

Есть идеи, как упростить эти сборки?

2 ответа

Позвольте мне объяснить, что я сделал для достижения своих целей. Я использую директивы препроцессора для разделения кода. Хитрость в том, где они определены. Под VS я загружаю их из файла конфигурации, на автоматических сборках (TFS) они устанавливаются в скрипте сборки. Теперь у меня есть только две конфигурации проекта: Debug и Release. Все остальное (специфичные для клиента сборки, сборка анализа кода и т. Д.) Контролируется директивами препроцессора. Для сборки сервера у меня есть отдельный файл.proj, который устанавливает соответствующие константы и создает файл.sln. Каждый.csproj включает в себя дополнительный сценарий сборки (с помощью оператора Include), в котором я сначала перезаписываю свойства проекта, чтобы гарантировать, что все проекты имеют одинаковые настройки (т. Е. Для сборок Debug я устанавливаю DebugSymbols=true). В этом сценарии я также загружаю директивы препроцессора из файла перед началом компиляции исходного кода.

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

1) Если есть абсолютно положительные различия в коде, вы можете использовать директивы препроцессора для разделения кода.

2) Вы можете запустить помощника по сборке в Pre-Build Event, который записывает заголовочный файл с определением, определенным клиентом.

3) Используйте WiX/heat.exe для сборки любых пользовательских артефактов сборки, таких как графика и тому подобное.

Другие вопросы по тегам