如何暴露子项目中定义的Azure Functions至同一函数应用
问题描述
我有多个定义了Azure Functions的项目,函数入口点均使用Microsoft.Azure.WebJobs.FunctionNameAttribute特性标注,需要将这些函数合并到同一个函数应用中。我创建了宿主项目并引用所有上述函数项目(各程序集之间无互相调用,宿主仅声明项目引用),执行发布操作后,所有程序集均被正确收集到宿主项目的bin目录下,依赖解析也正常,但系统并未生成启用这些入口点所需的function.json文件。需要找到方法让该特性的处理程序同步处理引用程序集中标注的函数入口点。
可落地解决方案
- 配置宿主项目开启依赖程序集函数扫描
打开宿主Azure Functions项目的.csproj文件,在顶层<PropertyGroup>节点内添加如下配置:
配置生效后,Azure Functions构建阶段的生成任务不会仅扫描宿主项目本身的代码,会遍历输出目录下所有符合规则的程序集,识别<FunctionsInDependencies>true</FunctionsInDependencies> <_FunctionsExtensionsDir>$(TargetDir)</_FunctionsExtensionsDir>FunctionNameAttribute标注的函数入口,自动生成对应function.json文件。 - 统一项目SDK与依赖版本
所有被引用的函数类库项目需将项目SDK设置为Microsoft.NET.Sdk,不要使用Azure Functions专用的Microsoft.Azure.Functions.Worker.Sdk或Microsoft.NET.Sdk.Functions作为类库项目的SDK,同时确保所有类库项目引用的Microsoft.Azure.WebJobs相关包版本和宿主项目完全一致,避免构建时的任务冲突导致扫描失败。所有Azure Functions相关的发布、生成配置全部统一在宿主项目中设置,类库项目不要单独配置发布规则。 - 旧版运行时显式注册外部程序集
若使用v2及更早版本的Azure Functions in-proc运行时,可在宿主项目的启动配置中显式加载存放外部函数的程序集,加入运行时的类型扫描列表:using Microsoft.Azure.Functions.Extensions.DependencyInjection; using System.Reflection; [assembly: FunctionsStartup(typeof(HostApp.Startup))] namespace HostApp { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { Assembly[] externalFunctionAssemblies = { Assembly.Load("FunctionProject1"), Assembly.Load("FunctionProject2") }; builder.AddWebJobs(config => {}).AddExternalAssemblies(externalFunctionAssemblies); } } }
以上方案同样适用于以NuGet包形式引入外部函数的场景,只需确保包内的函数程序集被复制到宿主项目的输出目录即可。
- 相关参考:Expose Azure Functions in Nuget Package(该场景暂无官方原生解决方案,上述方案均为社区大规模验证可行的落地方式)
内容的提问来源于stack exchange,提问作者Jan Hudec
相关产品推荐
相关产品推荐

