Làm cách nào để sử dụng các gói NuGet trong Azure Functions của tôi?


112

Sử dụng Azure Functions , tôi có thể tham khảo và sử dụng các gói NuGet trong hàm C # của mình không?


Tôi đã phải cập nhật tệp project.json của mình theo cách thủ công để khởi động lại dịch vụ chức năng .. sau đó nó khôi phục các gói nuget của tôi. Có ai biết cách tốt hơn để khởi động lại dịch vụ để khôi phục các gói không? Kudu đã không giúp
Erik Bergstedt

1
Bạn có thể sử dụng tùy chọn khôi phục trang web tiêu chuẩn trong cài đặt ứng dụng chức năng. Nhưng hãy nhớ rằng, khi một chức năng được thực thi lần đầu tiên, nếu tệp project.json chứa một tập hợp các tham chiếu khác với những gì đã được khôi phục trước đó, thì thao tác khôi phục sẽ tự động xảy ra tại thời điểm đó.
Fabio Cavalcante

Câu trả lời:


141

Đúng! Mặc dù cổng Azure Functions hiện không cung cấp cơ chế để thêm và quản lý các gói NuGet, nhưng thời gian chạy hỗ trợ các tham chiếu NuGet và sẽ đảm bảo chúng được sử dụng chính xác khi biên dịch và thực thi các chức năng của bạn.

Để xác định các phần phụ thuộc của bạn, bạn cần tạo một Project.jsontệp với các tham chiếu gói NuGet bắt buộc. Dưới đây là một ví dụ thêm tham chiếu đến Microsoft.ProjectOxford.Facephiên bản 1.1.0:

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

