Como posso usar pacotes NuGet em minhas funções do Azure?

112

Usando o Azure Functions , posso fazer referência e usar pacotes NuGet em minha função C #?

Fabio Cavalcante
fonte
Tive que atualizar meu arquivo project.json manualmente para reiniciar o serviço de função .. então ele restaurou meus pacotes nuget. Alguém conhece a melhor maneira de reiniciar o serviço para que ele restaure os pacotes? Kudu não ajudou
Erik Bergstedt
1
Você pode usar a opção de restauração de site padrão nas configurações do aplicativo de funções. Mas lembre-se que, quando uma função é executada pela primeira vez, se o arquivo project.json contiver um conjunto de referências diferente do que foi restaurado anteriormente, uma operação de restauração ocorrerá naquele momento, automaticamente.
Fabio Cavalcante

Respostas:

141

Sim! Embora o portal do Azure Functions não forneça atualmente um mecanismo para adicionar e gerenciar pacotes NuGet, o tempo de execução oferece suporte a referências NuGet e garantirá que sejam usadas corretamente ao compilar e executar suas funções.

Para definir suas dependências, você precisa criar um Project.jsonarquivo com as referências de pacote NuGet necessárias. Aqui está um exemplo que adiciona uma referência à Microsoft.ProjectOxford.Faceversão 1.1.0:

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

O portal do Azure Functions fornece uma maneira conveniente de gerenciar seus arquivos de função, que podemos usar para criar (ou carregar) nosso project.json:

  1. Na seção de desenvolvimento da função , clique em visualizar arquivos
  2. Clique na opção para criar um arquivo (você também pode clicar na opção para fazer upload de um arquivo se você tiver um project.jsonarquivo criado anteriormente em sua máquina
  3. Nomeie o arquivo project.jsone defina as referências do pacote (você pode usar o exemplo acima como um modelo).

O processo de restauração do pacote começará e você deverá ver uma saída semelhante à seguinte na janela 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 esperado, o tempo de execução do Azure Functions adicionará automaticamente as referências aos assemblies de pacote, portanto, você NÃO precisa adicionar explicitamente referências de assembly usando #r "AssemblyName", você pode apenas adicionar as usinginstruções necessárias à sua função e usar os tipos definidos no pacote NuGet que você ' ve referenciado.

Opções adicionais de implantação

Como o Azure Functions é criado com base nos Serviços de Aplicativo, como alternativa às etapas acima, você também tem acesso a todas as ótimas opções de implantação disponíveis para os Aplicativos Web do Azure padrão (Sites do Azure).

aqui estão alguns exemplos:

Usando o App Service Editor (Monaco)

Para gerenciar seus arquivos diretamente de seu navegador usando o App Service Editor (Monaco):

  • No portal do Azure Functions, clique em Function app settings
  • Na seção Configurações avançadas , clique emGo to App Service Settings
  • Clique no Toolsbotão
  • Em Develop , clique em App Service Editor
  • Ligue-o Onse ainda não estiver ativado e clique emGo
  • Depois de carregar, arraste e solte o project.jsonarquivo na pasta da função (a pasta com o nome da função.

Usando endpoint SCM (Kudu)

  • Navegar para: https://<function_app_name>.scm.azurewebsites.net
  • Clique em Debug Console> CMD
  • Navegar para D:\home\site\wwwroot\<function_name>
  • Arraste e solte seu Project.jsonarquivo na pasta (na grade de arquivos)

FTP

Integração contínua

Se você habilitar a integração contínua e implantar sua função com um project.jsonarquivo quando seu aplicativo de funções não estiver em execução, a restauração do pacote acontecerá automaticamente assim que seu aplicativo de funções for inicializado. É recomendável que você não adicione seu project.lock.jsonarquivo ao controle de origem.

Conjuntos pré-compilados

As funções também podem ser implantadas como assemblies pré-compilados e, neste caso, todo o gerenciamento de dependência é tratado no Visual Studio. Esta opção pode ser usada como bibliotecas de classes padrão em qualquer versão do Visual Studio ou usando as Ferramentas do Visual Studio 2017 Azure Functions .

Fabio Cavalcante
fonte
1
Qual é o function script rootseu último parágrafo? Eu entendo que é onde project.jsonestá localizado. Isso é correto?
justinyoo de
2
@JustInChronicles, na verdade é uma pasta acima disso. O project.jsonestá em sua pasta de funções, que é uma pasta filha da raiz do script. A raiz do script é mapeada para sua wwwrootpasta no Azure.
Fabio Cavalcante
Obrigado pelo esclarecimento!
justinyoo
@FabioCavalcante, Amei o pacote nuget que você colocou como exemplo, tantas coisas incríveis com serviços cognitivos azuis !!!
Thomas,
Observe que 'Visual Studio Online' mencionado na resposta stackoverflow acima stackoverflow.com/a/36411537/5288052 está disponível nas ferramentas do Azure como 'Editor de serviço de aplicativo' (consulte stackoverflow.com/a/38173438/5288052 )
Stefano Spinucci
35

Este tópico me ajudou muito - mas ainda perdi algumas horas tentando fazer o Project.json funcionar - sem sucesso.

Se você criar uma função do Azure na versão 2.x, precisará fazer isso de uma maneira diferente.

Crie um novo arquivo conforme indicado, mas nomeie-o function.proj . Este arquivo possui uma estrutura XML para importação de bibliotecas via Nuget.

Aqui está meu exemplo importando o SDK do 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>

ao salvá-lo, você deverá ver a atualização do console informando que os pacotes estão sendo instalados. Isso realmente não está bem documentado e levei algumas horas para descobrir isso. Espero que isso ajude alguém.

James Cooke
fonte
2
Esta foi uma grande ajuda, obrigado por postar. Aqui está um link com mais informações.
1
Como você, passei horas fazendo o mesmo. Isso funciona. Muito obrigado. Adoro stackoverflow!
karrtojal
13

Você pode usar pacotes Nuget em suas Funções do Azure. A maneira mais fácil será usar o Visual Studio 2017 15.4, onde há um modelo para Azure Functions. Siga as etapas abaixo

1) Adicionar projeto de função Azure: clique com o botão direito na solução e selecione Adicionar novo projeto. Vá para a opção CLOUD, onde você encontrará o projeto "Azure Function".

Função Azure

2) Agora é bonito adicionar qualquer pacote Nuget. Expanda "DEPENDÊNCIAS" e clique com o botão direito sobre ele para selecionar a opção "Gerenciar Pacotes Nuget". A caixa de diálogo Pacote Nuget aparecerá, selecione qualquer pacote Nuget que deseja instalar. Veja a imagem abaixo

