13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
|
||||||
1 | ||||||
Определить переменную на этапе компиляции (через msbuild)21.09.2022, 06:50. Показов 809. Ответов 7
Всем добрый день!
Подскажите есть ли, какая-нибудь техническая возможность динамически определеить значение переменной на этапе компиляции? То есть как-то передать параметр в msbuild, которые бы задало значение переменной? Поясню. Сейчас я делаю через директивы препроцессора, так:
if/else/endif И просто через msbuild определить значение ProductName? (например где-нибудь в PropertyGroupe). Типа, в консоле при сборке: msbuild /t:Build /p:ProductName=AppForTwoUser
0
|
21.09.2022, 06:50 | |
Ответы с готовыми решениями:
7
[msvc][msbuild] вывод сообщений на этапе построения Как на этапе компиляции определить принадлежность к классу? Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute Ключевое слово constexpr: как определить удалось ли вычислить возвращаемое значение на этапе компиляции? При компиляции показывается консоль MSBuild затем еще одна консоль и без результата |
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
21.09.2022, 14:50 | 2 |
Schumacher57, может вам не директивы нужны, а файл конфигурации? Выглядит именно так.
1
|
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
|
|
23.09.2022, 11:54 [ТС] | 3 |
Usaga, Да, я смотрел в эту сторону. Тут же принцип работы какой. Программа на этапе компиляции считала все данные с файла конфигурации и загрузила в "себя", скажем так. А у меня вопрос кастомизации для конкретного пользователя. То есть мне то на этапе компиляции нужна одна и та же программа с двумя разными заголовками в названии (ну и не только заголовками они отличаются). Вот как для одного пользователя сделать такой заголовок и там картинки и оформление, а для друго-го другое... Файлом конфигурации? Там есть условные операторы? По-моему это просто тоже что и из какого-нибудь txt файла считывать данные.
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
23.09.2022, 12:20 | 4 |
Да. Совершенно нормальное решение. И по времени БЫСТРЕЕ, чем делать 100500 сборок разных.
Где? Ну, оно и есть.
0
|
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
|
||||||
28.09.2022, 17:45 [ТС] | 5 | |||||
Usaga, Ну ок. Максимально приближенный пример к реальности.
Вот есть приложение которое считает график работы для компании "Вим-биль-пупок". Человек открывает это приложение и в заголовке написано: "Программа расчёта графика работы для компании "Вим-биль-пупок". Потом есть такой же график расчёта для компании "KrakodgiaAirlains". И там человек когда запускает программу, написано: "Программа расчёта графика работы для компании "KrakodgiaAirlains". То есть у оператора ПК создаётся впечатление, что эта программа написана специально для него. И вот таких компаний около 20 штук. И каждая компания хочет чтобы у них в приложении было именно своё название. А не "Программа расчёта графика работы для всех желающих по принципу усреднения". И тут нюанс, не только название, но и цветовые оттенки. Как я решил задачу: Есть утилита – msbuild. Можно собрать проект на C# через консоль. Команда выглядит вот так: msbuild /p:Configuration=KrakodgiaAirlains /t:Release Что примерно означает следующее, собрать сборку для компании "KrakodgiaAirlains" (определить свойство Configuration равное KrakodgiaAirlains), цель сборки – Release. Дальше в файле проекта .csproj написано, если свойство (property) равно "KrakodgiaAirlains", то использоваться такие-то файлы ресурсов и определить такие-то DefineConstants. Вот если с ресурсами всё чётко, то в DefineConstants и есть вся загвостка.В коде C# я сделал такое условие: Если определена переменная препроцессора: "KrakodgiaAirlains" Пример кода:
Вот и вопрос как эффективно кастомизировать сборки по сути одной и той же программы, под разных заказчиков?
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
29.09.2022, 06:26 | 6 |
Настройкой в файле конфигурации. Без всяких директив компиляции. Ваше приложение при старте будет читать эти настройки, где название, цвета, всё такое и применять их. Тогда у вас не будет 25 условий каких-то и необходимости каждый раз приложение пересобирать 25 раз на каждый чих.
Это совершенно нормальная и распространённая практика.
0
|
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
|
|
06.10.2022, 11:46 [ТС] | 7 |
Usaga, сначала хочу сказать, спасибо за ответы!
Но, чтобы прийти к полному пониманию хотел бы уточнить пару деталей, твоего (если позволишь на "ты") видения реализации (пусть пока и без конкретных деталей и только "на словах"). То есть эта реализация представлена, как пример, следующими ключевыми моментами: 1. Сборку проекта (на С#) осуществляется через msbuild; 2. В консоле (bat файле) ты указываешь какой файл конфигурации (по сути xml документ) подгрузить для сборки этого проекта. 3. Для каждой кастомизации (цвета, наименования и т.п.) создаётся свой файл конфигурации. 4. Соответственно в файле проекта (.csproj) будут условные операторы, которые в зависимости от переданного через команду из cmd значения (напр. property), будут подгружать нужный файл конфигурации (xml) в проект. Верно ли я (пусть примерно) понял процесс реализации кастомизации через файлы конфигурации? Добавлено через 1 минуту И насчёт вот этого не совсем представляю, как обойтись сборкой без условий. Не всегда же надо пересобрать обязательно все 25 разных кастомов. А если например нужно пересобрать только 3-7 кастома (персонализированных приложений) из 25 и обойтись без условий мне кажется невозможным.
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
06.10.2022, 16:03 | 8 |
Чисто технически, она ВСЕГДА идёт через msbuild. Visual Studio и утилита dotnet пинают msbuild для сборки.
Сборка вашего проекта однократная. Чтение конфигурации ваше приложение производит во время исполнения. В это время уже никаких csproj нет. Когда и как вы конфиг будете подкладывать вы уже исходите из своих требований. Как это делаем мы. У нас более 300 Т.е. кастомер (заказчик, клиент) сам себе всё настраивает. Нет у нас никаких условий сборки. Если вы настройки будете читать во время выполнения, то вообще никаких пересборок и кастомов не будет. Ни одного.
0
|
06.10.2022, 16:03 | |
06.10.2022, 16:03 | |
Помогаю со студенческими работами здесь
8
C++14: вычисления на этапе компиляции Ошибка на этапе компиляции Ошибка на этапе компиляции Чтение файла на этапе компиляции Несистематическая ошибка на этапе компиляции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |