如何在我的 Azure Functions 中使用 NuGet 包?

How can I use NuGet packages in my Azure Functions?

使用 Azure Functions,我可以在我的 C# 函数中引用和使用 NuGet 包吗?

是的!尽管 Azure Functions 门户当前不提供添加和管理 NuGet 包的机制,但运行时支持 NuGet 引用,并将确保在编译和执行函数时正确使用它们。

为了定义您的依赖项,您需要创建一个包含所需 NuGet 包引用的 Project.json 文件。这是一个添加对 Microsoft.ProjectOxford.Face 版本 1.1.0 的引用的示例:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.ProjectOxford.Face": "1.1.0"
      }
    }
   }
}

Azure Functions 门户提供了一种方便的方法来管理您的函数文件,我们可以使用它来创建(或上传)我们的 project.json:

  1. 在函数的 develop 部分,单击 view files
  2. 单击选项以创建 文件(如果您的计算机上有先前创建的 project.json 文件,您也可以单击选项以上传文件
  3. 将文件命名为 project.json 并定义您的包引用(您可以使用上面的示例作为模板)。

程序包还原过程将开始,您应该会在日志中看到类似于以下内容的输出 window:

2016-04-04T19:02:48.745 Restoring packages.
2016-04-04T19:02:48.745 Starting NuGet restore
2016-04-04T19:02:50.183 MSBuild auto-detection: using msbuild version '14.0' from 'D:\Program Files (x86)\MSBuild.0\bin'.
2016-04-04T19:02:50.261 Feeds used:
2016-04-04T19:02:50.261 C:\DWASFiles\Sites\facavalfunctest\LocalAppData\NuGet\Cache
2016-04-04T19:02:50.261 https://api.nuget.org/v3/index.json
2016-04-04T19:02:50.261 
2016-04-04T19:02:50.511 Restoring packages for D:\home\site\wwwroot\HttpTriggerCSharp1\Project.json...
2016-04-04T19:02:52.800 Installing Newtonsoft.Json 6.0.8.
2016-04-04T19:02:52.800 Installing Microsoft.ProjectOxford.Face 1.1.0.
2016-04-04T19:02:57.095 All packages are compatible with .NETFramework,Version=v4.6.
2016-04-04T19:02:57.189 
2016-04-04T19:02:57.189 
2016-04-04T19:02:57.455 Packages restored.

正如预期的那样,Azure Functions 运行时将自动添加对包程序集的引用,因此您无需使用 #r "AssemblyName" 显式添加程序集引用,您只需添加所需的 using声明您的函数并使用您引用的 NuGet 包中定义的类型。

其他部署选项

由于 Azure Functions 构建在应用服务之上,作为上述步骤的替代方法,您还可以访问标准 Azure Web 应用(Azure 网站)可用的所有出色部署选项。

这里有一些例子:

使用应用服务编辑器(摩纳哥)

为了使用应用服务编辑器 (Monaco) 直接从浏览器管理文件:

  • 在 Azure Functions 门户上,单击 Function app settings
  • 高级设置 部分下,单击 Go to App Service Settings
  • 单击 Tools 按钮
  • 开发下,点击应用服务编辑器
  • 如果尚未启用,请将其 On 并单击 Go
  • 加载后,将 project.json 文件拖放到函数的文件夹中(以函数命名的文件夹。

使用 SCM (Kudu) 端点

  • 导航至:https://<function_app_name>.scm.azurewebsites.net
  • 单击调试控制台 > CMD
  • 导航到 D:\home\site\wwwroot\<function_name>
  • 将您的 Project.json 文件拖放到文件夹中(到文件网格上)

FTP

持续集成

如果您启用持续集成并使用 project.json 文件部署您的函数,而您的 Function App 不是 运行,则一旦您的 Function App 初始化,包恢复将自动发生。建议您不要将您的project.lock.json文件添加到源代码管理。

预编译程序集

函数也可以部署为预编译程序集,在这种情况下,所有依赖管理都在 Visual Studio 中处理。此选项可用作任何版本 Visual Studio 上的标准 class 库,或通过使用 Visual Studio 2017 Azure Functions Tools.

请注意,Visual studio 2017 中的新 .csproj 格式也受支持。如果将项目创建为 ASPNET Web 项目,Azure Functions 运行时会在构建项目之前下载所有必需的 nuget 包。

您可以在 Azure Functions 中使用 Nuget 包。最简单的方法是使用 Visual Studio 2017 15.4,其中有一个 Azure Functions 模板。按照以下步骤

1) 添加 Azure 函数项目:右键单击解决方案并 select 添加新项目。转到 CLOUD 选项,您会在那里找到 "Azure Function" 项目。

2) 现在可以添加任何 Nuget 包了。展开 "DEPENDENCIES" 并右键单击它到 select 选项 "Manage Nuget Packages"。将出现 Nuget 包对话框,select 您要安装的任何 Nuget 包。请参阅下面的屏幕截图

3) 现在发布您的 Azure 函数,Visual Studio 将处理所有设置等。

只有使用 Visual Studio 2017 15.4 或更高版本才能使用此方法,否则您将不得不按照其他人解释的其他方式进行操作。

这个线程对我帮助很大 - 但我仍然浪费了几个小时试图让 Project.json 工作 - 但无济于事。

如果您在 2.x 版本中创建 Azure 函数,则需要以不同的方式执行此操作。

按照说明创建一个新文件,但将其命名为 function.proj。该文件有一个 XML 结构,用于通过 Nuget 导入库。

这是我为 .Net 导入 Amazon S3 SDK 的示例;

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="AWSSDK.S3" Version="3.3.26.3"/>
    <PackageReference Include="AWSSDK.Core" Version="3.3.29.1"/>
  </ItemGroup>

</Project>

保存后您应该会看到控制台更新,说明软件包正在安装。这确实没有很好的记录,我花了好几个小时才找到它。所以我希望这对某人有所帮助。

假设我们要使用 SFTP 客户端,它是一个外部库,存储在 NuGet.

中的某处

为此,根据最新的 Azure Functions 规范,执行以下操作:

  1. 打开 Azure 函数 中的文件部分并添加一个名为 function.proj.

    的新文件

    有关详细信息,请参阅 Microsoft documentation


  1. function.proj 中使用 XML 结构放置 Nuget 包引用(您可以在 *.csproj 文件中找到相同类型的结构如果您使用 Visual Studio 创建本地项目并在其中安装一些 NuGet 包)。


  1. 接下来,让我们将库引用包含到项目中:

    这里最重要的是你应该提供库的完整路径,就像你在示例中看到的那样:"D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. 接下来测试一些特定于库的代码:

  1. 最后,打开日志部分并保存代码。 一段时间后,您应该会看到 NuGet 包恢复日志。

    注意:这些日志也可能在保存 function.proj 文件或 运行 项目时出现。


如果库仍然显示为未知,请尝试使用 Azure 云资源管理器 将其 Dll 手动添加到 bin 文件夹中]Visual Studio.