13

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 つのアプリに対して個別のビルド確認を行うのは無意味に思えます。これを行うハックな方法は、ビルド後の環境ごとに正しい app.config をコピーすることです。

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

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

4

4 に答える 4

12

混乱しているのは、コンパイル時の構成変換を行う機能があり、展開時の構成変換があることです。

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

展開時の構成変換は、特定の環境 (QA、PROD など) に展開する際の構成ファイルの操作です。データベース接続文字列の変更、サービス エンドポイントの変更などが必要です。web.config では、MSDEPLOY が最適な IIS ツールです。app.config については、インストーラー テクノロジに頼る必要があるようです。これには、 WIXなどのさまざまなツールがあります。

とにかく、コンパイル時と展開時の構成変換の違いに関するこの短い説明が、ツールセットが断片化されている理由を説明するのに役立つことを願っています. より詳細な分析については、この件に関して私が作成したブログ投稿を参照してください。 microsoft-web-展開/

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

于 2014-02-20T17:30:32.857 に答える
6

App.config 変換

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

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. App.Config<ItemGroup>が定義されている場所 ( <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 のバージョンへの依存関係がないため、同意してください。

于 2016-07-22T20:49:09.023 に答える
3

これは、このシナリオで使用するものです。

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

于 2013-12-19T20:26:19.553 に答える