我已经设置了一个新的辅助角色,并通过SlowCheetah为它设置了几个新的配置转换。当我使用所选的一个新配置构建项目时,我确实看到configs文件夹在\ bin文件夹下创建,如您所料(对于例如\ bin \ Production)。
当我使用其中一个新配置打包云服务进行部署时,我的Web项目会对其配置进行适当的转换但是我的工作者角色(这只是一个库)即使我在\ bin文件夹下面看到了更新\ BIN \生产。
天蓝色的打包工具似乎忽略了工作者角色库的配置集。如何从适当的配置中选择配置文件?
答案 0 :(得分: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>
答案 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个配置文件:
右键单击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包中。