Jak mogę używać pakietów NuGet w moich Azure Functions?

112

Czy korzystając z usługi Azure Functions , mogę odwoływać się do pakietów NuGet i używać ich w mojej funkcji C #?

Fabio Cavalcante
źródło
Musiałem ręcznie zaktualizować mój plik project.json, aby ponownie uruchomić usługę funkcji. Następnie przywrócił moje pakiety NuGet. Czy ktoś zna lepszy sposób na ponowne uruchomienie usługi, aby przywrócić pakiety? Kudu nie pomógł
Erik Bergstedt
1
Możesz użyć standardowej opcji przywracania witryny w ustawieniach aplikacji funkcji. Należy jednak pamiętać, że jeśli funkcja jest wykonywana po raz pierwszy, jeśli plik project.json zawiera zestaw odniesień różniący się od tego, co zostało przywrócone wcześniej, operacja przywracania zostanie przeprowadzona w tym momencie automatycznie.
Fabio Cavalcante

Odpowiedzi:

141

Tak! Chociaż portal Azure Functions nie udostępnia obecnie mechanizmu do dodawania pakietów NuGet i zarządzania nimi, środowisko uruchomieniowe obsługuje odwołania NuGet i upewnia się, że są one poprawnie używane podczas kompilowania i wykonywania funkcji.

Aby zdefiniować zależności, musisz utworzyć Project.jsonplik z wymaganymi odwołaniami do pakietu NuGet. Oto przykład, który dodaje odniesienie do Microsoft.ProjectOxford.Facewersji 1.1.0:

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