3) Agora publique sua função do Azure, o Visual Studio cuidará de todas as configurações, etc.

Este método funcionará apenas se você usar o Visual Studio 2017 15.4 ou superior, caso contrário, terá que seguir outros caminhos explicados por outros.

Sujit Singh
fonte
1
Este é o fluxo padrão para VS / Class Libraries (que é o que o projeto Azure Functions é) e não específico para o Azure Functions. As únicas etapas específicas do Azure Functions são as documentadas a seguir. Acrescentarei uma observação à minha resposta original, incluindo os detalhes do procedimento atualizado no 2.0.
Fabio Cavalcante
7

Vamos supor que queremos usar o SFTPcliente, que é uma biblioteca externa, armazenada em algum lugar NuGet.

Para fazer isso, de acordo com a especificação mais recente do Azure Functions , faça o seguinte:

  1. Abra a seção de arquivos dentro do Azure Function e adicione um novo arquivo chamado function.proj.

    insira a descrição da imagem aqui Para obter mais informações, consulte a documentação da Microsoft .


  1. Dentro disso, function.projcoloque a Nugetreferência do pacote usando a XMLestrutura (o mesmo tipo de estrutura que você pode encontrar dentro do *.csprojarquivo se criar um projeto local com o Visual Studio e instalar algum NuGetpacote nele).

    insira a descrição da imagem aqui


  1. A seguir, vamos incluir a referência da biblioteca ao projeto: insira a descrição da imagem aqui

    O essencial aqui é que você forneça um caminho completo para a biblioteca, como no exemplo que você pode ver que é: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. Em seguida, teste algum código específico da biblioteca: insira a descrição da imagem aqui

  1. Por fim, abra a seção Logs e salve o código. Depois de algum tempo, você deverá ver o NuGetlog de restauração de pacotes. insira a descrição da imagem aqui

    Nota: esses logs também podem aparecer ao salvar o function.projarquivo ou ao executar o projeto.


Caso a biblioteca ainda apareça como desconhecida, tente adicioná-la Dllmanualmente na pasta bin usando o Azure Cloud explorer do Visual Studio .

insira a descrição da imagem aqui

Arsen Khachaturyan
fonte
Algo mudou desde essa resposta? Isso parece não funcionar mais. Estou vendo um "erro de serviço de compilação" - 'Functions.TimerTrigger2' executado (falhou, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) Não foi possível encontrar o arquivo 'D: \ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll '.
usuário
Quando você está instalando um script por meio do function.proj, o local do dllé exibido na seção Logs após algum tempo. Às vezes, você precisa recarregar a página do Azure Function mais uma vez, às vezes aperte o botão "Executar" para ver a instalação dos pacotes NuGet e também o local. Verifique o que está imprimindo na seção Log como local e tente colocar isso.
Arsen Khachaturyan
2

Observe que o novo formato .csproj no Visual studio 2017 também é compatível. Se você criar seu projeto como um projeto da Web ASPNET, o tempo de execução do Azure Functions baixará todos os pacotes nuget necessários antes de criar seu projeto.

resolvendo J
fonte
Para o ASP.NET Web Project, o VS 2015 também funciona. Para as Ferramentas do Azure Functions, é apenas o VS 2017. A principal diferença é que você está implantando bits pré-compilados (e dependências), então o tempo de execução não está lidando com a restauração para você, mas sim, essa é de fato uma maneira mais nova de escrever funções e gerenciar dependências. Vou atualizar a resposta para refletir os recursos mais recentes.
Fabio Cavalcante