visual-studio - visual studio add app config




Trasformazione App.Config per progetti che non sono progetti Web in Visual Studio? (10)

È possibile utilizzare un file di configurazione separato per 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>

Ciò creerà quindi il file ProjectName.exe.config corretto in base alla configurazione che si sta creando.

Per l'applicazione Web basata su Visual Studio 2010 disponiamo di funzionalità di Config Transformation con la quale possiamo gestire più file di configurazione per ambienti diversi. Ma la stessa funzione non è disponibile per i file App.Config per Windows Services / WinForms o Console Application.

È disponibile una soluzione alternativa come suggerito qui: Applicazione di XDT magic ad App.Config .

Tuttavia non è semplice e richiede un certo numero di passaggi. C'è un modo più semplice per ottenere lo stesso risultato per i file app.config?


Così ho finito per adottare un approccio leggermente diverso. Ho seguito i passaggi di Dan attraverso il passaggio 3, ma ho aggiunto un altro file: App.Base.Config. Questo file contiene le impostazioni di configurazione che desideri in ogni App.Config generato. Quindi uso BeforeBuild (con l'aggiunta di Yuri a TransformXml) per trasformare la configurazione corrente con la configurazione di base in App.config. Il processo di compilazione quindi utilizza App.config trasformato come di consueto. Tuttavia, un fastidio è il tipo di voler escludere App.config in continua evoluzione dal controllo del codice sorgente in seguito, ma gli altri file di configurazione ora dipendono da questo.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />

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

Ecco le istruzioni:

1. Aggiungi un file XML per ogni configurazione al progetto.

In genere si avranno le configurazioni di Debug e Release modo da denominare i propri file App.Debug.config e App.Release.config . Nel mio progetto ho creato una configurazione per ogni tipo di ambiente, quindi potresti voler sperimentare.

2. Scaricare il progetto e aprire il file .csproj per la modifica

Visual Studio ti consente di modificare i file .csproj direttamente nell'editor: devi solo scaricare prima il progetto. Quindi fai clic destro su di esso e seleziona Modifica <NomeProgetto> .csproj .

3. Collega App. *. Config files al file App.config principale

Trova la sezione del file di progetto che contiene tutti i riferimenti di App.*.config App.config e App.*.config . Noterai che le azioni di compilazione sono impostate su None :

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

Per prima cosa, imposta un'azione di compilazione per tutti al Content .
Successivamente, rendere tutti i file specifici della configurazione dipendenti dal file App.config principale in modo che Visual Studio li raggruppa come se fosse un designer e file code-behind.

Sostituisci XML sopra con quello 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. Attiva le trasformazioni magiche

Alla fine del file dopo

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

e prima della 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 puoi ricaricare il progetto, costruirlo e goderti App.config trasformazioni di App.config !

FYI

Assicurati che i tuoi file di App.*.config abbiano la configurazione corretta in questo modo:

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

Ho scritto una bella estensione per automatizzare la trasformazione app.config come quella incorporata nella trasformazione della configurazione del progetto dell'applicazione Web

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


Ispirato da olegsych.com/2010/12/config-file-transformation e altri in questa domanda, ho preso la soluzione https://.com/a/5109530/2286801 un ulteriore passaggio per abilitare quanto segue.

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

Questa soluzione funziona eseguendo la trasformazione app.config prima che app.config venga fatto riferimento per la prima volta nel processo MSBuild. Utilizza un file di destinazione esterno per una gestione più semplice su più progetti.

Istruzioni:

Passaggi simili all'altra soluzione. Ho citato ciò che rimane lo stesso e incluso per completezza e confronto più facile.

0. Aggiungi un nuovo file al tuo 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. Aggiungi un file XML per ogni configurazione al progetto.

In genere si avranno le configurazioni di debug e release in modo da denominare i propri file App.Debug.config e App.Release.config. Nel mio progetto, ho creato una configurazione per ogni tipo di ambiente in modo da poter provare a farlo.

2. Scaricare il progetto e aprire il file .csproj per la modifica

Visual Studio ti consente di modificare .csproj direttamente nell'editor: devi solo scaricare prima il progetto. Quindi fai clic destro su di esso e seleziona Modifica .csproj.

3. Collega App. *. Config files al file App.config principale

Trova la sezione del file di progetto che contiene tutti i riferimenti di configurazione App.config e App. *. Config e sostituisci come segue. Noterai che usiamo None anziché Content.

<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. Attiva le trasformazioni magiche

Alla fine del file dopo

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

e prima della finale

</Project>

inserisci il seguente codice XML:

<Import Project="AppConfigTransformation.targets" />

Fatto!


Nella mia esperienza, le cose che devo rendere specifiche dell'ambiente sono cose come stringhe di connessione, impostazioni di app e impostazioni spesso smt. Il sistema di configurazione consente di specificare queste cose in file separati. Quindi puoi usare questo nel tuo app.config / web.config:

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

Quello che faccio in genere è mettere queste sezioni config-specifiche in file separati, in una sottocartella chiamata ConfigFiles (dipende dalla radice della soluzione o dal livello del progetto, dipende). Definisco un file per configurazione, ad esempio smtp.config.Debug e smtp.config.Release.

Quindi puoi definire un evento di pre-build in questo modo:

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

Nello sviluppo del team, puoi perfezionarlo ulteriormente includendo% COMPUTERNAME% e / o% USERNAME% nella convenzione.

Ovviamente, ciò implica che i file di destinazione (x.config) NON dovrebbero essere messi nel controllo del codice sorgente (poiché sono generati). Dovresti comunque aggiungerli al file di progetto e impostare la proprietà del tipo di output su "copia sempre" o "copia se più recente".

Semplice, estensibile e funziona per tutti i tipi di progetti di Visual Studio (console, winforms, wpf, web).


Risolvo questo problema con questo strumento http://ctt.codeplex.com/ . Lo uso con lo script CCNet / nAnt per creare pacchetti.


Se si utilizza un TFS in linea (versione Cloud) e si desidera trasformare App.Config in un progetto, è possibile eseguire le seguenti operazioni senza installare strumenti aggiuntivi. Da VS => Scarica il progetto => Modifica file progetto => Vai in fondo al file e aggiungi quanto segue:

<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 Destination funzionano per l'uso locale e il server TFS online (Cloud).


Un'altra soluzione che ho trovato NON è quella di utilizzare le trasformazioni, ma solo un file di configurazione separato, ad esempio app.Release.config. Quindi aggiungi questa linea al tuo file csproj.

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

Ciò non genererà solo il file myprogram.exe.config corretto, ma se stai utilizzando Setup e Deployment Project in Visual Studio per generare MSI, imporrà al progetto di implementazione di utilizzare il file di configurazione corretto durante il packaging.


la soluzione proposta non funzionerà quando una libreria di classi con file di configurazione viene referenziata da un altro progetto (nel mio caso si trattava della libreria di progetti di lavoro di Azure). Non copierà il file trasformato corretto dalla cartella obj nella cartella bin\##configuration-name## . Per farlo funzionare con modifiche minime, è necessario modificare AfterCompile target su BeforeCompile :

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">




web-config-transform