如何在Azure函数中使用NuGet包?


112

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


我必须手动更新我的project.json文件,以便重新启动功能服务。然后它恢复了我的nuget包。有谁知道重启服务以恢复软件包的更好方法?Kudu没有帮助
Erik Bergstedt

1
您可以在功能应用程序设置中使用标准站点还原选项。但是请记住,在第一次执行函数时,如果project.json文件包含一组与以前还原的引用不同的引用,则还原操作将在那时自动进行。
Fabio Cavalcante

Answers:


141

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

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

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

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

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

程序包还原过程将开始,您将在日志窗口中看到与以下类似的输出:

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\14.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功能是在App Services之上构建的,因此可以替代上述步骤,因此您还可以访问标准Azure Web Apps(Azure网站)可用的所有出色部署选项。

这里有些例子:

使用App Service编辑器(摩纳哥)

为了使用App Service编辑器(摩纳哥)直接从浏览器直接管理文件,请执行以下操作:

  • 在Azure Functions门户上,单击 Function app settings
  • 在“ 高级设置”部分下,点击Go to App Service Settings
  • 点击Tools按钮
  • 在“ 开发”下,单击“ App Service编辑器”
  • 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上用作标准类库,也可以通过使用Visual Studio 2017 Azure函数工具用作标准类库。


1
什么是function script root你的最后一个段落?我知道它在哪里project.json。那是对的吗?
justinyoo

2
@JustInChronicles,实际上是该文件夹上的一个文件夹。该project.json是你的文件夹的功能,这是脚本根的子文件夹。脚本根目录映射到wwwrootAzure中的文件夹。
法比奥·卡瓦坎特

感谢您的澄清!
justinyoo

@FabioCavalcante,喜欢您在示例中放入的nuget程序包,其中许多令人惊奇的事情都是天蓝色的认知服务!
汤玛斯(Thomas)

请注意,在计算器回答上述“Visual Studio的在线” stackoverflow.com/a/36411537/5288052可从Azure工具为“应用服务编辑器”(见stackoverflow.com/a/38173438/5288052
斯蒂法诺Spinucci

35

这个线程对我有很大帮助-但是我仍然浪费了几个小时试图使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>

保存后,您应该看到控制台更新说明正在安装软件包。确实没有足够的文档记录,我花了好几个小时才能找到答案。因此,我希望这对某人有帮助。


2
非常感谢您的张贴。是更多信息的链接。

1
像你一样,我花了几个小时做同样的事情。这样可行。非常感谢。爱stackoverflow!
kartojal

13

您可以在Azure Functions中使用Nuget程序包。最简单的方法是使用Visual Studio 2017 15.4(其中存在Azure函数的模板)。遵循以下步骤

1)添加Azure功能项目:右键单击解决方案,然后选择添加新项目。转到“ CLOUD”选项,您将在其中找到“ Azure Function”项目。

Azure功能

2)现在可以添加任何Nuget软件包了。展开“ DEPENDENCIES”,然后右键单击它以选择选项“ Manage Nuget Packages”。此时将显示“ Nuget软件包”对话框,选择要安装的任何Nuget软件包。见下面的截图

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

仅当您使用Visual Studio 2017 15.4或更高版本时,此方法才有效,否则,您将必须遵循其他人所解释的其他方法。


1
这是VS / Class库的标准流程(这是Azure Functions项目),并且不特定于Azure Functions。特定于Azure Functions的唯一步骤是下面记录的步骤。我将在原始答案中添加注释,包括2.0中更新过程的详细信息。
法比奥·卡瓦坎特

7

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

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

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

    在此处输入图片说明 有关更多信息,请参阅Microsoft 文档


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

    在此处输入图片说明


  1. 接下来,让我们包括对项目的库引用: 在此处输入图片说明

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


  1. 接下来测试一些特定于库的代码: 在此处输入图片说明

  1. 最后,打开“日志”部分并保存代码。一段时间后,您应该会看到NuGet软件包还原日志。 在此处输入图片说明

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


在情况下,如果库中仍然显示为未知的尝试添加它的Dll“手动S插入bin文件夹使用Azure的云资源管理器Visual Studio中

在此处输入图片说明


自从这个答案以来有什么改变吗?这似乎不再起作用。我看到“编译服务错误”-已执行'Functions.TimerTrigger2'(失败,Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c)找不到文件'D:\ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll”。
用户

当您通过来安装脚本时function.projdll一段时间后,的位置会出现在“日志”部分中。有时您需要再次重新加载Azure功能的页面,有时单击“运行”按钮以查看NuGet软件包的安装以及位置。请检查“日志”部分中正在打印的内容,然后尝试放入。
Arsen Khachaturyan

2

请注意,还支持Visual Studio 2017中的新.csproj格式。如果您将项目创建为ASPNET Web项目,则在构建项目之前,Azure Functions运行时会下载所有必要的nuget程序包。


对于ASP.NET Web项目,VS 2015也可以使用。对于Azure功能工具,仅是VS 2017。关键的区别在于,您正在部署预编译的位(和依赖项),因此运行时不会为您处理还原,但是是的,这确实是一种编写函数和管理依赖项的新方法。我将更新答案以反映最新功能。
法比奥·卡瓦坎特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.