【问题标题】:Azure sitesroot does not contain all deployed filesAzure 站点根目录不包含所有已部署的文件
【发布时间】:2015-03-23 16:52:35
【问题描述】:

我正在使用 VS 2013 将 Web 角色部署到 Azure。我在我的 .csdef 文件中添加了一个 Contents 元素,以部署 Azure 部署包中未包含的额外文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2014-06.2.4">
  <WebRole name="..." vmsize="Small">
    <!-- snip -->

    <Contents>
      <Content destination="bin/">
        <SourceDirectory path="C:\...\bin"/>
      </Content>
    </Contents>
  </WebRole>
</ServiceDefinition>

部署包后,我可以看到额外的文件被放入实例的F: 驱动器上的approot 文件夹中。但是,这些文件永远不会部署到sitesroot\0 文件夹,Web 角色似乎从该文件夹运行。因为这些额外文件是要动态加载的程序集,所以我希望它们与应用程序的其他程序集一起使用。

这种行为是故意的还是我做错了什么?网上好像没有太多这方面的资料。

【问题讨论】:

    标签: azure azure-web-roles


    【解决方案1】:

    行为是as per the documentation,它表明部署的位置是相对于角色的 APPROOT(您所看到的行为)。

    如果您希望将它们部署到您网站的 bin 文件夹中,您需要将它们打包为 Visual Studio 解决方案的一部分。

    【讨论】:

    • 我了解该行为如文档中所述。我只是认为这些文件夹会以某种方式同步。我无法将这些文件添加到解决方案中(无论如何都不能以“参考程序集和复制本地”的方式)。如何做到这一点?
    • 您可以使用构建后步骤手动包含它们,方法是确保将它们复制到解决方案中的正确文件夹,以便 cspack (msdn.microsoft.com/en-us/library/azure/gg433133.aspx) 将它们打包到您的部署包中。
    【解决方案2】:

    您可以将 DLL 添加到项目的根目录(添加 -> 现有项)。如果您使用该 DLL 并将 Build Action 设置更改为 Content 并将 Copy to Output Directory 设置为 Copy Always ,那么我认为这将确保 DLL 最终位于您的 BIN 文件夹中,或等效。


    我过去做过的一个例子: 解决方案中的两个项目名为:

    • DependenciesProject(类库)
    • WebProject(MVC 应用)

    我需要包含一些需要捆绑到已编译包中的特定 DLL,但要使用的特定 DLL 会根据我的编译目标(x64 与 x86)而改变。我们选择采用的解决方案是让DependenciesProject 执行我在上面为您描述的操作,我们修改了.csproj 文件以根据编译时指定的目标更改这些本机DLL 的路径(我们禁用Any CPU)。

    所以DependenciesProject 在根目录中有这些 DLL(.csproj 对我们的 Nuget packages 文件夹中存在的 DLL 的动态路径进行了一些调整)并且解决方案资源管理器中的 DLL 有 @ 987654334@ 设置为 ContentCopy to Output Directory 设置为 Copy Always。这意味着无论何时编译 DependenciesProject.dll 文件,它都会将其他 DLL 移动到与该 .DLL 文件相同的输出文件夹中。

    现在WebProject 项目将有一个对DependenciesProject 的项目引用。这意味着每次我尝试编译WebProject时,它都会先编译DependenciesProject,然后将其输出文件夹复制到WebProject的输出文件夹中。

    最终结果:DependenciesProject.dllMySpecial.dll 在我每次需要时都存在于我的 Web 应用程序中。


    这有帮助吗?

    【讨论】:

      【解决方案3】:

      我最终使用了 Content 元素,但使用了不同的目标路径,指向 sitesroot 文件夹。这有点像 hack,但至少它可以在不深入 MSBuild 或手动打包部署的情况下工作。

      <ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2014-06.2.4">
        <WebRole name="..." vmsize="Small">
          <!-- snip -->
      
          <Contents>
            <Content destination="..\sitesroot\0\bin">
              <SourceDirectory path="C:\...\bin" />
            </Content>
          </Contents>
        </WebRole>
      </ServiceDefinition>
      

      【讨论】:

        猜你喜欢
        • 2015-10-27
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2018-02-12
        • 2011-03-04
        • 2016-08-18
        • 2012-10-02
        相关资源
        最近更新 更多