¿Cómo puedo usar paquetes NuGet en mis funciones de Azure?

112

Con Azure Functions , ¿puedo hacer referencia y usar paquetes NuGet en mi función C #?

Fabio Cavalcante
fuente
Tuve que actualizar mi archivo project.json manualmente para reiniciar el servicio de función ... luego restauró mis paquetes nuget. ¿Alguien conoce una mejor manera de reiniciar el servicio para que restaure los paquetes? Kudu no ayudó
Erik Bergstedt
1
Puede utilizar la opción de restauración del sitio estándar en la configuración de la aplicación de funciones. Pero tenga en cuenta que, cuando se ejecuta una función por primera vez, si el archivo project.json contiene un conjunto de referencias que difiere de lo que se restauró anteriormente, se producirá una operación de restauración en ese momento, automáticamente.
Fabio Cavalcante

Respuestas:

141

¡Si! Aunque el portal de Azure Functions no proporciona actualmente un mecanismo para agregar y administrar paquetes NuGet, el tiempo de ejecución admite referencias NuGet y se asegurará de que se usen correctamente al compilar y ejecutar sus funciones.

Para definir sus dependencias, debe crear un Project.jsonarchivo con las referencias del paquete NuGet necesarias. Aquí hay un ejemplo que agrega una referencia a la Microsoft.ProjectOxford.Faceversión 1.1.0:

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

El portal de Azure Functions proporciona una forma conveniente de administrar sus archivos de funciones, que podemos usar para crear (o cargar) nuestros project.json:

  1. En la sección de desarrollo de la función , haga clic en ver archivos
  2. Haga clic en la opción para crear un archivo (también puede hacer clic en la opción para cargar un archivo si tiene un project.jsonarchivo creado previamente en su máquina
  3. Nombre el archivo project.jsony defina las referencias de su paquete (puede usar el ejemplo anterior como plantilla).

El proceso de restauración del paquete comenzará y debería ver un resultado similar al siguiente en la ventana de registro:

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.

Como se esperaba, el tiempo de ejecución de Azure Functions agregará automáticamente las referencias a los ensamblados del paquete, por lo que NO es necesario que agregue explícitamente referencias de ensamblado usando #r "AssemblyName", simplemente puede agregar las usingdeclaraciones requeridas a su función y usar los tipos definidos en el paquete NuGet que ' he referenciado.

Opciones de implementación adicionales

Dado que Azure Functions se basa en App Services, como alternativa a los pasos anteriores, también tiene acceso a todas las excelentes opciones de implementación disponibles para las aplicaciones web de Azure estándar (sitios web de Azure).

Aquí hay unos ejemplos:

Uso de App Service Editor (Mónaco)

Para administrar sus archivos directamente desde su navegador utilizando App Service Editor (Mónaco):

  • En el portal de Azure Functions, haga clic en Function app settings
  • En la sección Configuración avanzada , haga clic enGo to App Service Settings
  • Haga clic en el Toolsbotón
  • En Desarrollar , haga clic en App Service Editor
  • Gírelo Onsi aún no está habilitado y haga clic enGo
  • Una vez que se cargue, arrastre y suelte su project.jsonarchivo en la carpeta de su función (la carpeta que lleva el nombre de su función.

Usando el punto final SCM (Kudu)

  • Navegar a: https://<function_app_name>.scm.azurewebsites.net
  • Haga clic en Debug Console> CMD
  • Navegar a D:\home\site\wwwroot\<function_name>
  • Arrastre y suelte su Project.jsonarchivo en la carpeta (en la cuadrícula de archivos)

FTP

Integración continua

Si habilita la integración continua e implementa su función con un project.jsonarchivo cuando su aplicación de función no se está ejecutando, la restauración del paquete se realizará automáticamente una vez que se inicialice su aplicación de función. Se recomienda que no agregue su project.lock.jsonarchivo al control de código fuente.

Ensamblados precompilados

Las funciones también se pueden implementar como ensamblados precompilados y, en este caso, toda la administración de dependencias se maneja en Visual Studio. Esta opción se puede usar como bibliotecas de clases estándar en cualquier versión de Visual Studio o mediante Visual Studio 2017 Azure Functions Tools .

Fabio Cavalcante
fuente
1
¿Qué hay function script rooten tu último párrafo? Entiendo que es donde project.jsonse encuentra. ¿Es eso correcto?
justinyoo
2
@JustInChronicles, esa es en realidad una carpeta más arriba. El project.jsonestá en su carpeta de función, que es una carpeta secundaria de la raíz guión. La raíz del script se asigna a su wwwrootcarpeta en Azure.
Fabio Cavalcante
¡Gracias por la aclaración!
justinyoo
@FabioCavalcante, Me encanta el paquete nuget que pones en el ejemplo, ¡tantas cosas increíbles con servicios cognitivos azules!
Thomas
Tenga en cuenta que 'Visual Studio Online' mencionado en la respuesta de stackoverflow anterior stackoverflow.com/a/36411537/5288052 está disponible en las herramientas de Azure como 'App Service Editor' (consulte stackoverflow.com/a/38173438/5288052 )
Stefano Spinucci
35

Este hilo me ayudó mucho, pero todavía perdí algunas horas tratando de que Project.json funcionara, sin éxito.

Si crea una función de Azure en la versión 2.x, debe hacerlo de una manera diferente.

Cree un nuevo archivo como se indica, pero asígnele el nombre function.proj . Este archivo tiene una estructura XML para importar bibliotecas a través de Nuget.

Este es mi ejemplo al importar el SDK de Amazon S3 para .Net;

<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>

al guardar esto, debería ver la actualización de la consola que indica que los paquetes se están instalando. Esto realmente no está bien documentado y me tomó algunas horas descubrirlo. Así que espero que esto ayude a alguien.

James Cooke
fuente
2
Esto fue de gran ayuda, gracias por publicar. Aquí hay un enlace con más información.
1
Como tú, pasé horas haciendo lo mismo. Eso funciona. Muchas gracias. ¡Amo stackoverflow!
karrtojal
13

Puede usar paquetes de Nuget en sus funciones de Azure. La forma más sencilla será usar Visual Studio 2017 15.4 donde hay una plantilla para Azure Functions. Siga los pasos a continuación

1) Agregar proyecto de función de Azure: haga clic con el botón derecho en la solución y seleccione Agregar nuevo proyecto. Vaya a la opción CLOUD, allí encontrará el proyecto "Función Azure".

Función Azure

2) Ahora es bonito agregar cualquier paquete Nuget. Expanda "DEPENDENCIAS" y haga clic derecho sobre él para seleccionar la opción "Administrar paquetes Nuget". Aparecerá el cuadro de diálogo Paquete Nuget, seleccione cualquier paquete Nuget que desee instalar. Ver captura de pantalla a continuación

3) Ahora publique su función de Azure, Visual Studio se encargará de todas las configuraciones, etc.

Este método funcionará solo si usa Visual Studio 2017 15.4 o superior; de lo contrario, tendrá que seguir otras formas como lo explicaron otros.

Sujit Singh
fuente
1
Este es el flujo estándar para las bibliotecas de clases / VS (que es lo que es el proyecto de Azure Functions) y no es específico de Azure Functions. Los únicos pasos específicos de Azure Functions son los que se documentan a continuación. Agregaré una nota a mi respuesta original, incluidos los detalles del procedimiento actualizado en 2.0.
Fabio Cavalcante
7

Supongamos que queremos usar el SFTPcliente, que es una biblioteca externa, almacenada en algún lugar de NuGet.

Para lograrlo, de acuerdo con la última especificación de Azure Functions , haga lo siguiente:

  1. Abra la sección de archivos dentro de su función de Azure y agregue un nuevo archivo llamado function.proj.

    ingrese la descripción de la imagen aquí Para obtener más información, consulte la documentación de Microsoft .


  1. Dentro de eso, function.projcoloque la Nugetreferencia del paquete usando la XMLestructura (el mismo tipo de estructura que puede encontrar dentro del *.csprojarchivo si crea un proyecto local con Visual Studio e instala algún NuGetpaquete en él).

    ingrese la descripción de la imagen aquí


  1. A continuación, incluyamos la referencia de la biblioteca al proyecto: ingrese la descripción de la imagen aquí

    Lo que es esencial aquí es que debe proporcionar una ruta completa a la biblioteca, como en el ejemplo que puede ver: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. A continuación, pruebe algún código específico de la biblioteca: ingrese la descripción de la imagen aquí

  1. Finalmente, abra la sección Registros y guarde el código. Después de un tiempo, debería ver el NuGetregistro de restauración de paquetes. ingrese la descripción de la imagen aquí

    Nota: estos registros también pueden aparecer al guardar un function.projarchivo o al ejecutar el proyecto.


En caso de que la biblioteca siga apareciendo como desconocida, intente agregarla Dllmanualmente en la carpeta bin usando el Explorador de Azure Cloud desde Visual Studio .

ingrese la descripción de la imagen aquí

Arsen Khachaturyan
fuente
¿Ha cambiado algo desde esta respuesta? Esto parece que ya no funciona. Veo un "Error del servicio de compilación": se ejecutó 'Functions.TimerTrigger2' (Falló, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) No se pudo encontrar el archivo 'D: \ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll '.
usuario
Cuando está instalando un script a través de function.proj, la ubicación del mismo dllaparece en la sección Registros después de un período de tiempo. A veces es necesario volver a cargar la página para la función de Azure, a veces presionar el botón "Ejecutar" para ver la instalación de los paquetes NuGet y también la ubicación. Verifique lo que se está imprimiendo en la sección Registro como ubicación e intente poner eso.
Arsen Khachaturyan
2

Tenga en cuenta que también se admite el nuevo formato .csproj en Visual Studio 2017. Si crea su proyecto como un proyecto web ASPNET, el tiempo de ejecución de Azure Functions descarga todos los paquetes nuget necesarios antes de compilar su proyecto.

resolviendoJ
fuente
Para el proyecto web ASP.NET, VS 2015 también funciona. Para las herramientas de Azure Functions, eso es solo VS 2017. La diferencia clave es que está implementando bits precompilados (y dependencias), por lo que el tiempo de ejecución no está manejando la restauración por usted, pero sí, esa es de hecho una forma más nueva de escribir funciones y administrar dependencias. Actualizaré la respuesta para reflejar las últimas funciones.
Fabio Cavalcante