Wie kann ich NuGet-Pakete in meinen Azure-Funktionen verwenden?


112

Kann ich mithilfe von Azure-Funktionen NuGet-Pakete in meiner C # -Funktion referenzieren und verwenden?


Ich musste meine Datei project.json manuell aktualisieren, um den Funktionsdienst neu zu starten. Dann wurden meine Nuget-Pakete wiederhergestellt. Kennt jemand einen besseren Weg, um den Dienst neu zu starten, damit er die Pakete wiederherstellt? Kudu hat nicht geholfen
Erik Bergstedt

1
Sie können die Standardoption zur Wiederherstellung der Site in den Einstellungen der Funktions-App verwenden. Beachten Sie jedoch, dass bei der ersten Ausführung einer Funktion automatisch ein Wiederherstellungsvorgang ausgeführt wird, wenn die Datei project.json eine Reihe von Referenzen enthält, die sich von den zuvor wiederhergestellten unterscheiden.
Fabio Cavalcante

Antworten:


141

Ja! Obwohl das Azure-Funktionsportal derzeit keinen Mechanismus zum Hinzufügen und Verwalten von NuGet-Paketen bietet, unterstützt die Laufzeit NuGet-Referenzen und stellt sicher, dass diese beim Kompilieren und Ausführen Ihrer Funktionen korrekt verwendet werden.

Um Ihre Abhängigkeiten zu definieren, müssen Sie eine Project.jsonDatei mit den erforderlichen NuGet-Paketreferenzen erstellen. Hier ist ein Beispiel, das einen Verweis auf Microsoft.ProjectOxford.FaceVersion 1.1.0 hinzufügt :

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

Das Azure-Funktionsportal bietet eine bequeme Möglichkeit zum Verwalten Ihrer Funktionsdateien, mit der wir Folgendes erstellen (oder hochladen) können project.json:

  1. Klicken Sie im Entwicklungsbereich der Funktion auf Dateien anzeigen
  2. Klicken Sie auf die Option zum Erstellen einer Datei (Sie können auch auf die Option zum Hochladen einer Datei klicken, wenn Sie eine zuvor erstellte project.jsonDatei auf Ihrem Computer haben
  3. Benennen Sie die Datei project.jsonund definieren Sie Ihre Paketreferenzen (Sie können das obige Beispiel als Vorlage verwenden).

Der Paketwiederherstellungsprozess beginnt und Sie sollten eine Ausgabe ähnlich der folgenden in Ihrem Protokollfenster sehen:

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.

Wie erwartet fügt die Azure Functions-Laufzeit die Verweise automatisch zu den Paketassemblys hinzu. Sie müssen also KEINE Assemblyreferenzen explizit hinzufügen, indem #r "AssemblyName"Sie einfach die erforderlichen usingAnweisungen zu Ihrer Funktion hinzufügen und die im NuGet-Paket definierten Typen verwenden. habe verwiesen.

Zusätzliche Bereitstellungsoptionen

Da Azure-Funktionen als Alternative zu den oben genannten Schritten auf App Services basieren, haben Sie auch Zugriff auf alle wichtigen Bereitstellungsoptionen, die für Standard-Azure-Webanwendungen (Azure-Websites) verfügbar sind.

Hier sind einige Beispiele:

Verwenden des App Service Editors (Monaco)

So verwalten Sie Ihre Dateien direkt über Ihren Browser mithilfe des App Service Editor (Monaco):

  • Klicken Sie im Azure-Funktionsportal auf Function app settings
  • Unter dem Erweiterte Einstellungen Abschnitt, klicken Sie aufGo to App Service Settings
  • Klicken Sie auf die ToolsSchaltfläche
  • Klicken Sie unter Entwickeln auf App Service Editor
  • Schalten Sie es ein, Onwenn es noch nicht aktiviert ist, und klicken Sie aufGo
  • Ziehen Sie Ihre project.jsonDatei nach dem Laden per Drag & Drop in den Ordner Ihrer Funktion (den nach Ihrer Funktion benannten Ordner).

Verwenden des SCM-Endpunkts (Kudu)

  • Navigieren Sie zu: https://<function_app_name>.scm.azurewebsites.net
  • Klicken Sie auf Debug Console> CMD
  • Navigieren Sie zu D:\home\site\wwwroot\<function_name>
  • Ziehen Sie Ihre Project.jsonDatei per Drag & Drop in den Ordner (in das Dateiraster).

FTP

Kontinuierliche Integration

Wenn Sie die kontinuierliche Integration aktivieren und Ihre Funktion mit einer project.jsonDatei bereitstellen, während Ihre Funktions-App nicht ausgeführt wird, erfolgt die Paketwiederherstellung automatisch, sobald Ihre Funktions-App initialisiert wird. Es wird empfohlen , dass Sie nicht fügen Sie Ihre project.lock.jsonDatei auf Quellcodeverwaltung.

Vorkompilierte Baugruppen

Funktionen können auch als vorkompilierte Assemblys bereitgestellt werden. In diesem Fall wird die gesamte Abhängigkeitsverwaltung in Visual Studio ausgeführt. Diese Option kann als Standardklassenbibliothek in jeder Version von Visual Studio oder mithilfe der Azure-Funktionstools von Visual Studio 2017 verwendet werden .


1
Was ist function script rootin Ihrem letzten Absatz? Ich verstehe, dass es dort ist, wo project.jsones sich befindet. Ist das korrekt?
Justininyoo

2
@ JustInChronicles, das ist tatsächlich ein Ordner davon. Das project.jsonbefindet sich in Ihrem Funktionsordner, einem untergeordneten Ordner des Skriptstamms. Das Skriptstammverzeichnis wird Ihrem wwwrootOrdner in Azure zugeordnet.
Fabio Cavalcante

Danke für die Klarstellung!
Justinyoo

@FabioCavalcante, liebe das Nuget-Paket, das du als Beispiel gegeben hast, so viele erstaunliche Dinge mit azurblauen kognitiven Diensten !!!
Thomas

Beachten Sie, dass "Visual Studio Online", das in der obigen Stackoverflow-Antwort auf stackoverflow.com/a/36411537/5288052 erwähnt ist, in den Azure-Tools als "App Service Editor" verfügbar ist (siehe stackoverflow.com/a/38173438/5288052 )
Stefano Spinucci

35

Dieser Thread hat mir sehr geholfen - aber ich habe immer noch ein paar Stunden damit verbracht, Project.json zum Laufen zu bringen - ohne Erfolg.

Wenn Sie eine Azure-Funktion in Version 2.x erstellen, müssen Sie dies auf andere Weise tun.

Erstellen Sie eine neue Datei wie angegeben, nennen Sie sie jedoch function.proj . Diese Datei verfügt über eine XML-Struktur zum Importieren von Bibliotheken über Nuget.

Hier ist mein Beispiel für den Import des Amazon S3 SDK für .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>

Nach dem Speichern sollte das Konsolenupdate angezeigt werden, das besagt, dass die Pakete installiert werden. Das ist wirklich nicht gut dokumentiert und ich habe ein paar Stunden gebraucht, um das herauszufinden. Ich hoffe, das hilft jemandem.


2
Dies war eine große Hilfe, danke für die Veröffentlichung. Hier ist ein Link mit mehr Infos.

1
Wie Sie habe ich Stunden damit verbracht, dasselbe zu tun. Das funktioniert. Vielen Dank. Liebe Stackoverflow!
Karrtojal

13

Sie können Nuget-Pakete in Ihren Azure-Funktionen verwenden. Am einfachsten ist es, Visual Studio 2017 15.4 zu verwenden, in dem eine Vorlage für Azure-Funktionen vorhanden ist. Befolgen Sie die folgenden Schritte

1) Azure-Funktion hinzufügen Projekt: Klicken Sie mit der rechten Maustaste auf Lösung und wählen Sie Neues Projekt hinzufügen. Gehen Sie zur Option CLOUD, dort finden Sie das Projekt "Azure-Funktion".

Azure-Funktion

2) Jetzt ist es schön, ein Nuget-Paket hinzuzufügen. Erweitern Sie "ABHÄNGIGKEITEN" und klicken Sie mit der rechten Maustaste darauf, um die Option "Nuget-Pakete verwalten" auszuwählen. Das Dialogfeld "Nuget-Paket" wird angezeigt. Wählen Sie ein beliebiges Nuget-Paket aus, das Sie installieren möchten. Siehe Screenshot unten

3) Veröffentlichen Sie nun Ihre Azure-Funktion. Visual Studio übernimmt alle Einstellungen usw.

Diese Methode funktioniert nur, wenn Sie Visual Studio 2017 15.4 oder höher verwenden. Andernfalls müssen Sie andere Methoden befolgen, wie von anderen erläutert.


1
Dies ist der Standardablauf für VS / Klassenbibliotheken (wie es das Azure-Funktionsprojekt ist) und nicht spezifisch für Azure-Funktionen. Die einzigen Schritte, die für Azure-Funktionen spezifisch sind, sind die unten dokumentierten. Ich werde meiner ursprünglichen Antwort eine Notiz hinzufügen, einschließlich der Details für das aktualisierte Verfahren in 2.0.
Fabio Cavalcante

7

Nehmen wir an, wir möchten den SFTPClient verwenden, bei dem es sich um eine externe Bibliothek handelt, die irgendwo in gespeichert ist NuGet.

Gehen Sie dazu gemäß der neuesten Azure-Funktionsspezifikation wie folgt vor:

  1. Öffnen Sie den Dateibereich in Ihrer Azure-Funktion und fügen Sie eine neue Datei mit dem Namen hinzu function.proj.

    Geben Sie hier die Bildbeschreibung ein Weitere Informationen finden Sie in der Microsoft- Dokumentation .


  1. Darin befindet sich function.projdie NugetPaketreferenz unter Verwendung der XMLStruktur (dieselbe Art von Struktur, die Sie in der *.csprojDatei finden, wenn Sie ein lokales Projekt mit Visual Studio erstellen und ein NuGetPaket darin installieren ).

    Geben Sie hier die Bildbeschreibung ein


  1. Als nächstes fügen wir den Bibliotheksverweis auf das Projekt hinzu: Geben Sie hier die Bildbeschreibung ein

    Hier ist es wichtig, dass Sie einen vollständigen Pfad zur Bibliothek angeben, wie in dem Beispiel, das Sie sehen können: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. Testen Sie als nächstes einen bibliotheksspezifischen Code: Geben Sie hier die Bildbeschreibung ein

  1. Öffnen Sie abschließend den Abschnitt Protokolle und speichern Sie den Code. Nach einiger Zeit sollten die NuGetPakete das Protokoll wiederherstellen. Geben Sie hier die Bildbeschreibung ein

    Hinweis: Diese Protokolle können auch beim Speichern von function.projDateien oder beim Ausführen des Projekts angezeigt werden.


Falls die Bibliothek immer noch als unbekannt angezeigt wird, versuchen Sie, sie Dllmanuell mit dem Azure Cloud Explorer aus Visual Studio in den Ordner bin hinzuzufügen .

Geben Sie hier die Bildbeschreibung ein


Hat sich seit dieser Antwort etwas geändert? Das scheint nicht mehr zu funktionieren. Ich sehe einen "Kompilierungsdienstfehler" - 'Functions.TimerTrigger2' wurde ausgeführt (fehlgeschlagen, ID = a318d5b7-a02c-4ba0-bb04-037beda89b1c) Datei 'D: \ home \ site \ wwwroot \ bin \ Google.Apis konnte nicht gefunden werden .Sheets.v4.dll '.
Benutzer

Wenn Sie ein Skript über das installieren function.proj, wird der Speicherort für das dllnach einiger Zeit im Abschnitt "Protokolle" angezeigt. Manchmal müssen Sie die Seite für die Azure-Funktion erneut laden, manchmal auf die Schaltfläche "Ausführen" klicken, um die Installation der NuGet-Pakete und auch den Speicherort anzuzeigen. Bitte überprüfen Sie, was im Abschnitt Protokoll als Speicherort gedruckt wird, und versuchen Sie, dies anzugeben.
Arsen Khachaturyan

2

Beachten Sie, dass das neue .csproj-Format in Visual Studio 2017 ebenfalls unterstützt wird. Wenn Sie Ihr Projekt als ASPNET-Webprojekt erstellen, lädt die Azure Functions-Laufzeit alle Nuget-Pakete herunter, die vor dem Erstellen Ihres Projekts erforderlich sind.


Für das ASP.NET-Webprojekt funktioniert VS 2015 ebenfalls. Für die Azure-Funktionstools ist dies nur VS 2017. Der Hauptunterschied besteht darin, dass Sie vorkompilierte Bits (und Abhängigkeiten) bereitstellen, sodass die Laufzeit die Wiederherstellung nicht für Sie übernimmt. Ja, dies ist in der Tat eine neuere Methode zum Schreiben von Funktionen und Verwalten von Abhängigkeiten. Ich werde die Antwort aktualisieren, um die neuesten Funktionen widerzuspiegeln.
Fabio Cavalcante
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.