Portal Azure Functions zapewnia wygodny sposób zarządzania plikami funkcji, których możemy użyć do utworzenia (lub przesłania) naszych project.json:

  1. W sekcji rozwijania funkcji kliknij wyświetl pliki
  2. Kliknij opcję tworzenia pliku (możesz również kliknąć opcję załadowania pliku, jeśli masz wcześniej utworzony project.jsonplik na swoim komputerze
  3. Nazwij plik project.jsoni zdefiniuj odniesienia do pakietu (możesz użyć powyższego przykładu jako szablonu).

Rozpocznie się proces przywracania pakietu i w oknie dziennika powinny pojawić się wyniki podobne do następujących:

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.

Zgodnie z oczekiwaniami środowisko uruchomieniowe Azure Functions automatycznie doda odwołania do zestawów pakietów, więc NIE MUSISZ jawnie dodawać odwołań do zestawów przy użyciu #r "AssemblyName", wystarczy dodać wymagane usinginstrukcje do funkcji i użyć typów zdefiniowanych w pakiecie NuGet. odniósł się.

Dodatkowe opcje wdrażania

Ponieważ usługa Azure Functions jest oparta na usługach aplikacji, jako alternatywa dla powyższych kroków, masz również dostęp do wszystkich wspaniałych opcji wdrażania dostępnych w standardowych usługach Azure Web Apps (Azure Websites).

Oto kilka przykładów:

Korzystanie z App Service Editor (Monako)

Aby zarządzać plikami bezpośrednio z przeglądarki za pomocą App Service Editor (Monako):

  • W portalu Azure Functions kliknij Function app settings
  • W sekcji Ustawienia zaawansowane kliknijGo to App Service Settings
  • Kliknij Toolsprzycisk
  • W obszarze Develop , kliknij App Service Editor
  • Włącz go, Onjeśli nie jest jeszcze włączony, i kliknijGo
  • Po załadowaniu przeciągnij i upuść project.jsonplik do folderu funkcji (folder nazwany tak jak nazwa funkcji.

Korzystanie z punktu końcowego SCM (Kudu)

  • Nawigować do: https://<function_app_name>.scm.azurewebsites.net
  • Kliknij Konsola debugowania> CMD
  • Nawigować do D:\home\site\wwwroot\<function_name>
  • Przeciągnij i upuść Project.jsonplik do folderu (na siatkę plików)

FTP

Ciągła integracja

Jeśli włączysz ciągłą integrację i wdrożysz swoją funkcję z project.jsonplikiem, gdy aplikacja funkcji nie jest uruchomiona, przywracanie pakietu nastąpi automatycznie po zainicjowaniu aplikacji funkcji. Zaleca się, aby nie dodawać project.lock.jsonpliku do kontroli źródła.

Wstępnie skompilowane zestawy

Funkcje można również wdrażać jako wstępnie skompilowane zestawy, aw tym przypadku całe zarządzanie zależnościami jest obsługiwane w programie Visual Studio. Ta opcja może być używana jako standardowe biblioteki klas w dowolnej wersji programu Visual Studio lub przy użyciu narzędzi Azure Functions programu Visual Studio 2017 .

Fabio Cavalcante
źródło
1
Jaki jest function script roottwój ostatni akapit? Rozumiem, że to miejsce, w którym project.jsonsię znajduje. Czy to jest poprawne?
justinyoo
2
@JustInChronicles, czyli właściwie o jeden folder wyżej. project.jsonJest w folderze funkcji, która jest folder dziecko korzenia skryptu. Katalog główny skryptu jest mapowany na Twój wwwrootfolder na platformie Azure.
Fabio Cavalcante,
Dziękuję za wyjaśnienie!
justinyoo,
@FabioCavalcante, Uwielbiam pakiet nuget, który umieściłeś w przykładzie, tak wiele niesamowitych rzeczy z lazurowymi usługami poznawczymi !!!
Thomas
Należy pamiętać, że „Visual Studio Online” wspomniany w odpowiedzi stackoverflow powyżej stackoverflow.com/a/36411537/5288052 jest dostępny w narzędziach platformy Azure jako „App Service Editor” (patrz stackoverflow.com/a/38173438/5288052 )
Stefano Spinucci
35

Ten wątek bardzo mi pomógł - ale i tak zmarnowałem kilka godzin próbując zmusić Project.json do działania - bezskutecznie.

Jeśli utworzysz funkcję Azure w wersji 2.x, musisz to zrobić w inny sposób.

Utwórz nowy plik zgodnie z opisem, ale nadaj mu nazwę function.proj . Ten plik ma strukturę XML do importowania bibliotek przez Nuget.

Oto mój przykład importu Amazon S3 SDK dla .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>

po zapisaniu powinieneś zobaczyć aktualizację konsoli informującą, że pakiety są instalowane. To naprawdę nie jest dobrze udokumentowane i zajęło mi dobre kilka godzin, zanim się tego dowiedziałem. Mam więc nadzieję, że to komuś pomoże.

James Cooke
źródło
2
To była duża pomoc, dzięki za wysłanie wiadomości. Oto link z dodatkowymi informacjami.
1
Podobnie jak ty, spędziłem godziny, aby zrobić to samo. To działa. Wielkie dzięki. Uwielbiam przepełnienie stosu!
karrtojal
13

W usłudze Azure Functions można używać pakietów NuGet. Najłatwiejszym sposobem będzie użycie programu Visual Studio 2017 15.4, w którym znajduje się szablon usługi Azure Functions. Wykonaj poniższe kroki

1) Dodaj projekt funkcji platformy Azure: kliknij rozwiązanie prawym przyciskiem myszy i wybierz opcję Dodaj nowy projekt. Przejdź do opcji CLOUD, gdzie znajdziesz projekt „Azure Function”.

Funkcja Azure

2) Teraz ładnie jest dodać dowolny pakiet Nuget. Rozwiń „ZALEŻNOŚCI” i kliknij prawym przyciskiem myszy, aby wybrać opcję „Zarządzaj pakietami Nuget”. Pojawi się okno dialogowe pakietu Nuget, wybierz dowolny pakiet Nuget, który chcesz zainstalować. Zobacz zrzut ekranu poniżej

3) Teraz opublikuj swoją funkcję Azure, Visual Studio zajmie się wszystkimi ustawieniami itd.

Ta metoda będzie działać tylko wtedy, gdy używasz programu Visual Studio 2017 w wersji 15.4 lub nowszej, jeśli nie, będziesz musiał postępować zgodnie z innymi sposobami wyjaśnionymi przez innych.

