web-dev-qa-db-ja.com

app.configを3つの異なる環境に変換する

Msbuildを使用してapp.configファイルを変換できるようにする必要があります。 app.DEBUG.configまたはapp.Release.configという名前のファイルは変換できますが、app.PROD.configという名前のファイルを追加すると変換できません。

通常のXDT変換を使用すると、異なるPublishProfileを選択すると、msbuildが異なるweb.configファイルを認識します。

 msbuild path.to.project.csproj Configuration=Release PublishProfile=DEV

どうやらapp.configはこれと同じ設定では機能しません。私はいつでもDEV.configセットアップの特定のビルド構成を作成できますが、1つのアプリに対して個別のビルドを確認するのは無意味なようです。そうするためのハッキーな方法は、POST-BUILD環境ごとに正しいapp.configをコピーすることです。

SlowCheetahプラグインを使用しようとしましたが、これはデフォルトのDEBUGおよびRELEASE構成ファイルのみを変換するようですが、3つ以上の環境があるため、これは適切ではありません。実際にこれを間違って使用している場合は、msbuildに渡してapp.DEV.configを選択するためにどのパラメーターを渡すべきかを教えてください。

期待される結果は、msbuildがapp.DEV.configと呼ばれるカスタマイズされた変換、またはapp.PROD.config用にカスタマイズされた変換に従ってapp.configを変換することです。 msbuildに渡すことができるパラメーターがあると思います。これにより、リリース構成を使用できますが、環境ごとに異なる名前のトランスフォームを使用できます。

12
cmluciano

これは私がこのシナリオで使用するものです:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun" BeforeTargets="Build">
    <Message Text="Configuration: $(Configuration) update from web.template.$(Configuration).config"/>
    <TransformXml Source="web.template.config"
              Transform="web.template.$(Configuration).config"
              Destination="web.config" />
    </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.config;web.template.*.config"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

次の設定があります。

web.template.config
    - web.template.debug.config
    - web.template.production.config
    - web.template.release.config etc

追加のプラグインなどを必要とせずにクロスPCで動作するはずです。シナリオでは、内容を編集してapp. の代わりに web.

3
Stuart Blackler

混乱しているのは、コンパイル時の構成変換を実行する能力があり、次にデプロイメントできることです。 -time構成変換

一般に、コンパイル時の構成変換を使用してローカルにデフォルト設定された構成ファイルに変更を加え、デバッグまたはリリース構成(またはユーザーが定義するカスタム構成)に適するようにします。 web.configの場合、ツールは組み込みです。 app.configの場合、 SlowCheetah Visual Studio拡張 は、web.configと同じ機能をapp.configに提供します。 RELEASE構成の構成変換の例は、system.webコンパイルのデバッグ属性を削除することです。

デプロイ時の構成変換は、特定の環境(QA、PRODなど)にデプロイする際の構成ファイルの操作です。データベース接続文字列の変更、サービスエンドポイントの変更などが必要です。web.configの場合、MSDEPLOYがIIS最適なツールです。app.configの場合、インストーラーに依存する必要があるようですテクノロジー。これには、たとえば [〜#〜] wix [〜#〜] などのさまざまなツールがあります。

とにかく、コンパイル時と配置時の構成変換の違いに関するこの短い説明が、ツールセットが断片化されている理由の説明に役立つことを願っています。より詳細な分析については、このテーマについて私が作成したブログ投稿を参照できます。 http://philippetruche.wordpress.com/2012/07/11/deploying-web-applications-to-multiple- environment-using-Microsoft-web-deploy /

WIXツールセットを使用してインストーラーを作成する場合は、 Visual Studio 2012およびWixを使用したマルチ環境のWindowsインストーラーの作成 を参照してください。

9
Philippe

App.config変換

変換が機能するかどうかをテストするには、実際の変換を使用する必要があります。 appSettingsブロックを使用したInsert-transformは、おそらく最も単純なものです。以下の設定ファイルでテストしました。

App.config:

<?xml version="1.0" encoding="utf-8" ?><configuration>  <appSettings>    <add key="FirstName" value="Gunnar"/>  </appSettings></configuration>

App.Release.config

<?xml version="1.0"?><configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">  <appSettings>    <add key="LastName" value="Peipman" xdt:Transform="Insert"/>  </appSettings></configuration>

変換後の構成ファイル:

<?xml version="1.0" encoding="utf-8" ?><configuration>  <appSettings>    <add key="FirstName" value="Gunnar"/>    <add key="LastName" value="Peipman"/>  </appSettings></configuration>

App.config変換を機能させる

コンソールアプリケーションでそれを行う方法を見てみましょう。

  1. App.configとApp.Release.configをプロジェクトに追加し、上記のコンテンツを入力します。
  2. コンソールアプリケーションプロジェクトをアンロードします。
  3. プロジェクト名を右クリックし、「<プロジェクトファイル名>の編集」を選択します。
  4. プロジェクトファイルがXMLファイルとして開かれ、その中身を確認できます。
  5. 最初のプロパティグループのタグを閉じる前に、次の行を追加します。

    <ProjectConfigFileName>App.Config</ProjectConfigFileName>
    
  6. 検索<ItemGroup> App.Configが定義されている場所(<None Include="App.Config" />)、App.Configノードの後に​​次のブロックを追加します。

    <None Include="App.Release.config"> 
        <DependentUpon>App.Config</DependentUpon>
    </None>
    
  7. 最初を検索<Import Project=ノードを追加し、次のインポートをリストの最後のインポートとして追加します。

    <Import Project="$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets" Condition="'$(VSToolsPath)' != ''" />
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" Condition="false" />
    
  8. ファイルの最後、タグの直前に、次のコードブロックを貼り付けます。

    <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
    <Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
      <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
      <ItemGroup>
        <AppConfigWithTargetPath Remove="app.config" />
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetName).vshost$(TargetExt).config</TargetPath>
        </AppConfigWithTargetPath>
      </ItemGroup>
    </Target>
    
  9. プロジェクトファイルを保存して閉じ、リロードします。

プロジェクトを再度ロードすると、Visual Studioはファイルへのいくつかの変更について尋ねる場合があるため、Visual Studio 2010から現在までのすべてのバージョンで、変更を加えなくてもプロジェクトファイルを使用できます。 Visual Studioのバージョンへの依存関係がないため、それに同意します。

3
Nirav Mehta

App.configは、web.configと同じように変換できます。ここにあるこのnugetパッケージを使用してください https://github.com/acottais/msbuild.xdt

これを可能にする他のいくつかのNugetパッケージがあります。先日これを使ってみましたがうまくいきました。

インストール後は、VSウィンドウからAdd-Transformと同じくらい簡単です。私は昨日、カスタム構成でこれを実行しました。
プロジェクトファイルのアンロードと変更を行う一連のチュートリアルをオンラインで実行しました。近くに来た人もいましたが、そのために大変な労力を費やしました。

1
Jason Dimmick