10

新しいワーカー ロールをセットアップし、SlowCheetah を介して新しい構成変換をいくつかセットアップしました。新しい構成の 1 つを選択してプロジェクトをビルドすると、実際には、\bin フォルダーの下に構成フォルダーが作成されることがわかります (例: \bin\Production)。

新しい構成の 1 つを使用してデプロイ用にクラウド サービスをパッケージ化すると、Web プロジェクトの構成は適切に変換されますが、\bin フォルダーの下に更新された \bin\ が表示されていても、worker ロール (単なるライブラリ) は変換されません。製造。

azure パッケージ ツールが worker ロール ライブラリの構成セットを無視しているように見えます。適切な構成から構成ファイルを選択するにはどうすればよいですか?

4

4 に答える 4

10

はい、これを行うことができます。方法がわかれば、非常に簡単です。App.config は設計上
変換されませんが、幸いなことに、Azure チームはビルド/デプロイ プロセスをこのような種類のシナリオに合わせて非常に拡張可能にしました。必要なことは十分に文書化されていますが、非常に回りくどい方法であり、ほとんどの記事は、MSBuild スクリプトなどに既に精通していることを前提としています。

以下に、これを Just Work にするためにプロジェクトに入れる必要がある行を示します。これには 5 分もかかりません。これはハックではないことに注意してください。Azure デプロイ プロセス全体は、この種のことをサポートするように設計されています。

さらに詳しく知りたい場合は、下部に関連記事へのリンクがいくつかあります。

いくつかの概念的なポイント

  1. Azure でこの種のことを実現するための推奨される方法は、 Web.config と App.config を使用するのではなく、代わりに CloudConfigurationManager を使用し、Role Settings を使用することです。ただし、通常は *.config 設定 (smtp、wcf、elmah など) を必要とする組み込みまたはサードパーティのコンポーネントが原因で、それが正しい答えではない場合があります。
  2. Web Config 変換は、web.config のみを変換するように設計されています。これは、app.config が意図的に変換されないことを意味します
  3. Web Config の変換は、発行時にのみ有効になるように設計されているため、ローカルで実行すると、クラウド エミュレーターであっても、Web.config は変換されません。

これを解決する方法は、Cloud プロジェクトのビルド プロセスにフックすることです。プロジェクトを Azure にデプロイすると、クラウド プロジェクトは、フックできるビルド プロセスを使用してビルドされます。つまり、クラウド プロジェクトは Web ロールと worker ロールを構築し、それらをクラウド プロジェクトの Obj フォルダーに配置します。次に、基本的にすべてを圧縮するプロセスを実行し、最終的に結果を Bin フォルダーに入れます。そこから、"zip" ファイルと構成ファイルが Azure にアップロードされます。

ソリューション

Cloud.csproj ファイルを手動で編集することです (Visual Studio 内から行う場合は、最初にプロジェクトをアンロードする必要があります)。</project>次に、これを終了タグのすぐ上に追加します。

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets" />
    <PropertyGroup>
      <WorkerRoleDir>$(IntermediateOutputPath)WorkerRole1\</WorkerRoleDir>
      <AppConfigOriginal>$(WorkerRoleDir)WorkerRole1.dll.config</AppConfigOriginal>
      <AppConfigTransformer>$(SolutionDir)WorkerRole1\App.$(Configuration).config</AppConfigTransformer>
      <AppConfigAfterTransformed>$(WorkerRoleDir)AfterTransformed.config</AppConfigAfterTransformed>
    </PropertyGroup>
    <Target Name="TransformAppConfig" AfterTargets="AfterPackageComputeService">
      <Message Text="Transforming $(AppConfigOriginal) via $(AppConfigTransformer) to $(AppConfigAfterTransformed)" />
      <TransformXml Source="$(AppConfigOriginal)" Transform="$(AppConfigTransformer)" Destination="$(AppConfigAfterTransformed)" />
      <Copy SourceFiles="$(AppConfigOriginal)" DestinationFiles="$(WorkerRoleDir)App.Config.Original" />
      <Copy SourceFiles="$(AppConfigAfterTransformed)" DestinationFiles="$(AppConfigOriginal)" />
    </Target>

ノート

  • そこには、変更する必要があるハードコーディングされたパスがいくつかあります。それらをソフトにする方法があると確信していますが、それには私よりも多くの MSBuild スキルが必要です。
  • 変換は、ローカルの Cloud Emulator にデプロイするときに実際に実行されますが、使用されません。そのため、結果は変換されない Web.config の動作と一致します。ただし、変換が失敗すると、エミュレーターで実行しただけでもビルド エラーが発生します。
  • This other SO questionも参照してください
  • 詳細な調査
  • Tom Hollanders の高度にリンクされた、MSBuild からの直接デプロイに関する記事
于 2013-01-19T11:29:38.343 に答える
9

@Frans の回答は複雑すぎると思います。以下は、インターネットで見つけたコードです。既に app.config 変換がセットアップされ、機能していることを前提として、クラウド プロジェクト (.ccproj) をテキスト エディターで開き、次の行を見つけます。

<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />

の後に次を挿入します。

  <!-- Get worker role transform start -->
  <Target Name="CopyWorkerRoleConfigurations" AfterTargets="CopyWorkerRoleFiles">
    <Copy SourceFiles="$(WorkerTargetDir)\YOUR-PROJECT-NAME.dll.config" DestinationFolder="$(IntermediateOutputPath)YOUR-PROJECT-NAME" OverwriteReadOnlyFiles="true" />
  </Target>
  <!-- Get worker role transform end -->

YOUR-PROJECT-NAME をワーカー プロジェクト名に置き換えます。

アップデート

私は実際にこれを行うためのより良い方法を見つけました (MSBuild 4+): Azure プロジェクトで app.config 変換を使用する worker ロールが複数ある場合、上記のスクリプトは機能しません。より一般化された方法は次のとおりです。

  <Target Name="CopyWorkerRoleConfigurations" AfterTargets="CopyWorkerRoleFiles">
    <PropertyGroup>
         <RootFolder>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))</RootFolder>
    </PropertyGroup>

    <Copy SourceFiles="$(RootFolder)\%(ProjectName)\bin\$(Configuration)\%(EntryPoint).config" DestinationFolder="%(WorkerRoleReferences.OutputDir)" OverwriteReadOnlyFiles="true" />
  </Target>  
于 2013-05-25T11:21:49.477 に答える
0

クラウド サービス構成がセットアップされていることを確認します。クラウド プロジェクトを右クリックすると、パッケージ化しようとしている構成が表示されます。たとえば、Local、TEST & PROD 構成の名前を変更して使用します。クラウド サービス プロジェクトには、次の 3 つの構成ファイルが含まれている必要があります。

  • ServiceConfiguration.Local.cscfg
  • ServiceConfiguration.PROD.cscfg
  • ServiceConfiguration.TEST.cscfg

クラウド サービス プロジェクトを右クリックし、[パッケージ] を選択して、デプロイに適したサービスとビルドの構成を選択します。

注: MS を追加しない限り、app.configs はビルド プロセスで変換されません。ビルド プロセスで変換を行う手法については、この SO の回答を参照してください。ただし、クラウド展開の場合は、ServiceConfiguration.*.cscfg ファイルと組み合わせて使用​​することをお勧めしますCloudConfigurationManager.GetSetting("settingsKey")- CloudConfigurationManager.GetSetting は SDK 1.7 で追加されました - Role の場合、ServiceConfig から値を取得するか、web.config/app.config から値を取得しますアプリ設定

于 2012-12-11T20:56:05.217 に答える