Как я могу использовать пакеты NuGet в моих функциях Azure?

112

Могу ли я ссылаться на пакеты NuGet в своей функции C # с помощью функций Azure ?

Фабио Кавальканте
источник
Мне пришлось обновить файл project.json вручную, чтобы перезапустить службу функции .. затем он восстановил мои пакеты nuget. Кто-нибудь знает лучший способ перезапустить службу, чтобы она восстановила пакеты? Куду не помог
Эрик
1
Вы можете использовать стандартный вариант восстановления сайта в настройках приложения-функции. Но имейте в виду, что при первом запуске функции, если файл project.json содержит набор ссылок, который отличается от того, что было ранее восстановлено, операция восстановления произойдет в это время автоматически.
Фабио Кавальканте,

Ответы:

141

Да! Хотя портал функций Azure в настоящее время не предоставляет механизм для добавления пакетов NuGet и управления ими, среда выполнения поддерживает ссылки NuGet и гарантирует, что они правильно используются при компиляции и выполнении ваших функций.

Чтобы определить свои зависимости, вам необходимо создать Project.jsonфайл с необходимыми ссылками на пакеты NuGet. Вот пример, который добавляет ссылку на Microsoft.ProjectOxford.Faceверсию 1.1.0:

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

Портал функций Azure предоставляет удобный способ управления файлами функций, которые мы можем использовать для создания (или загрузки) наших 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 автоматически добавит ссылки на сборки пакета, поэтому вам НЕ нужно явно добавлять ссылки на сборки, используя #r "AssemblyName", вы можете просто добавить необходимые usingоператоры в свою функцию и использовать типы, определенные в пакете NuGet, который вы ' я ссылался.

Дополнительные варианты развертывания

Поскольку функции Azure построены на основе служб приложений, в качестве альтернативы описанным выше шагам у вас также есть доступ ко всем отличным вариантам развертывания, доступным для стандартных веб-приложений Azure (веб-сайты Azure).

Вот некоторые примеры:

Использование редактора службы приложений (Монако)

Чтобы управлять файлами прямо из браузера с помощью редактора службы приложений (Монако):

  • На портале функций Azure щелкните Function app settings
  • В разделе Advanced Settings нажмитеGo to App Service Settings
  • Нажмите на Toolsкнопку
  • В разделе " Разработка" нажмите "Редактор службы приложений".
  • Включите его, Onесли он еще не включен, и нажмитеGo
  • После загрузки перетащите project.jsonфайл в папку вашей функции (папку, названную в честь вашего файла function.

Использование конечной точки SCM (Kudu)

  • Перейдите к: https://<function_app_name>.scm.azurewebsites.net
  • Нажмите Консоль отладки> CMD
  • Перейдите к D:\home\site\wwwroot\<function_name>
  • Перетащите Project.jsonфайл в папку (в сетку файлов)

FTP

Непрерывная интеграция

Если вы включите непрерывную интеграцию и развернете свою функцию с project.jsonфайлом, когда ваше приложение-функция не запущено, восстановление пакета произойдет автоматически после инициализации приложения-функции. Рекомендуется не добавлять project.lock.jsonфайл в систему управления версиями.

Предварительно скомпилированные сборки

Функции также могут быть развернуты как предварительно скомпилированные сборки, и в этом случае все управление зависимостями выполняется в Visual Studio. Этот параметр можно использовать в качестве стандартных библиотек классов в любой версии Visual Studio или с помощью Visual Studio 2017 Azure Functions Tools .

Фабио Кавальканте
источник
1
Что function script rootв вашем последнем абзаце? Я так понимаю, это где project.jsonнаходится. Это правильно?
justinyoo
2
@JustInChronicles, на самом деле это одна папка выше. Он project.jsonнаходится в папке вашей функции, которая является дочерней папкой корня скрипта. Корневой каталог скрипта сопоставляется с вашей wwwrootпапкой в ​​Azure.
Фабио Кавальканте,
Спасибо за разъяснения!
justinyoo
@FabioCavalcante, Мне очень нравится пакет nuget, который вы привели в пример, так много удивительных вещей с лазурными когнитивными услугами !!!
Thomas
Обратите внимание, что «Visual Studio Online», упомянутый в ответе на stackoverflow выше, stackoverflow.com/a/36411537/5288052 доступен из инструментов Azure как «Редактор службы приложений» (см. Stackoverflow.com/a/38173438/5288052 )
Стефано Спинуччи,
35

Эта ветка мне очень помогла, но я все равно потратил несколько часов, пытаясь заставить Project.json работать - безрезультатно.

Если вы создаете функцию Azure в версии 2.x, вам нужно сделать это по-другому.

Создайте новый файл, как указано, но назовите его function.proj . Этот файл имеет структуру XML для импорта библиотек через Nuget.

Вот мой пример импорта Amazon S3 SDK для .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>

после сохранения вы должны увидеть обновление консоли, в котором говорится, что пакеты устанавливаются. Это действительно плохо документировано, и мне потребовалось несколько часов, чтобы это выяснить. Надеюсь, это кому-то поможет.

Джеймс Кук
источник
2
Это было большим подспорьем, спасибо за публикацию. Вот ссылка с дополнительной информацией.
1
Как и вы, я тратил часы на то же самое. Это работает. Большое спасибо. Люблю stackoverflow!
karrtojal
13

Вы можете использовать пакеты Nuget в своих функциях Azure. Самый простой способ - использовать Visual Studio 2017 15.4, где есть шаблон для Функций Azure. Следуйте инструкциям ниже

1) Добавить проект функции Azure: щелкните решение правой кнопкой мыши и выберите «Добавить новый проект». Перейдите к опции ОБЛАКА, там вы найдете проект «Функция Azure».