Sujit Singh
źródło
1
Jest to standardowy przepływ dla bibliotek VS / Class Libraries (czyli tym, czym jest projekt Azure Functions), a nie specyficzny dla Azure Functions. Jedyne kroki specyficzne dla Azure Functions są opisane poniżej. Dodam notatkę do mojej pierwotnej odpowiedzi, w tym szczegóły zaktualizowanej procedury w wersji 2.0.
Fabio Cavalcante
7

Załóżmy, że chcemy użyć SFTPklienta, który jest zewnętrzną biblioteką, przechowywaną gdzieś w NuGet.

Aby to osiągnąć, zgodnie z najnowszą specyfikacją usługi Azure Functions wykonaj następujące czynności:

  1. Otwórz sekcję plików wewnątrz funkcji platformy Azure i dodaj nowy plik o nazwie function.proj.

    wprowadź opis obrazu tutaj Więcej informacji można znaleźć w dokumentacji firmy Microsoft .


  1. Wewnątrz function.projumieszczamy Nugetodwołanie do pakietu przy użyciu XMLstruktury (ten sam rodzaj struktury, który można znaleźć w *.csprojpliku, jeśli tworzysz projekt lokalny w programie Visual Studio i instalujesz w nim jakiś NuGetpakiet).

    wprowadź opis obrazu tutaj


  1. Następnie dołączmy odniesienie biblioteki do projektu: wprowadź opis obrazu tutaj

    Istotne jest, aby podać pełną ścieżkę do biblioteki, tak jak w przykładzie, który widzisz: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. Następnie przetestuj kod specyficzny dla biblioteki: wprowadź opis obrazu tutaj

  1. Na koniec otwórz sekcję Dzienniki i zapisz kod. Po pewnym czasie powinieneś zobaczyć NuGetdziennik przywracania pakietów. wprowadź opis obrazu tutaj

    Uwaga: te dzienniki mogą również pojawić się podczas zapisywania function.projpliku lub podczas uruchamiania projektu.


W przypadku, gdy biblioteka nadal pojawia się jako nieznana, spróbuj dodać ją Dllręcznie do folderu bin przy użyciu eksploratora chmury Azure w programie Visual Studio .

wprowadź opis obrazu tutaj

Arsen Khachaturyan
źródło
Czy coś się zmieniło od czasu tej odpowiedzi? To już nie działa. Widzę „Błąd usługi kompilacji” - Wykonano „Functions.TimerTrigger2” (Niepowodzenie, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) Nie można znaleźć pliku „D: \ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll ”.
użytkownik
Podczas instalowania skryptu za pośrednictwem witryny function.projlokalizacja pliku dlljest wyświetlana w sekcji Dzienniki po pewnym czasie. Czasami trzeba ponownie załadować stronę dla funkcji platformy Azure, a czasami nacisnąć przycisk „Uruchom”, aby zobaczyć instalację pakietów NuGet, a także lokalizację. Sprawdź, co jest drukowane w sekcji Dziennik jako lokalizacja i spróbuj to umieścić.
Arsen Khachaturyan
2

Należy pamiętać, że obsługiwany jest również nowy format .csproj w programie Visual Studio 2017. Jeśli utworzysz projekt jako projekt sieci Web ASPNET, środowisko uruchomieniowe Azure Functions pobierze wszystkie niezbędne pakiety NuGet przed utworzeniem projektu.

rozwiązywanieJ
źródło
W przypadku projektu sieci Web ASP.NET działa również VS 2015. W przypadku narzędzi Azure Functions jest to tylko wersja VS 2017. Kluczowa różnica polega na tym, że wdrażasz wstępnie skompilowane bity (i zależności), więc środowisko wykonawcze nie obsługuje przywracania za Ciebie, ale tak, jest to rzeczywiście nowszy sposób pisania funkcji i zarządzania zależnościami. Zaktualizuję odpowiedź, aby odzwierciedlała najnowsze funkcje.
Fabio Cavalcante