Azure辅助角色配置文件转换

时间:2012-12-11 20:33:26

标签: azure app-config azure-worker-roles

我已经设置了一个新的辅助角色,并通过SlowCheetah为它设置了几个新的配置转换。当我使用所选的一个新配置构建项目时,我确实看到configs文件夹在\ bin文件夹下创建,如您所料(对于例如\ bin \ Production)。

当我使用其中一个新配置打包云服务进行部署时,我的Web项目会对其配置进行适当的转换但是我的工作者角色(这只是一个库)即使我在\ bin文件夹下面看到了更新\ BIN \生产。

天蓝色的打包工具似乎忽略了工作者角色库的配置集。如何从适当的配置中选择配置文件?

4 个答案:

答案 0 :(得分:10)

是的,你可以做到这一点 - 一旦你知道如何,这甚至很容易 App.config未按设计转换 ,但幸运的是,Azure团队使构建/部署过程非常可扩展,适用于这些场景。您需要做的事情已经得到了充分的记录,但是以非常迂回的方式,并且大多数文章假设您已经熟悉MSBuild脚本等。

您将在下面找到需要添加到项目中的行,这些行将使Just Work工作。这应该不会超过五分钟。请注意,这不是一个黑客 - 整个Azure部署过程旨在支持这种事情。

如果您想了解更多信息,可以在底部找到相关文章的链接。

一些概念点

  1. 在Azure中实现此类事情的推荐方法是使用Web.config和App.config,而是使用CloudConfigurationManager并使用角色设置。但是,有时候这不是正确的答案,通常是因为内置或第三方组件需要* .config设置(smtp,wcf,elmah等)。
  2. Web Config转换仅用于转换web.config。这意味着app.config未按设计转换
  3. Web配置转换仅在发布时启动,因此当您在本地运行时,即使在Cloud Emulator中,您的Web.config也不会被转换。
  4. 我们解决这个问题的方法是深入了解Cloud项目的构建过程。将项目部署到Azure时,将使用您可以挂钩的构建过程构建Cloud项目。简而言之,云项目构建Web和辅助角色,并将它们放在您的云项目下的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>
    

    备注

答案 1 :(得分:8)

我发现@Frans的答案过于复杂,下面是我在internet中找到的代码。鉴于您已经设置并运行了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项目中有超过1个工作者角色和app.config转换,那么上面的脚本将无效。这是更通用的方式:

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

答案 2 :(得分:0)

确保已设置Cloud Service配置。右键单击云项目,您应该看到要尝试打包的配置。例如,我重命名并使用Local,TEST&amp; PROD配置。然后,您的Cloud Service项目应包含3个配置文件:

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

右键单击Cloud Service项目,然后选择“Package”并选择正确的Service&amp;构建部署配置。

注意:除非您为构建过程中的转换技术添加MS - See this SO answer,否则不会在构建过程中转换app.configs。 Howerver,对于云部署,最好使用ServiceConfiguration。*。cscfg文件与CloudConfigurationManager.GetSetting("settingsKey")结合使用 - 在SDK 1.7中添加了CloudConfigurationManager.GetSetting - 如果在Role中,它从ServiceConfig获取值,否则从Web获取。 config / app.config appSettings

答案 3 :(得分:0)

有一招。也许有人会派上用场。 “Azure工作者角色”构建器包含标记为&#34;复制&#34;的文件。但是app.config将在WorkerRole1.dll.config(或其他一些)中进行转换,这在设计时是不存在的。欺骗VS:

卸载角色项目.csproj。

查找ItemGroup部分,其中包含项目中的文件。我接下来几个:

<None Include="app.config">
  <SubType>Designer</SubType>
</None>
<None Include="app.Debug.config">
  <DependentUpon>app.config</DependentUpon>
</None>
<None Include="app.Release.config">
  <DependentUpon>app.config</DependentUpon>
  <SubType>Designer</SubType>
</None>

然后在之前或之后设置:

<Content Include="bin\$(Configuration)\WorkerRole1.dll.config">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  <Link>WorkerRole1.dll.config</Link>
</Content>

这个技巧对于构建者&#34; WorkerRole1.dll.config&#34;存在为链接,这个将在构建(和转换)之后获得并包含在WorkerRole包中。