Azure sitesroot 不包含所有部署的文件

Azure sitesroot does not contain all deployed files

我正在使用 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[=15=] 文件夹,Web 角色似乎从该文件夹 运行。因为这些额外的文件是要动态加载的程序集,所以我希望它们与应用程序的其他程序集在​​一起。

这种行为是故意的还是我做错了什么?这个网上好像资料不多

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

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

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


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

  • DependenciesProject(Class 图书馆)
  • WebProject(MVC 应用程序)

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

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

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

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


这有帮助吗?

我最终使用了 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[=10=]\bin">
        <SourceDirectory path="C:\...\bin" />
      </Content>
    </Contents>
  </WebRole>
</ServiceDefinition>