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

时间:2016-10-19 13:50:11

标签: azure azure-functions

我面临着azure函数中的privates程序集的奇怪问题,我有一个Azure函数应用程序,其中包含五个函数,这些函数有一个共享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;

2 个答案:

答案 0 :(得分:4)

如果你想使用你的私人程序集(不是来自nuget),你必须这样做:

  1. 连接到功能应用程序ftp
  2. 在您的函数文件夹中创建bin文件夹(其中是run.csx)
  3. 将自定义程序集上传到新创建的bin文件夹
  4. 更新功能代码并添加参考
  5. 不幸的是,这个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 :(得分:1)

将花费一些时间尝试重新编写您的方案,因为乍一看,它应该按预期工作。与此同时,您有几个选择:

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

2-为您的共享程序集创建一个NuGet包,并在该包上指定您的包依赖项(EF和LinqKit),将该包发布到私有源(可能类似于MyGet,甚至是函数中的文件夹)应用程序)。您的函数只需要引用该包而不是它的依赖项,因为它们会自动解析。您可以在此处找到有关使用自定义来源的更多信息:How do you use custom NuGet feeds with Azure Functions?

虽然最初可能需要更多的工作,但这两个选项都优于原始方法(包括不需要让函数了解间接依赖性),并且应该更可靠。

希望这有帮助!