App.config Преобразование для проектов, которые не являются веб-проектами в Visual Studio?

StackOverflow https://stackoverflow.com/questions/3004210

Вопрос

Для веб-приложения Visual Studio 2010 У нас есть функции трансформации конфигурации, с помощью которых мы можем поддерживать несколько файлов конфигурации для различных сред. Но та же функция недоступна для файлов App.config для Windows Services / WinForms или приложения консоли.

Существует обходной путь, который предлагается здесь: Применение XDT Magic в App.config.

Однако это не просто и требует ряд шагов. Есть ли более простой способ добиться того же для файлов app.config?

Это было полезно?

Решение

Это работает сейчас с Addin Visual Studio, обработанным в этой статье: SLOWCHETTAH - Синтаксис преобразования Web.config, который теперь обобщена для любого файла конфигурации XML.

Вы можете щелкнуть правой кнопкой мыши на вашем web.config и нажмите «Добавить конфигурацию преобразований». Когда вы делаете это, вы получите web.debug.config и web.release.config. Вы можете сделать Web .whatever.config, если вам нравится, до тех пор, пока имени строки с профилем конфигурации. Эти файлы - это просто изменения, которые вы хотите сделать, а не полную копию вашего web.config.

Вы можете подумать, что вы хотите использовать XSLT для преобразования Web.config, но пока они чувствуют себя интуитивно правильно, это на самом деле очень многословие.

Вот два преобразования, которые используют XSLT и тот же, использующий синтаксис / имен преобразования документов XML-документа. Как и во всем вещах, есть несколько способов XSLT, но вы получаете общую идею. XSLT является обобщенным языком трансформации деревьев, в то время как этот развертывание оптимизирован для определенного подмножества общих сценариев. Но прохладная часть состоит в том, что каждый преобразование XDT представляет собой плагин .NET, чтобы вы могли сделать свой собственный.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Или то же самое через преобразование развертывания:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

Другие советы

Я попробовал несколько решений, и вот самый простой я лично нашел.
Дэн указал в комментариях, которые Оригинальный пост принадлежит Олег СычСпасибо, Олег!

Вот инструкции:

1. Добавьте файл XML для каждой конфигурации в проект.

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

2. Разгрузите проект и открыть файл .csproj для редактирования

Visual Studio позволяет редактировать .csproj Файлы справа в редакторе - вам просто нужно сначала разгрузить проект. Затем щелкните правой кнопкой мыши на нем и выберите Редактироватьu003CProjectName> .csproj.

3. Привяжите приложение. *. Config файлы в основной App.config

Найдите раздел файла проекта, который содержит все App.config а также App.*.config использованная литература. Вы заметите, что их действия по сборке установлены на None:

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

Во-первых, установите накладные действия для всех из них Content.
Далее сделай все Конфигурация файлы зависимый от на главном App.config Так что Visual Studio Groups их так же, как это делает дизайнер и код за файлами.

Замените XML выше с тем ниже:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. Активировать преобразования магии

В конце файла после

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

и до финала

</Project>

Вставьте следующий XML:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

Теперь вы можете перезагрузить проект, построить его и наслаждаться App.config Преобразования!

FYI.

Убедитесь, что ваш App.*.config Файлы имеют правильную настройку, как это:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

Другое решение, которое я нашел, - это не использовать преобразования, но просто имеют отдельный файл конфигурации, например, app.release.config. Затем добавьте эту строку в свой файл CSPROJ.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

Это не только генерирует правильный файл myProgram.exe.config, но если вы используете проект настройки и развертывания в Visual Studio для генерации MSI, он заставляет проект развертывания использовать правильный файл конфигурации при упаковке.

По моему опыту, то, что мне нужно, чтобы укрепить окружающую среду, такие вещи, как соединительные струны, приложение и часто параметры SMPT. Система конфигурации позволяет указывать эти вещи в отдельных файлах. Таким образом, вы можете использовать это в вашем App.config / web.config:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

То, что я обычно делаю, это поставить эти специфические конфигурации секции в отдельные файлы в подпапке, называемую Configfiles (либо в корневом растворе, либо на уровне проекта, зависит). Я определяю файл на конфигурацию, например, smtp.config.debug и smtp.config.release.

Затем вы можете определить событие предварительного сборки, как так:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

В разработке команды вы можете настроить это дальше, включая% Username% и / или% имена пользователя% в Конвенции.

Конечно, это подразумевает, что целевые файлы (X.config) не должны быть помещены в контроль источника (так как они генерируются). Вы все равно должны добавить их в файл проекта и установить свойство своего вывода в «копировать всегда» или «скопировать, если новее», хотя.

Простой, расширяемый, и он работает для всех типов проектов Visual Studio (консоль, WinForms, WPF, WEB).

