Domanda

Per Visual applicazione basata su Web Studio 2010 abbiamo Config caratteristiche di trasformazione con la quale siamo in grado di mantenere più file di configurazione per ambienti diversi. Ma la stessa funzione non è disponibile per i file app.config per Windows Services / WinForms o Applicazione console.

C'è una soluzione a disposizione come suggerito qui: Applicando XDT magia per app.config .

Tuttavia non è semplice e richiede una serie di passaggi. C'è un modo più semplice per raggiungere lo stesso per i file App.config?

È stato utile?

Soluzione

Questo funziona ora con Visual Studio AddIn trattati in questo articolo: SlowCheetah - web.config Trasformazione Sintassi ora generalizzata per qualsiasi file di configurazione XML .

  

È possibile fare clic destro sul tuo web.config e fare clic su "Aggiungi Config   Trasforma ". Quando si esegue questa operazione, si otterrà una web.debug.config e un   web.release.config. È possibile effettuare una web.whatever.config se volete, come   Finché le linee di nome up con un profilo di configurazione. questi file   sono solo le modifiche desiderate apportate, non una copia completa del vostro   web.config.

     

Si potrebbe pensare che ci si vuole utilizzare XSLT per trasformare un web.config, ma   mentre sente intuitivamente destra in realtà è molto dettagliata.

     

Ecco due trasformazioni, uno utilizzando XSLT e lo stesso utilizzando il codice XML   Documento Trasforma la sintassi / namespace. Come tutte le cose c'è   diversi modi in XSLT per fare questo, ma si ottiene l'idea generale. XSLT   è un linguaggio di albero trasformazione generalizzata, mentre questa distribuzione   uno è ottimizzato per uno specifico sottoinsieme di scenari comuni. Ma il   raffreddare parte è che ogni XDT trasformare è un plugin NET, in modo da poter fare   il proprio.

        
<?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>
     

O la stessa cosa tramite la distribuzione di trasformare:

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

Altri suggerimenti

ho provato diverse soluzioni e qui è il più semplice personalmente ho trovato.
Dan fuori punte nei commenti che il post originale appartiene a Oleg Sych -! grazie, Oleg

Ecco le istruzioni:

1. Aggiungere un file XML per ciascuna configurazione al progetto.

In genere si avrà configurazioni Debug e Release così il nome dei file App.Debug.config e App.Release.config. Nel mio progetto, ho creato una configurazione per ogni tipo di ambiente, così si potrebbe desiderare di sperimentare con questo.

2. progetto di scarico e Csproj file aperti per la modifica

Visual Studio consente di modificare Csproj file direttamente nel redattore è sufficiente scaricare il primo progetto. Quindi fare clic destro su di esso e selezionare Modifica Csproj .

3. Bind App. *. File di configurazione per principale App.config

Trovare la sezione del file di progetto che contiene tutti i riferimenti App.config e App.*.config. Noterete le loro azioni di compilazione sono impostate per None:

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

In primo luogo, insieme all'azione di generazione per tutti loro di Content.
Quindi, fare tutto il Configurazione-specifica file dipendenti sul App.config principale in modo di Visual Studio gruppi di loro come si fa progettista e file di code-behind.

Sostituire XML sopra con quella qui sotto:

<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. trasformazioni Attiva magia

Alla fine del file dopo

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

e prima finale

</Project>

Inserisci il seguente codice 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>

Ora è possibile ricaricare il progetto, costruire e godere trasformazioni App.config!

FYI

Assicurarsi che i file App.*.config hanno il giusto setup in questo modo:

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

Un'altra soluzione che ho trovato è di non usare le trasformazioni, ma solo avere un file di configurazione separato, per esempio app.Release.config. Quindi aggiungere questa riga al file csproj.

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

Questo non solo per generare il file myprogram.exe.config destra, ma se si sta utilizzando il programma di installazione e di progetto di distribuzione in Visual Studio per generare MSI, sarà costringere il progetto di distribuzione per utilizzare il file di configurazione corretto quando imballaggio.

Nella mia esperienza, le cose che ho bisogno di fare specifica dell'ambiente sono cose come stringhe di connessione, e le impostazioni di appsettings spesso SMPT. Il sistema di configurazione permette di specificare queste cose in file separati. Così si può utilizzare questo nel vostro app.config / web.config:

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

Quello che di solito faccio è quello di mettere queste sezioni config-specifici in file separati, in una sottocartella denominata configfiles (sia nella radice soluzione o a livello di progetto, dipende). Mi definisco un file di configurazione per, ad esempio, smtp.config.Debug e smtp.config.Release.

Poi si può definire un evento di pre-compilazione in questo modo:

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

Nel team di sviluppo, è possibile modificare questo ulteriore includendo l'% COMPUTERNAME% e / o% username% nella convenzione.

Naturalmente, questo implica che i file di destinazione (x.config) non dovrebbero essere messi in controllo del codice sorgente (dal momento che sono generati). Si dovrebbe comunque aggiungerli al file di progetto e impostare la loro proprietà tipo di uscita a 'copiare sempre' o 'Copia se più recente' però.

semplice, estensibile, e funziona per tutti i tipi di progetti di Visual Studio (console, WinForms, WPF, web).