Функция Azure

2) Теперь неплохо добавить любой пакет Nuget. Разверните «ЗАВИСИМОСТИ» и щелкните его правой кнопкой мыши, чтобы выбрать опцию «Управление пакетами Nuget». Появится диалоговое окно Nuget Package, выберите любой пакет Nuget, который вы хотите установить. Смотрите скриншот ниже

3) Теперь опубликуйте свою функцию Azure, Visual Studio позаботится обо всех настройках и т. Д.

Этот метод будет работать, только если вы используете Visual Studio 2017 15.4 или более поздней версии, в противном случае вам придется использовать другие способы, объясненные другими.

Суджит Сингх
источник
1
Это стандартный поток для библиотек VS / классов (которым и является проект функций Azure), а не только для функций Azure. Единственные шаги, относящиеся к функциям Azure, описаны ниже. Я добавлю примечание к своему исходному ответу, включая детали обновленной процедуры в 2.0.
Fabio Cavalcante
7

Предположим, мы хотим использовать SFTPклиент, который представляет собой внешнюю библиотеку, хранящуюся где-то в NuGet.

Для этого в соответствии с последней спецификацией функций Azure выполните следующие действия:

  1. Откройте раздел файлов внутри функции Azure и добавьте новый файл с именем function.proj.

    введите описание изображения здесь Дополнительные сведения см. В документации Microsoft .


  1. Внутри этого function.projпомещается Nugetссылка на пакет, использующая XMLструктуру (такую ​​же структуру вы можете найти внутри *.csprojфайла, если вы создаете локальный проект с помощью Visual Studio и устанавливаете NuGetв него какой-либо пакет).

    введите описание изображения здесь


  1. Затем давайте добавим ссылку на библиотеку к проекту: введите описание изображения здесь

    Здесь важно указать полный путь к библиотеке, как в примере, который вы видите: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. Затем протестируйте код, специфичный для библиотеки: введите описание изображения здесь

  1. Наконец, откройте раздел Журналы и сохраните код. Через некоторое время вы должны увидеть NuGetжурнал восстановления пакетов. введите описание изображения здесь

    Примечание: эти журналы также могут появляться при сохранении function.projфайла или при запуске проекта.


В случае, если библиотека по-прежнему отображается как неизвестная, попробуйте добавить ее Dllвручную в папку bin с помощью Azure Cloud Explorer из Visual Studio .

введите описание изображения здесь

Арсен Хачатурян
источник
Что-то изменилось после этого ответа? Кажется, это больше не работает. Я вижу "Ошибка службы компиляции" - Выполнено 'Functions.TimerTrigger2' (Failed, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) Не удалось найти файл 'D: \ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll '.
пользователь
Когда вы устанавливаете скрипт с помощью function.proj, местоположение для dllнего появляется в разделе журналов через некоторое время. Иногда вам нужно перезагрузить страницу для функции Azure еще раз, иногда нажмите кнопку «Выполнить», чтобы увидеть установку пакетов NuGet, а также местоположение. Пожалуйста, проверьте, что печатается в разделе «Журнал» как место, и попробуйте это указать.
Арсен Хачатурян
2

Обратите внимание, что также поддерживается новый формат .csproj в Visual Studio 2017. Если вы создаете свой проект как веб-проект ASPNET, среда выполнения Функций Azure загружает все пакеты nuget, необходимые перед сборкой проекта.

решениеJ
источник
Для веб-проекта ASP.NET также работает VS 2015. Для инструментов функций Azure это только VS 2017. Ключевое отличие состоит в том, что вы развертываете предварительно скомпилированные биты (и зависимости), поэтому среда выполнения не обрабатывает восстановление за вас, но да, это действительно новый способ написания функций и управления зависимостями. Я обновлю ответ, чтобы отразить последние функции.
Фабио Кавальканте