繁体   English   中英

在Azure Functions中将共享程序集的依赖关系放在何处

[英]Where to place the dependencies for shared assemblies in Azure Functions

我在使用Azure函数的私有程序集时遇到了奇怪的问题,我有一个带有五个函数的Azure Function应用程序,这些函数有一个共享bin文件夹,我将程序集放在其中,这些程序集又依赖于Entity Framework和LinqKit,我在其中添加了相关性每个函数的所有project.json文件,但专用程序集无法引用这些文件并失败。 请帮忙。 Project.json-

{
  "frameworks": {
    "net46":{
      "dependencies": {
         "EntityFramework": "6.1.3",
         "Newtonsoft.Json": "9.0.1",
         "LinqKit": "1.1.7.2"
      }      
    }
   }
}

为了进一步说明我的功能应用程序,我有五个不同的功能,它们依赖于2个私有程序集,并且我不想在每个功能中保留单独的副本(因为这可能导致同一dll的不同版本在不同的文件夹中导致问题),所以我有在引用了私有程序集的位置创建了一个共享bin文件夹,但由于这些私有程序集进一步依赖于某些无法找到它们的nuget程序包,因此出现了问题-

#r "..\bin\Marketware.Domain.dll"
#r "..\bin\Marketware.AzureIntegration.dll"

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics.Eventing.Reader;

如果要使用私有程序集(而不是来自nuget的程序集),则必须执行以下操作:

  1. 连接到功能应用程序ftp
  2. 使用您的函数在文件夹中创建bin文件夹(在run.csx中)
  3. 将您的自定义程序集上载到新创建的bin文件夹中
  4. 更新功能代码并添加参考

不幸的是,该dll需要放在每个功能文件夹中。

#r "CustomAssembly.dll"

using System.Net;
using CustomAssembly;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    CustomAssemblyClass.MethodName(); // here call your method
    return req.CreateResponse(HttpStatusCode.OK, "");
}

乍一看,它会按预期工作,将花费一些时间来尝试重现您的方案。 同时,您有几个选择:

1-部署共享程序集时,请从项目输出中复制所有二进制文件,包括它们的依赖项。 共享的程序集文件夹将位于探测逻辑中,并从那里进行解析。 这也将不需要使用project.json来引用每个函数的依赖项。

2-为您的共享程序集创建一个NuGet程序包,并在该程序包上指定您的程序包依赖性(EF和LinqKit),将该程序包发布到私有提要(可能类似于MyGet或功能应用程序中的文件夹)。 您的函数将只需要引用该程序包,而不是其依赖项,因为它们将被自动解析。 您可以在此处找到有关使用自定义源的更多信息: 如何将自定义NuGet提要与Azure Functions一起使用?

尽管一开始可能需要更多的工作,但是这两种选择都比您的原始方法有优势(包括消除了对函数的了解,从而无需间接依赖),并且应该更可靠。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM