Jam*_*der 10 app-config azure azure-worker-roles
我已经设置了一个新的worker角色,并通过SlowCheetah为它设置了几个新的配置转换.当我使用所选的一个新配置构建项目时,我确实看到configs文件夹在\ bin文件夹下创建,如您所期望的那样(对于例如\ bin\Production).
当我使用其中一个新配置打包云服务进行部署时,我的Web项目会对其配置进行适当的转换但是我的工作者角色(这只是一个库)即使我在\ bin文件夹下面看到一个更新的\ bin \生产.
看来天蓝色的包装工具忽略了工作者角色库的配置集.如何从适当的配置中选择配置文件?
Fra*_*ans 10
是的,你可以这样做 - 一旦你知道如何,它甚至很容易.
App.config不是按设计转换的,但幸运的是Azure团队使构建/部署过程非常可扩展,适用于这些场景.您需要做的事情已经得到了充分的记录,但是以非常迂回的方式,并且大多数文章假设您已经熟悉MSBuild脚本等.
在下面,您将找到需要添加到项目中的行,这将使这个Just Work成为可能.这应该不会超过五分钟.请注意,这不是一个黑客 - 整个Azure部署过程旨在支持这种事情.
如果您想了解更多信息,可以在底部找到相关文章的链接.
我们解决这个问题的方法是深入了解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>
Run Code Online (Sandbox Code Playgroud)
我发现@Frans的答案太复杂了,下面是我在互联网上找到的代码.鉴于您已经设置并运行了app.config转换,请在文本编辑器中打开您的云项目(.ccproj),找到以下行:
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
Run Code Online (Sandbox Code Playgroud)
并在其后插入以下内容:
<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)
并将YOUR-PROJECT-NAME替换为您的工作项目名称.
UPDATE
我实际上找到了一种更好的方法(MSBuild 4+):如果你的Azure项目中有app.config转换的工作角色超过1个,那么上面的脚本将不起作用.这是更通用的方式:
<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>
Run Code Online (Sandbox Code Playgroud)
确保您的云服务配置已设置。右键单击云项目,您应该会看到您尝试打包的配置。例如,我重命名并使用本地、测试和生产配置。您的云服务项目应包含 3 个配置文件:
右键单击云服务项目并选择“打包”,然后为您的部署选择正确的服务和构建配置。
注意:除非您添加 MS,否则 app.configs 不会在构建过程中进行转换 -请参阅此 SO 答案,了解在构建过程中进行转换的技术。但是,对于云部署,您最好结合使用 ServiceConfiguration.*.cscfg 文件CloudConfigurationManager.GetSetting("settingsKey")- CloudConfigurationManager.GetSetting 已在 SDK 1.7 中添加 - 如果在 Role 中,则它从 ServiceConfig 获取值,否则从 web.config/app.config 获取应用程序设置
| 归档时间: |
|
| 查看次数: |
4568 次 |
| 最近记录: |