将DLL移动到Azure Cloud Service部署包

时间:2015-05-07 21:51:18

标签: .net visual-studio azure msbuild azure-cloud-services

将文件复制到Azure云服务部署包而不在Web项目中包含或引用它是否有坚实,不费吹灰之力的方法?

我们有一个网站,我们将作为Azure云服务项目和内部部署的Web角色托管,每个网站都需要不同的数据访问层库。我们可以将所有必要的文件转储到项目中并将它们复制到构建中,然后根据环境变量动态选择要加载的程序集,但这看起来有点草率 - 可能有合理的原因我们不希望这些库坐在遥远的Azure区域的服务器上。这些程序集不是由项目直接引用,而是在运行时使用MEF或类似的机制加载。

这是我们尝试过的构建后脚本:

if "$(TargetProfile)" == "" (
     echo "OnPrem"
     xcopy /Y "$(ProjectDir)\lib\OnPrem\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"

) else (
     echo "Cloud"
     copy /Y "$(ProjectDir)\lib\Cloud\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"
)

这很有用,因为在构建时以及构建网站项目的msbuild /t:publish步骤部分期间,文件会按预期复制。但是,TestLibrary.dll文件未包含在云服务包中,未部署,并且无法在运行时加载。

在Azure部署之前是否已完成此类操作?我会承认,我们可能会以错误的方式接近这一点,但我还没有找到符合我们需要的优雅方法。

1 个答案:

答案 0 :(得分:2)

在玩了一段时间之后,我想我已经找到了一个或多或少达到我想要的策略。您可以将内容文件添加到与云服务一起打包和部署的CloudService角色,如下所示:

  1. 在Visual Studio中,右键单击CloudService项目中的WebRole,然后选择“添加现有项”
  2. 浏览并选择您要添加的.dll。
  3. 您甚至可以创建文件夹等组织这些文件。
  4. 这些文件将添加到.cspkg中的approot中,同样在部署时最终会出现在approot文件夹中。要解决此目录,我这样做了:

    string appRoot = Environment.GetEnvironmentVariable("RoleRoot");
    appRoot = Path.Combine(appRoot + @"\", @"approot\");
    

    您仍然需要一种方法来复制内部部署的本地.dll,但我们已经有了在现有部署过程中执行此操作的方法。使用CloudConfigurationManager中的配置设置,您可以告诉应用程序如何解析这些.dll应该驻留的目录,例如:

        var libDir = CloudConfigurationManager.GetSetting("Environment").Equals("Cloud") 
            ?
            Environment.GetEnvironmentVariable("RoleRoot")
                .Path.Combine(appRoot + @"\", @"approot\")
            :
            HostingEnvironment.MapPath("~\pathToOnPremDlls\")
    

    感觉模糊不清,但似乎运作得很好。