Как выбрать другое приложение.конфигурация для нескольких конфигураций сборки


У меня есть проект типа dll который содержит интеграционные тесты MSTest. На моей машине тесты проходят, и я хочу, чтобы то же самое произошло на сервере CI (я использую TeamCity). Но тесты терпят неудачу, потому что мне нужно настроить некоторые настройки в приложении.конфиг. Вот почему я думал, чтобы иметь отдельное второе приложение.конфигурационный файл, который будет содержать настройки для сервера CI.

поэтому я хотел бы иметь

/Sln
 /Proj
  app.config (I think this is required by VS)
  app.Release.config (This is a standalone independent config file)

таким образом, если я выберу Release configuration в build config on Ки, я хотел бы использовать приложение.Освобождать.конфигурационный файл вместо приложения.конфигурации

10 101

10 ответов:

использовать SlowCheetah плагин. Для получения более подробной информации о том, как использовать SlowCheetah продолжайте читать.

как вы уже заметили, нет по умолчанию и простой способ использовать различные файлы конфигурации для тип библиотеки (.dll). Причина в том, что текущее мышление:"вам не нужно"! Разработчики фреймворка считают, что вам нужна конфигурация для исполняемого файла: будь то консоль, рабочий стол, веб, мобильное приложение или что-то еще. Если вы начнете предоставление конфигурации для dll, вы можете в конечном итоге с чем-то я могу назвать config hell. Вы больше не можете понять (легко), почему эти и эти переменные имеют такие странные значения, которые, казалось бы, ниоткуда.

"держись", - вы можете сказать: "но мне это нужно для моей интеграции / модульного тестирования, и это библиотека!". И это правда и это то, что вы можете сделать (выбрать только одно, не смешивать):

1. SlowCheetah - преобразует текущий конфигурационный файл

