3

私がやろうとしていること

現在、ソリューションのいくつかのプロジェクトで WCF 構成設定が重複しています。WCF 構成値を 1 つのファイルに保存し、必要な数のプロジェクトから参照できるようにしたいと考えています。構成ファイルは、さまざまな環境でさまざまな値を使用できるように変換可能である必要があります。

私が試したこと

私は、他の人がSlowCheetahとリンクされたファイルで同様のことを試みたいくつかの調査を行いました. これが私がやろうとしたことです。私たちのソリューションには、多くのプロジェクト、いくつかの MVC3、いくつかのコンソール アプリ、およびいくつかのクラス ライブラリが含まれていることに注意してください。

  1. Wcf.Client.config ファイルを作成し、それを共通クラス ライブラリに追加し、SlowCheetah を使用して変換を追加しました。
  2. MVC3 プロジェクトでこのファイルを参照したいので、構成ファイルへのリンクを作成しました
  3. MVC3 プロジェクトの web.config ファイルに、configSource 属性が「Wcf.Client.config」に設定された client 要素を含むグループを追加しました。
  4. リンクされた構成ファイルの「出力ディレクトリにコピー」プロパティを「新しい場合はコピー」に設定しました
  5. リンクされたファイルに変換も追加しました(これが機能するかどうかはわかりませんでしたが、ファイルを正常にリンクしました)

問題

ローカル環境と開発環境の変換があります。残念ながら、開発者の構成で Web アプリケーションを実行 (または公開) すると、変換が取得されません。公開されたファイルを見ると、Web プロジェクトのルートに配置したリンク ファイルは正常に変換されていることがわかりますが、bin フォルダーから読み取られ、bin フォルダー内のファイルは変換されていません

私は実際に何を求めていますか?

私が本当に知りたいのは、何が間違っているのかということです。私が上で説明したことを試して、それを機能させた人はいますか? または、変換された構成ファイルを共有する別の方法を誰かが見つけたことに失敗しましたか?

いくつかのコード

私は非常に単純なテスト プロジェクトを作成しました。うまくいけば、私がやろうとしていることを、とりとめのない説明よりもうまく説明できます。お気軽にご覧ください。ビルドまたは公開すると、MVC3 プロジェクトの bin フォルダーにある Wcf.Client.config ファイルが変換されていないことがわかります。

4

1 に答える 1

2

この回答で適切な解決策を見つけました。

次の手順を実行しました。

1) ソリューション ディレクトリに構成を作成しました。私が名付けたのはCommonSettings.config

2)変換構成とソース構成を追加CommonSettings.Debug.configしましCommonSettings.Debug.configた(Microsoftのビルドタスクが何らかの理由でソースファイルに書き込めなかったため)CommonSettings.Source.config

3)。次に、共通のクラス ライブラリ (を必要とするすべてのプロジェクトで参照されるものCommonSettings.config) で、次の行を追加してプロジェクト ファイルを編集しました。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

<Target Name="BeforeBuild">
    <CallTarget Targets="TransformCommonSettings" />
</Target>

<Target Name="TransformCommonSettings">
    <ItemGroup>
        <ConfigsToTransform Include="..\CommonSettings.config" />
    </ItemGroup>

    <TransformXml 
        Source="@(ConfigsToTransform->'%(RelativeDir)%(Filename).Source%(Extension)')"
        Destination="%(FullPath)"
        Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)"
        Condition="Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)')" /> 
</Target>

4) 次にCommonSettings.config、Web アプリケーション (およびいくつかの Windows アプリケーションとテスト) にリンクとして追加しました。プロパティ ウィンドウで、[ビルド アクション]を[コンテンツ] に設定し、[出力ディレクトリコピー] を [常にコピー] に設定します 5)セクションをWeb.config登録した後、ファイルにcommonSettings次の行を追加しました。

<commonSettings configSource="bin\CommonSettings.config" />

6) テスト プロジェクトとコンソール/Windows アプリケーションの場合、App.config で適切な値を設定します。

<commonSettings configSource="CommonSettings.config" />

との両方が出力ディレクトリにコピーされるため、ここbinではパスを指定しません。App.configCommonSettings.config

選択した構成でビルドした後、CommonSettings.config正しく変換され、適切なバージョンが出力ディレクトリにコピーされます。

良い点は、SlowCheetah 拡張機能を必要とせず、ビルド サーバーで動作することです。タスク .dll を含めれば、私にとっては完璧です :)

問題の 1 つは、プロジェクトを実行する (F5 キーを押す) だけでは、変換が実行されないことです。このビルド タスクをすべてのプロジェクトに追加する必要があったため、ビルド プロセスが約 1 秒遅くなりましたが、私にとっては許容範囲です。

于 2012-08-04T18:30:30.190 に答える