Oleg e altri in questa domanda, ho preso la soluzione https://stackoverflow.com/a/5109530/2286801 un ulteriore passo per abilitare le seguenti.

  • Funziona con ClickOnce
  • Funziona con progetti di installazione e distribuzione in VS 2010
  • Funziona con VS2010, 2013, 2015 (non prova 2012 anche se dovrebbe funzionare pure).
  • Funziona con Team Build. (È necessario installare o A) di Visual Studio) Microsoft.Web.Publishing.targets o B e Microsoft.Web.Publishing.Tasks.dll)

Questa soluzione funziona eseguendo la trasformazione app.config prima app.config viene fatto riferimento per la prima volta nel processo MSBuild. Si utilizza un file target esterni per semplificare la gestione su più progetti.

Istruzioni:

passi simili a l'altra soluzione. Ho citato quello che rimane lo stesso e incluso per completezza e di confronto più facile.

0. Aggiungere un nuovo file al progetto chiamato 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. Aggiungere un file XML per ciascuna configurazione al progetto.

     

In genere si avrà debug e configurazioni di uscita in modo da assegnare un nome al file e App.Debug.config App.Release.config. Nel mio progetto, ho creato una configurazione per ogni tipo di enironment così si potrebbe desiderare di sperimentare con questo.

     

2. progetto di scarico e Csproj file aperti per la modifica

     

Visual Studio consente di modificare Csproj proprio nel redattore è sufficiente scaricare il primo progetto. Quindi fare clic destro su di esso e selezionare Modifica csproj.

3. Bind App. *. File di configurazione per principale App.config

Trovare la sezione del file di progetto che contiene tutte App.config e App. *. Riferimenti di configurazione e sostituire come segue. Noterete che usiamo Nessuno invece di contenuti.

<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. trasformazioni Attiva magia

     

Alla fine del file dopo

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

e prima finale

     
</Project>

Inserisci il seguente codice XML:

<Import Project="AppConfigTransformation.targets" />

Fatto!

È possibile utilizzare un file di configurazione separato per ogni configurazione, ad esempio, app.Debug.config, app.Release.config e quindi utilizzare la variabile di configurazione nel file di progetto:

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

Questo sarà quindi creare il file ProjectName.exe.config corretto a seconda della configurazione che si sta costruendo in.

ho scritto bella estensione per automatizzare app.config trasformazione come quella costruita nel progetto Web Application Configurazione Transform

Il più grande vantaggio di questa estensione è che non è necessario installarlo su tutte le macchine di build

Così ho finito per prendere un approccio leggermente diverso. Ho seguito i passi di Dan attraverso il passaggio 3, ma ha aggiunto un altro file: App.Base.Config. Questo file contiene le impostazioni di configurazione che si desidera in ogni app.config generato. Poi io uso BeforeBuild (con l'aggiunta di Yuri a Transformxml) per trasformare la configurazione corrente con la configurazione di base nel App.config. Il processo di generazione utilizza poi l'App.config trasformato come normale. Tuttavia, un fastidio è che si tipo di volere escludere l'App.config mutevole dal controllo di origine in seguito, ma gli altri file di configurazione sono ora dipende da esso.

  <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>

Installa "Configurazione strumento Trasformazione" in Visual Studio dal Marketplace e VS. riavvio Sarete in grado di vedere menu di anteprima trasformare per app.config pure.

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform

I risolvere questo problema con questo strumento http://ctt.codeplex.com/ . Io lo uso con lo script CCNet / Nant per fare pacchetti.

Solo un piccolo miglioramento alla soluzione che sembra essere pubblicato in tutto il mondo ora:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • che è, a meno che non avete intenzione di rimanere con la versione corrente VS per sempre

Ho creato un'altra alternativa a quello pubblicato da Vishal Joshi in cui il requisito per cambiare l'azione build per Contenuti viene rimosso e anche il supporto di base implementata per la distribuzione ClickOnce. Dico di base, perché non ho testare a fondo ma dovrebbe funzionare nel tipico scenario di distribuzione ClickOnce.

La soluzione è costituita da un unico progetto MSBuild che una volta importato in un progetto di applicazione Windows esistenti (* csproj) estende il processo di generazione di contemplare la trasformazione app.config.

Si può leggere una spiegazione più dettagliata all'indirizzo Visual Studio App.config trasformazione XML e il file di progetto MSBuild possono essere scaricato da GitHub .

Se si utilizza un TFS in linea (versione Cloud) e si desidera trasformare l'app.config in un progetto, è possibile effettuare le seguenti operazioni senza installare alcun strumenti aggiuntivi. Da VS => Scaricare il progetto => Modifica file di progetto => Vai alla fine del file e aggiungere la seguente:

<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" />

AssemblyFile e opere Destinazioni per uso locale e TFS online (Cloud) server.

soluzione proposta non funziona quando una libreria di classi con file di configurazione viene fatto riferimento da un altro progetto (nel mio caso è stato Azure biblioteca di progetto lavoratore). Non copierà file trasformato corretto dalla cartella obj nella cartella bin\##configuration-name##. Per farlo funzionare con modifiche minime, è necessario cambiare bersaglio AfterCompile a BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top