Вдохновлен Олег и другие в этом вопросе, я взял решение https://stackoverflow.com/a/5109530/2286801. шаг дальше, чтобы включить следующее.

  • Работает с ClickOnce
  • Работает с проектами установки и развертывания в VS 2010
  • Работает с VS2010, 2013, 2015 (не тестировал 2012 год, хотя тоже должен работать).
  • Работает с сборной сборки. (Вы должны установить либо) Visual Studio или B) Microsoft.Web.publishing.targets и Microsoft.web.publishing.tasks.dll)

Это решение работает, выполняя преобразование app.config перед приложением. Он использует файл внешних целей для более упрощения управления в нескольких проектах.

Инструкции:

Аналогичные шаги к другому решению. Я процитировал то, что остается прежним и включает его за полноту и легче сравнения.

0. Добавьте новый файл в свой проект под названием appconfigtransformation.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. Добавьте файл XML для каждой конфигурации в проект.

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

2. Разгрузите проект и открыть файл .csproj для редактирования

Visual Studio позволяет вам редактировать .Csproj прямо в редакторе - вам просто нужно сначала разгрузить проект. Затем щелкните правой кнопкой мыши и выберите «Редактировать» .Csproj.

3. Привяжите приложение. *. Config файлы в основной App.config

Найдите раздел «Файл проекта», который содержит все App.config и App. *. Настройте ссылки и замените следующим образом. Вы заметите, что мы используем None вместо контента.

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. Активировать преобразования магии

В конце файла после

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

и до финала

</Project>

Вставьте следующий XML:

<Import Project="AppConfigTransformation.targets" />

Сделанный!

Вы можете использовать отдельный файл конфигурации на конфигурацию, например, app.debug.config, app.release.config, а затем используйте переменную конфигурации в вашем файле проекта:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

Это затем создаст правильный файл ProjectName.exe.config в зависимости от конфигурации, в которой вы строите.

Я написал приятное расширение для автоматизации преобразования App.config, как встроенный проект веб-приложения Конфигурация преобразования

Самое большое преимущество этого расширения заключается в том, что вам не нужно устанавливать его на все машины сборки

Поэтому я оказался немного другим подходом. Я последовал за шагами Дэна через шаг 3, но добавил другой файл: app.base.config. Этот файл содержит настройки конфигурации, которые вы хотите в каждом сгенерированном App.config. Затем я использую ROFYBUILD (с добавлением Yuri к TransformXML) для преобразования текущей конфигурации с базовым конфигом в App.config. Затем процесс сборки использует преобразованное app.config как обычно. Однако один раздражение вы хотите исключить постоянно меняющееся App.config от контроля источника после этого, но другие файлы конфигурации теперь зависят от него.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>

Установите «Инструмент преобразования конфигурации» в Visual Studio с Marketplace и перезагрузите против Вы сможете увидеть преобразование Preview меню для App.config.

https://marketplace.visualstudio.com/itema?itemaname=golanavraham.configurationTransform.

Я решаю эту проблему с этим инструментом http://ctt.codeplex.com/. Отказ Я использую его с помощью сценария CCNET / NANT для изготовления пакетов.

Просто немного улучшение решения, которое, кажется, публикуется везде:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • то есть, если вы не планируете остаться с вашей текущей версией VS навсегда

Я создал еще одну альтернативу одному размещенному Вишалу Джоши, где требование изменить действие по сборке Содержание удаляется и также реализована базовая поддержка развертывания ClickOnce. Я говорю базовый, потому что я не тестировал его полностью, но он должен работать в типичном сценарии развертывания ClickOnce.

Решение состоит из одного проекта MSBuild, который, когда импортировал в существующий проект приложений Windows (* .csproj), расширяет процесс сборки для распространения преобразования App.config.

Вы можете прочитать более подробное объяснение в Visual Studio App.config XML Преобразование и файл проекта MSBuild может быть Скачано из Github.

Если вы используете TFS онлайн (облачная версия), и вы хотите преобразовать приложение.config в проекте, вы можете выполнить следующее без установки каких-либо дополнительных инструментов. От vs => Разгрузка проекта => Редактировать файл проекта => Перейти к нижней части файла и добавьте следующее:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

Средства сборки и назначения для местного использования и TFS онлайн (облачный) сервер.

Предлагаемое решение не будет работать, когда библиотека классов с помощью файла конфигурации ссылается из другого проекта (в моем случае это был лазурный рабочий в библиотеке проекта Azure). Это не будет скопировать правильный преобразованный файл из obj папка в bin\##configuration-name## папка. Чтобы он работал с минимальными изменениями, вам нужно изменить AfterCompile цель BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top