在 Azure Functions 中放置共享程序集的依赖项的位置
Where to place the dependencies for shared assemblies in Azure Functions
我在 azure 函数中遇到私有程序集的奇怪问题,我有一个包含五个函数的 Azure Function App,它有一个共享的 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"
}
}
}
}
为了在我的 Function App 中进一步说明,我有五个不同的函数,它们依赖于 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)你必须这样做:
- 连接到 Functions 应用程序 ftp
- 使用您的函数在文件夹中创建 bin 文件夹(run.csx 在哪里)
- 将自定义程序集上传到新创建的 bin 文件夹
- 更新函数代码并添加引用
不幸的是,这个 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 之类的东西,甚至是你的功能应用程序)。您的函数只需要引用该包而不是它的依赖项,因为它们会自动解析。您可以在此处找到有关使用自定义来源的更多信息:
虽然一开始可能需要做更多的工作,但这两个选项都比您原来的方法有优势(包括消除函数需要知道间接依赖性)并且应该更可靠。
希望对您有所帮助!
我在 azure 函数中遇到私有程序集的奇怪问题,我有一个包含五个函数的 Azure Function App,它有一个共享的 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"
}
}
}
}
为了在我的 Function App 中进一步说明,我有五个不同的函数,它们依赖于 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)你必须这样做:
- 连接到 Functions 应用程序 ftp
- 使用您的函数在文件夹中创建 bin 文件夹(run.csx 在哪里)
- 将自定义程序集上传到新创建的 bin 文件夹
- 更新函数代码并添加引用
不幸的是,这个 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 之类的东西,甚至是你的功能应用程序)。您的函数只需要引用该包而不是它的依赖项,因为它们会自动解析。您可以在此处找到有关使用自定义来源的更多信息:
虽然一开始可能需要做更多的工作,但这两个选项都比您原来的方法有优势(包括消除函数需要知道间接依赖性)并且应该更可靠。
希望对您有所帮助!