Cổng Azure Functions cung cấp một cách thuận tiện để quản lý các tệp chức năng của bạn, mà chúng tôi có thể sử dụng để tạo (hoặc tải lên) project.json:

  1. Trong phần phát triển của chức năng , nhấp vào xem tệp
  2. Nhấp vào tùy chọn để tạo tệp (bạn cũng có thể nhấp vào tùy chọn tải tệp lên nếu bạn có project.jsontệp đã tạo trước đó trên máy của mình
  3. Đặt tên cho tệp project.jsonvà xác định các tham chiếu gói của bạn (bạn có thể sử dụng ví dụ trên làm mẫu).

Quá trình khôi phục gói sẽ bắt đầu và bạn sẽ thấy đầu ra tương tự như sau trong cửa sổ nhật ký của mình:

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.

Như mong đợi, thời gian chạy Azure Functions sẽ tự động thêm các tham chiếu vào các gói lắp ráp, vì vậy bạn KHÔNG cần phải thêm các tham chiếu hợp ngữ một cách rõ ràng bằng cách sử dụng #r "AssemblyName", bạn chỉ có thể thêm các usingcâu lệnh bắt buộc vào hàm của mình và sử dụng các kiểu được xác định trong gói NuGet bạn ' đã tham chiếu.

Các tùy chọn triển khai bổ sung

Vì Chức năng Azure được xây dựng trên Dịch vụ ứng dụng, như một sự thay thế cho các bước ở trên, bạn cũng có quyền truy cập vào tất cả các tùy chọn triển khai tuyệt vời có sẵn cho Ứng dụng web Azure tiêu chuẩn (Trang web Azure).

Dưới đây là một số ví dụ:

Sử dụng Trình chỉnh sửa dịch vụ ứng dụng (Monaco)

Để quản lý tệp của bạn trực tiếp từ trình duyệt của bạn bằng cách sử dụng Trình chỉnh sửa dịch vụ ứng dụng (Monaco):

  • Trên cổng Azure Functions, nhấp vào Function app settings
  • Trong phần Cài đặt nâng cao , nhấp vàoGo to App Service Settings
  • Bấm vào Toolsnút
  • Trong Phát triển , nhấp vào Trình chỉnh sửa dịch vụ ứng dụng
  • Bật nó Onnếu nó chưa được bật và nhấp vàoGo
  • Sau khi tải xong, hãy kéo và thả project.jsontệp của bạn vào thư mục chức năng của bạn (thư mục được đặt tên theo chức năng của bạn.

Sử dụng điểm cuối SCM (Kudu)

  • Hướng đến: https://<function_app_name>.scm.azurewebsites.net
  • Nhấp vào Bảng điều khiển gỡ lỗi> CMD
  • Hướng đến D:\home\site\wwwroot\<function_name>
  • Kéo và thả Project.jsontệp của bạn vào thư mục (vào lưới tệp)

FTP

Hội nhập liên tục

Nếu bạn bật tích hợp liên tục và triển khai chức năng của mình với một project.jsontệp khi Ứng dụng chức năng của bạn không chạy, thì việc khôi phục gói sẽ tự động xảy ra sau khi Ứng dụng chức năng của bạn khởi chạy. Bạn không nên thêm project.lock.jsontệp của mình vào kiểm soát nguồn.

Các tập hợp được biên dịch trước

Các chức năng cũng có thể được triển khai dưới dạng các hội đồng biên dịch trước và trong trường hợp này, tất cả việc quản lý phụ thuộc được xử lý trong Visual Studio. Tùy chọn này có thể được sử dụng làm thư viện lớp tiêu chuẩn trên bất kỳ phiên bản nào của Visual Studio hoặc bằng cách sử dụng Công cụ chức năng Azure của Visual Studio 2017 .


1
Thế nào là function script rootở đoạn cuối cùng của bạn? Tôi hiểu nó nằm ở đâu project.json. Đúng không?
justinyoo

2
@JustInChronicles, đó thực sự là một thư mục từ đó. Nó project.jsonnằm trong thư mục chức năng của bạn, là một thư mục con của thư mục gốc tập lệnh. Bản đồ gốc tập lệnh tới wwwrootthư mục của bạn trong Azure.
Fabio Cavalcante

Cảm ơn bạn đã làm rõ!
justinyoo

@FabioCavalcante, Yêu thích gói nuget mà bạn đưa vào ví dụ, rất nhiều điều tuyệt vời với các dịch vụ nhận thức màu xanh !!!
Thomas

Xin lưu ý rằng 'Visual Studio Online' được đề cập trong câu trả lời stackoverflow ở trên stackoverflow.com/a/36411537/5288052 có sẵn từ các công cụ Azure dưới dạng 'Trình chỉnh sửa dịch vụ ứng dụng' (xem stackoverflow.com/a/38173438/5288052 )
Stefano Spinucci

35

Chủ đề này đã giúp tôi rất nhiều - nhưng tôi vẫn lãng phí vài giờ để cố gắng làm cho Project.json hoạt động - nhưng không có kết quả.

Nếu bạn tạo một hàm Azure trong phiên bản 2.x, bạn cần thực hiện việc này theo một cách khác.

Tạo một tệp mới như đã nêu nhưng đặt tên là function.proj . Tệp này có cấu trúc XML để nhập thư viện qua Nuget.

Đây là ví dụ của tôi khi nhập Amazon S3 SDK cho .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>

khi lưu cái này, bạn sẽ thấy bản cập nhật bảng điều khiển cho biết rằng các gói đang được cài đặt. Điều này thực sự không được ghi chép rõ ràng và tôi đã mất vài giờ để tìm ra điều này. Vì vậy, tôi hy vọng điều này sẽ giúp ai đó.


2
Đây là một sự trợ giúp lớn, cảm ơn vì đã đăng bài. Đây là một liên kết với nhiều thông tin hơn.

1
Giống như bạn, tôi đã dành hàng giờ để làm điều tương tự. Điều đó hoạt động. Cảm ơn rất nhiều. Tình yêu stackoverflow!
karrtojal

13

Bạn có thể sử dụng các gói Nuget trong Azure Functions của mình. Cách dễ nhất sẽ là sử dụng Visual Studio 2017 15.4, nơi có mẫu cho Hàm Azure. Làm theo các bước dưới đây

1) Thêm chức năng Azure Dự án: Nhấp chuột phải vào giải pháp và chọn Thêm dự án mới. Vào tùy chọn CLOUD ở đó bạn sẽ tìm thấy dự án "Azure Function".

Hàm Azure

2) Bây giờ, thật tuyệt khi thêm bất kỳ gói Nuget nào. Mở rộng "DEPENDENCIES" và nhấp chuột phải vào nó để chọn tùy chọn "Quản lý gói Nuget". Hộp thoại Nuget Package sẽ xuất hiện, chọn bất kỳ gói Nuget nào bạn muốn cài đặt. Xem ảnh chụp màn hình bên dưới

3) Bây giờ xuất bản chức năng Azure của bạn, Visual Studio sẽ quản lý tất cả các cài đặt, v.v.

