Для веб-приложения Visual Studio 2010 у нас есть функции преобразования конфигурации, с помощью которых мы можем поддерживать несколько файлов конфигурации для разных сред. Но та же функция недоступна для файлов App.Config для служб Windows / WinForms или консольного приложения.
Здесь предлагается обходной путь: применение магии XDT к App.Config .
Однако это не просто и требует ряда шагов. Есть ли более простой способ добиться того же для файлов app.config?
Ответы:
Теперь это работает с надстройкой Visual Studio, рассмотренной в этой статье: SlowCheetah - синтаксис преобразования Web.config, теперь обобщенный для любого файла конфигурации XML .
источник
Я попробовал несколько решений, и вот самое простое, что я лично нашел.
Дэн указал в комментариях, что оригинальный пост принадлежит Олегу Сычу - спасибо, Олег!
Вот инструкции:
1. Добавьте файл XML для каждой конфигурации в проект.
Как правило, вы будете иметь
Debug
иRelease
конфигурации, так что назовите ваши файлыApp.Debug.config
иApp.Release.config
. В моем проекте я создал конфигурацию для каждого типа среды, поэтому вы можете поэкспериментировать с этим.2. Выгрузите проект и откройте файл .csproj для редактирования.
Visual Studio позволяет редактировать файлы .csproj прямо в редакторе - сначала нужно просто выгрузить проект. Затем щелкните по нему правой кнопкой мыши и выберите « Изменить <ProjectName> .csproj» .
3. Привязать файлы конфигурации App. *. К основному файлу App.config.
Найдите раздел файла проекта, который содержит все
App.config
иApp.*.config
ссылки. Вы заметите, что их действия по сборке установлены наNone
:Во-первых, установите действие сборки для всех из них
Content
.Затем сделайте все зависящие от конфигурации файлы зависимыми от основных,
App.config
чтобы Visual Studio сгруппировала их, как это делает дизайнер и файлы с выделенным кодом.Замените XML выше на приведенный ниже:
4. Активируйте магию преобразований (необходимо только для версий Visual Studio до VS2017 )
В конце файла после
и до финала
вставьте следующий XML:
Теперь вы можете перезагрузить проект, собрать его и наслаждаться
App.config
трансформациями!FYI
Убедитесь, что ваши
App.*.config
файлы правильно настроены так:источник
v10.0
с ,v$(VisualStudioVersion)
чтобы убедиться , что ваш проект действительно работает со всеми более поздними версиями VS.Другое решение, которое я нашел, это НЕ использовать преобразования, а просто иметь отдельный файл конфигурации, например, app.Release.config. Затем добавьте эту строку в ваш файл csproj.
Это не только сгенерирует правильный файл myprogram.exe.config, но если вы используете проект установки и развертывания в Visual Studio для создания MSI, это заставит проект развертывания использовать правильный файл конфигурации при упаковке.
источник
<AppConfig>App.Release.config</AppConfig>
строку в существующее<PropertyGroup
условие дляRelease
конфигурации, и IDE показала волнистую линию под<AppConfig>
... строкой, говоря, что ее нет в схеме или что-то в этом роде, но я все равно сохранил файл, перезагрузил файл проекта и выполнил сборку вRelease
конфиге и все заработало!По моему опыту, вещи, которые мне нужно сделать для конкретной среды, это такие вещи, как строки подключения, настройки приложений и часто игнорируемые настройки. Система конфигурации позволяет указывать эти вещи в отдельных файлах. Таким образом, вы можете использовать это в вашем app.config / web.config:
Обычно я делаю эти специфичные для конфигурации разделы в отдельных файлах, во вложенной папке с именем ConfigFiles (зависит либо от корня решения, либо от уровня проекта). Я определяю файл для каждой конфигурации, например, smtp.config.Debug и smtp.config.Release.
Затем вы можете определить событие перед сборкой следующим образом:
В групповой разработке вы можете изменить это, включив в соглашение% COMPUTERNAME% и / или% USERNAME%.
Конечно, это подразумевает, что целевые файлы (x.config) НЕ должны помещаться в систему контроля версий (так как они генерируются). Вы все равно должны добавить их в файл проекта и установить для их свойства выходного типа значение «всегда копировать» или «копировать, если новее».
Простой, расширяемый, и он работает для всех типов проектов Visual Studio (консоль, winforms, wpf, web).
источник
<?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp>
Преобразование:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="user@email.com" deliveryMethod="Network"> <network .../> </smtp>
Вдохновленный Олегом и другими в этом вопросе, я предпринял решение https://stackoverflow.com/a/5109530/2286801 на шаг вперед, чтобы включить следующее.
Это решение работает путем выполнения преобразования app.config до того, как на app.config впервые будет сделана ссылка в процессе MSBuild. Он использует внешний файл целей для более удобного управления несколькими проектами.
Инструкции:
Аналогичные шаги для другого решения. Я процитировал то, что остается тем же самым и включил это для полноты и более простого сравнения.
0. Добавьте новый файл в ваш проект с именем AppConfigTransformation.targets
3. Привязать файлы конфигурации App. *. К основному файлу App.config.
Найдите раздел файла проекта, содержащий все ссылки на App.config и App. *. Config, и замените его следующим образом. Вы заметите, что мы используем Нет вместо Контента.
вставьте следующий XML:
Выполнено!
источник
Вы можете использовать отдельный файл конфигурации для каждой конфигурации, например, app.Debug.config, app.Release.config, а затем использовать переменную конфигурации в файле проекта:
После этого будет создан правильный файл ProjectName.exe.config в зависимости от конфигурации, в которую вы встраиваете.
источник
Я написал хорошее расширение для автоматизации преобразования app.config, подобное встроенному преобразованию конфигурации проекта веб-приложения.
Самым большим преимуществом этого расширения является то, что вам не нужно устанавливать его на всех сборочных машинах
источник
Установите «Средство преобразования конфигурации» в Visual Studio из Marketplace и перезапустите VS. Вы также сможете увидеть преобразование предварительного просмотра меню для app.config.
https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform
источник
В итоге я выбрал немного другой подход. Я выполнил шаги Дэна до шага 3, но добавил еще один файл: App.Base.Config. Этот файл содержит параметры конфигурации, которые вы хотите в каждом сгенерированном App.Config. Затем я использую BeforeBuild (с добавлением Юрия в TransformXml), чтобы преобразовать текущую конфигурацию с базовой конфигурацией в App.config. Процесс сборки затем использует преобразованный App.config как обычно. Тем не менее, одно раздражение заключается в том, что вы как бы хотите исключить постоянно изменяющийся App.config из контроля версий впоследствии, но другие файлы конфигурации теперь зависят от него.
источник
Просто небольшое усовершенствование решения, которое, похоже, теперь публикуется везде:
источник
$(VisualStudioVersion)
что установлено при использовании MSBuild напрямую.Я создал другую альтернативу той, которую опубликовал Вишал Джоши, в которой устранено требование изменить действие сборки на Контент, а также реализована базовая поддержка развертывания ClickOnce. Я говорю простой, потому что я не тестировал его полностью, но он должен работать в типичном сценарии развертывания ClickOnce.
Решение состоит из одного проекта MSBuild, который после импорта в существующий проект приложения Windows (* .csproj) расширяет процесс сборки, чтобы предусмотреть преобразование app.config.
Вы можете прочитать более подробное объяснение в Visual Studio App.config XML Transformation, а файл проекта MSBuild можно загрузить с GitHub .
источник
Если вы используете TFS онлайн (облачная версия) и хотите преобразовать App.Config в проект, вы можете сделать следующее без установки каких-либо дополнительных инструментов. Из VS => Выгрузить проект => Редактировать файл проекта => Перейти в конец файла и добавить следующее:
AssemblyFile и Destination работают для локального использования и онлайн-сервера TFS (Cloud).
источник
Предложенное решение не будет работать, если ссылка на библиотеку классов с файлом конфигурации указана в другом проекте (в моем случае это была библиотека рабочего проекта Azure). Он не скопирует правильно преобразованный файл из
obj
папки вbin\##configuration-name##
папку. Чтобы заставить его работать с минимальными изменениями, вам нужно изменитьAfterCompile
цель наBeforeCompile
:источник