вы можете установить SlowCheetah - плагин Visual Studio, который выполняет все низкоуровневые XML-тычки (или преобразования) для вас. Как это работает, кратко:

  • установите SlowCheetah и перезапустите Visual Studio (Visual Studio > Tools > Extensions and Updates ... > Online > Галерея Visual Studio > поиск "медленного гепарда")
  • определение конфигурации решения ( Debug и релиз там по умолчанию), вы можете добавить больше (щелкните правой кнопкой мыши решение в Обозреватель>Configuration Manager...>Конфигурация Активного Решения>новый...
  • при необходимости добавьте конфигурационный файл
  • Правой Кнопкой Мыши на файл config > Добавить Преобразование
    • это создаст файлы преобразования-по одному на вашу конфигурацию
    • преобразование файлы работают как инжекторы / мутаторы, они находят необходимый XML-код в исходном файле конфигурации и вводят новые строки или мутируют необходимое значение, что бы вы ни сказали ему сделать

2. Поиграй с ним .proj file-copy-переименовывает совершенно новый конфигурационный файл

изначально взяты из здесь. Это пользовательская задача MSBuild, которую можно внедрить в Visual Studio .прое. Скопируйте и вставьте следующий код в проект файл

<Target Name="AfterBuild">
    <Delete Files="$(TargetDir)$(TargetFileName).config" />
    <Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config"
          DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

Теперь создайте папку в проекте под названием Config и добавить туда новые файлы: приложение.Отлаживать.конфигурации,приложение.Освобождать.конфигурации и так далее. Теперь, в зависимости от вашей конфигурации, Visual Studio выберет файл конфигурации из Config папка, и копировать-переименовать его в выходной каталог. Так что если бы у вас было PatternPA.Тест.Интеграция и Debug конфигурация выбрана, в выходной папке после сборки вы найду себе PatternPA.Тест.Интеграция.файл DLL.конфигурации файл, который был скопирован из Config\App.Debug.config и затем переименован.

вот некоторые заметки, которые вы можете оставить в конфигурационные файлы

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->

    <!-- Depending on the configuration the content of projectName.dll.config 
        is fully substituted by the correspondent to build configuration file 
        from the 'Config' directory. -->

</configuration>

в Visual Studio вы можете иметь что-то вроде этого

Project structure

3. Используйте файлы сценариев вне Visual Studio

каждый инструмент построить (например,NAnt, MSBuild) предоставляет возможности для преобразования файл конфигурации в зависимости от конфигурации. Это полезно, если вы строите свое решение на машине сборки, где вам нужно иметь больше контроля над тем, что и как вы готовите продукт к выпуску.

например, вы можете использовать задачу dll веб-публикации для преобразования любого файла конфигурации

<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
    TaskName="TransformXml"/>

<PropertyGroup>
    <!-- Path to input config file -->  
    <TransformInputFile>path to app.config</TransformInputFile>
    <!-- Path to the transformation file -->    
    <TransformFile>path to app.$(Configuration).config</TransformFile>
    <!-- Path to outptu web config file --> 
    <TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>

<Target Name="transform">
    <TransformXml Source="$(TransformInputFile)"
                  Transform="$(TransformFile)"
                  Destination="$(TransformOutputFile)" />
</Target>

вы можете попробовать следующий подход:

  1. Правой Кнопкой Мыши на проекте в обозревателе решений и выберите команду Выгрузить Проект.
  2. проект будет выгружен. Щелкните правой кнопкой мыши на проекте и выберите Edit .csproj.
  3. теперь вы можете редактировать файл проекта в Visual Studio.
  4. найдите место в *.файл csproj, в который включен файл конфигурации приложения. Это будет выглядеть например:
    <ItemGroup>
        <None Include="App.config"/>
    </ItemGroup>
  1. заменить эти строки следующим образом:
    <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
        <None Include="App.Debug.config"/>
    </ItemGroup>

    <ItemGroup Condition=" '$(Configuration)' == 'Release' ">
        <None Include="App.Release.config"/>
    </ItemGroup>

Я не пробовал этот подход к app.config файлы, но он отлично работал с другими элементами проектов Visual Studio. Вы можете настроить процесс сборки практически любым способом, который вам нравится. В любом случае, дайте мне знать результат.

следует считать ConfigGen. Он был разработан для этой цели. Он создает файл конфигурации для каждой машины развертывания на основе файла шаблона и файла параметров. Я знаю, что это не отвечает на ваш вопрос конкретно, но это вполне может ответить на вашу проблему.

поэтому вместо отладки, выпуска и т. д. У вас может быть тест, UAT, производство и т. д. Вы также можете иметь различные настройки для каждого компьютера разработчика, так что вы можете создать конфигурацию, специфичную для ваш компьютер разработчика и измените его, не влияя на развертывание кого-либо другого.

пример использования может быть...

<Target Name="BeforeBuild">
    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t       
        $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />

    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>

Если вы поместите это в ваш .csproj файл, и у вас есть следующие файлы...

$(ProjectDir)App.Config.Settings.xls

MachineName        ConfigFilePath   SQLServer        

default             App.config      DEVSQL005
Test                App.config      TESTSQL005
UAT                 App.config      UATSQL005
Production          App.config      PRODSQL005
YourLocalMachine    App.config      ./SQLEXPRESS


$(ProjectDir)App.config.template.xml 

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=[%SQLServer%]; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

... тогда это и будет результатом...

из первой команды создается конфигурационный файл для каждой среды, указанной в файле xls, помещенный в выходной каталог $(Solutions dir) ConfigGen

.../solutiondir/ConfigGen/Production/App.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=PRODSQL005; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

от вторая команда, локальное приложение.конфигурация, используемая на вашем компьютере разработчика, будет заменена сгенерированной конфигурацией, заданной локальным (-l) переключателем и параметром filename (- n).

используя тот же подход, что и Romeo, я адаптировал его к Visual Studio 2010:

 <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />

 <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />

здесь вам нужно сохранить оба приложения.конфигурационные файлы в разных каталогах (appDebug и appRelease). Я проверил его, и он отлично работает!

Я использую инструмент XmlPreprocess для обработки конфигурационных файлов. Он использует один файл сопоставления для нескольких сред (или нескольких целей сборки в вашем случае). Вы можете редактировать файл сопоставления с помощью Excel. Он очень прост в использовании.

SlowCheetah и FastKoala из галереи VisualStudio кажутся очень хорошими инструментами, которые помогают решить эту проблему.

однако, если вы хотите избежать надстроек или использовать принципы, которые они реализуют более широко во всех ваших процессах сборки/интеграции, то добавление этого в файлы msbuild *proj является сокращенным исправлением.

Примечание: это более или менее переделка № 2 ответа @oleksii.

это работает .exe и .файл DLL проекты:

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
  </Target>

это работает для веб-проектов:

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
  </Target>

обратите внимание, что этот шаг происходит еще до начала собственно сборки. Преобразование конфигурационного файла происходит в папке проекта. Так что преобразилась паутина.конфигурация доступна при отладке (недостаток SlowCheetah).

помните, что если вы создадите папку App_Config (или как вы ее назовете), различные промежуточные файлы конфигурации должны иметь сборку Действие = нет, и копировать в выходной Каталог = не копировать.

это объединяет оба варианта в один блок. Соответствующий выполняется на основе условий. Задача TransformXml определяется первым, хотя:

<Project>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Condition="Exists('App_Config\app.Base.config')" Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
    <TransformXml Condition="Exists('App_Config\Web.Base.config')" Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
</Target>

смотрите, если XDT (web.config) transform engine может помочь вам. В настоящее время он поддерживается только для веб-проектов, но технически ничто не мешает вам использовать его в других типах приложений. Есть много руководств о том, как использовать XDT, вручную редактируя файлы проекта, но я нашел плагин, который отлично работает: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

плагин только помогает установить конфигурация, это не требуется для сборки и решение может быть построено на других машинах или на сервере сборки без плагина или каких-либо других инструментов требуется.

Я решил эту тему с решением, которое я нашел здесь: http://www.blackwasp.co.uk/SwitchConfig.aspx

короче что они есть: "добавить событие после построения.[...] Нам нужно добавить следующее:

if "Debug"=="$(ConfigurationName)" goto :nocopy
del "$(TargetPath).config"
copy "$(ProjectDir)\Release.config" "$(TargetPath).config"
:nocopy

после некоторых исследований по управлению конфигурациями для разработки и сборки и т. д. Я решил свернуть свой собственный, я сделал его доступным на bitbucket по адресу:https://bitbucket.org/brightertools/contemplate/wiki/Home

Это несколько файлов конфигурации для нескольких сред, его основной инструмент замены записи конфигурации,который будет работать с любым текстовым форматом файла.

надеюсь, что это помогает.

Я слышал хорошие вещи о SlowCheetah, но не смог заставить его работать. Я сделал следующее: Я добавить тег к каждой конкретной конфигурации.

Ex:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'UAT|AnyCPU'">
    <OutputPath>bin\UAT\</OutputPath>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AppConfig>App.UAT.config</AppConfig>
  </PropertyGroup>