Phương pháp này sẽ chỉ hoạt động nếu bạn sử dụng Visual Studio 2017 15.4 trở lên, nếu không, bạn sẽ phải làm theo các cách khác như người khác giải thích.


1
Đây là quy trình chuẩn cho Thư viện VS / Class (là dự án Azure Functions) và không dành riêng cho Azure Functions. Các bước duy nhất cụ thể cho Azure Functions là những bước được ghi lại bên dưới. Tôi sẽ thêm ghi chú vào câu trả lời ban đầu của mình, bao gồm các chi tiết về quy trình cập nhật trong 2.0.
Fabio Cavalcante

7

Giả sử chúng ta muốn sử dụng SFTPmáy khách, là một thư viện bên ngoài, được lưu trữ ở đâu đó NuGet.

Để thực hiện điều đó, theo đặc tả Chức năng Azure mới nhất , hãy làm như sau:

  1. Mở phần tệp bên trong Hàm Azure của bạn và thêm tệp mới có tên function.proj.

    nhập mô tả hình ảnh ở đây Để biết thêm thông tin, hãy tham khảo tài liệu của Microsoft .


  1. Bên trong, function.projđặt Nugettham chiếu gói bằng cách sử dụng XMLcấu trúc (cùng loại cấu trúc mà bạn có thể tìm thấy bên trong *.csprojtệp nếu bạn tạo một dự án cục bộ với Visual Studio và cài đặt một số NuGetgói vào đó).

    nhập mô tả hình ảnh ở đây


  1. Tiếp theo, hãy bao gồm tham chiếu thư viện cho dự án: nhập mô tả hình ảnh ở đây

    Điều cần thiết ở đây là bạn nên cung cấp một đường dẫn đầy đủ đến thư viện, như trong ví dụ bạn có thể thấy là: "D:\home\site\wwwroot\bin\your_custom_library.dll"


  1. Tiếp theo, hãy kiểm tra một số mã dành riêng cho thư viện: nhập mô tả hình ảnh ở đây

  1. Cuối cùng, mở phần Nhật ký và lưu mã. Sau một thời gian, bạn sẽ thấy NuGetnhật ký khôi phục gói. nhập mô tả hình ảnh ở đây

    Lưu ý: các bản ghi này cũng có thể xuất hiện khi lưu function.projtệp hoặc khi chạy dự án.


Trong trường hợp nếu thư viện vẫn xuất hiện dưới dạng không xác định, hãy thử thêm nó Dlltheo cách thủ công vào thư mục bin bằng cách sử dụng Azure Cloud explorer từ Visual Studio .

nhập mô tả hình ảnh ở đây


Có điều gì đó đã thay đổi kể từ câu trả lời này? Điều này dường như không hoạt động nữa. Tôi gặp "Lỗi dịch vụ biên dịch" - Đã thực thi 'Functions.TimerTrigger2' (Không thành công, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) Không thể tìm thấy tệp 'D: \ home \ site \ wwwroot \ bin \ Google.Apis .Sheets.v4.dll '.
người dùng

Khi bạn đang cài đặt tập lệnh thông qua function.proj, vị trí của tập lệnh dllsẽ xuất hiện trong phần Nhật ký sau một khoảng thời gian. Đôi khi bạn cần tải lại trang cho Chức năng Azure một lần nữa, đôi khi nhấn nút "Chạy" để xem cài đặt gói NuGet và cả vị trí. Vui lòng kiểm tra những gì đang in trong phần Nhật ký làm vị trí và thử đặt nó.
Arsen Khachaturyan

2

Lưu ý rằng định dạng .csproj mới trong Visual studio 2017 cũng được hỗ trợ. Nếu bạn tạo dự án của mình dưới dạng Dự án Web ASPNET, thời gian chạy Hàm Azure tải xuống tất cả các gói nuget cần thiết trước khi xây dựng dự án của bạn.


Đối với Dự án Web ASP.NET, VS 2015 cũng hoạt động. Đối với Công cụ chức năng Azure, đó chỉ là VS 2017. Sự khác biệt chính ở đó là bạn đang triển khai các bit được biên dịch trước (và các phần phụ thuộc), vì vậy thời gian chạy không xử lý việc khôi phục cho bạn, nhưng có, đó thực sự là một cách mới hơn để viết các hàm và quản lý các phần phụ thuộc. Tôi sẽ cập nhật câu trả lời để phản ánh các tính năng mới nhất.
Fabio Cavalcante
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.