ฉันจะใช้แพ็คเกจ NuGet ใน Azure Functions ได้อย่างไร


113

การใช้Azure Functionsฉันสามารถอ้างอิงและใช้แพ็คเกจ NuGet ในฟังก์ชัน C # ของฉันได้หรือไม่


ฉันต้องอัปเดตไฟล์ project.json ด้วยตนเองเพื่อที่จะเริ่มบริการฟังก์ชันใหม่ .. จากนั้นมันจะคืนค่าแพ็กเกจ nuget ของฉัน ใครรู้วิธีที่ดีกว่าในการรีสตาร์ทบริการเพื่อให้คืนค่าแพ็คเกจ? Kudu ไม่ได้ช่วย
Erik Bergstedt

1
คุณสามารถใช้ตัวเลือกการคืนค่าไซต์มาตรฐานในการตั้งค่าแอพฟังก์ชัน แต่โปรดทราบว่าเมื่อฟังก์ชันถูกเรียกใช้งานครั้งแรกหากไฟล์ project.json มีชุดการอ้างอิงที่แตกต่างจากที่ได้รับการกู้คืนก่อนหน้านี้การดำเนินการกู้คืนจะเกิดขึ้นในเวลานั้นโดยอัตโนมัติ
Fabio Cavalcante

คำตอบ:


141

ใช่ แม้ว่าในปัจจุบันพอร์ทัล Azure Functions จะไม่มีกลไกในการเพิ่มและจัดการแพ็คเกจ NuGet แต่รันไทม์รองรับการอ้างอิง NuGet และจะทำให้แน่ใจว่าใช้อย่างถูกต้องเมื่อรวบรวมและเรียกใช้ฟังก์ชันของคุณ

ในการกำหนดการอ้างอิงคุณต้องสร้างProject.jsonไฟล์ที่มีการอ้างอิงแพ็คเกจ NuGet ที่จำเป็น นี่คือตัวอย่างที่เพิ่มการอ้างอิงไปยังMicrosoft.ProjectOxford.Faceเวอร์ชัน 1.1.0:

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

พอร์ทัล Azure Functions มีวิธีที่สะดวกในการจัดการไฟล์ฟังก์ชันของคุณซึ่งเราสามารถใช้เพื่อสร้าง (หรืออัปโหลด) ของเรา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 Functions ถูกสร้างขึ้นบน App Services ซึ่งเป็นอีกทางเลือกหนึ่งของขั้นตอนข้างต้นคุณจึงสามารถเข้าถึงตัวเลือกการปรับใช้ที่ยอดเยี่ยมทั้งหมดที่มีให้สำหรับ Azure Web Apps มาตรฐาน (เว็บไซต์ Azure)

นี่คือตัวอย่างบางส่วน:

ใช้ App Service Editor (โมนาโก)

ในการจัดการไฟล์ของคุณโดยตรงจากเบราว์เซอร์ของคุณโดยใช้ App Service Editor (โมนาโก):

  • บนพอร์ทัล Azure Functions ให้คลิกที่ Function app settings
  • ภายใต้ส่วนการตั้งค่าขั้นสูงคลิกที่Go to App Service Settings
  • คลิกที่Toolsปุ่ม
  • ภายใต้การพัฒนาคลิกที่App Service Editor
  • เปิดOnหากยังไม่ได้เปิดใช้งานและคลิกที่Go
  • เมื่อโหลดแล้วให้ลากและวางproject.jsonไฟล์ของคุณลงในโฟลเดอร์ของฟังก์ชัน (โฟลเดอร์ที่ตั้งชื่อตามฟังก์ชันของคุณ

การใช้จุดสิ้นสุด SCM (Kudu)

  • นำทางไปยัง: https://<function_app_name>.scm.azurewebsites.net
  • คลิกที่Debug Console> CMD
  • นำทางไปยัง D:\home\site\wwwroot\<function_name>
  • ลากและวางProject.jsonไฟล์ของคุณลงในโฟลเดอร์ (ลงในตารางไฟล์)

FTP

  • ทำตามคำแนะนำที่นี่เพื่อรับการกำหนดค่า FTP
  • เมื่อเชื่อมต่อแล้ว (ทำตามคำแนะนำด้านบน) คัดลอกProject.jsonไฟล์ของคุณไปที่/site/wwwroot/<function_name>

    สำหรับตัวเลือกการปรับใช้เพิ่มเติมโปรดดู: https://azure.microsoft.com/en-us/documentation/articles/web-sites-deploy/

บูรณาการอย่างต่อเนื่อง

หากคุณเปิดใช้งานการรวมอย่างต่อเนื่องและปรับใช้ฟังก์ชันของคุณกับproject.jsonไฟล์เมื่อแอปฟังก์ชันของคุณไม่ได้ทำงานการคืนค่าแพ็คเกจจะเกิดขึ้นโดยอัตโนมัติเมื่อแอปฟังก์ชันของคุณเริ่มต้น ขอแนะนำว่าคุณไม่ควรเพิ่มproject.lock.jsonไฟล์ของคุณในการควบคุมแหล่งที่มา

แอสเซมบลีที่รวบรวมไว้ล่วงหน้า

ฟังก์ชั่นอาจถูกปรับใช้เป็นแอสเซมบลีที่คอมไพล์ไว้ล่วงหน้าและในกรณีนี้การจัดการการพึ่งพาทั้งหมดจะได้รับการจัดการใน Visual Studio ตัวเลือกนี้อาจจะใช้เป็นห้องสมุดชั้นมาตรฐานใน Visual Studio รุ่นใดหรือโดยการใช้Visual Studio 2017 Azure ฟังก์ชั่นเครื่องมือ


1
อะไรคือสิ่งfunction script rootที่ย่อหน้าสุดท้ายของคุณหรือไม่ ฉันเข้าใจว่ามันเป็นที่project.jsonตั้ง ถูกต้องหรือไม่
justinyoo

2
@JustInChronicles นั่นคือโฟลเดอร์หนึ่งที่ขึ้นจากนั้นจริงๆ project.jsonอยู่ในโฟลเดอร์การทำงานของคุณซึ่งเป็นลูกของโฟลเดอร์รากสคริปต์ รากของสคริปต์แมปไปยังwwwrootโฟลเดอร์ของคุณใน Azure
Fabio Cavalcante

ขอขอบคุณสำหรับการชี้แจง!
justinyoo

@FabioCavalcante รักแพ็คเกจนักเก็ตที่คุณวางไว้ในตัวอย่างสิ่งที่น่าอัศจรรย์มากมายพร้อมบริการองค์ความรู้สีฟ้า !!!
โธมัส

โปรดทราบว่า 'Visual Studio Online' ที่กล่าวถึงในคำตอบ stackoverflow ด้านบนstackoverflow.com/a/36411537/5288052มีให้จากเครื่องมือ Azure เป็น 'App Service Editor' (ดูstackoverflow.com/a/38173438/5288052 )
Stefano Spinucci

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 Functions ของคุณได้ วิธีที่ง่ายที่สุดคือใช้ Visual Studio 2017 15.4 ที่มีเทมเพลตสำหรับ Azure Functions ทำตามขั้นตอนด้านล่าง

1) เพิ่มโครงการฟังก์ชัน Azure: คลิกขวาที่โซลูชันและเลือกเพิ่มโครงการใหม่ ไปที่ตัวเลือก CLOUD ที่นั่นคุณจะพบโครงการ "Azure Function"

ฟังก์ชัน Azure

2) ตอนนี้มันสวยที่จะเพิ่มแพ็คเกจ Nuget ใด ๆ ขยาย "DEPENDENCIES" และคลิกขวาเพื่อเลือกตัวเลือก "Manage Nuget Packages" กล่องโต้ตอบ Nuget Package จะปรากฏขึ้นเลือกแพ็คเกจ Nuget ที่คุณต้องการติดตั้ง ดูภาพหน้าจอด้านล่าง

3) เผยแพร่ฟังก์ชัน Azure ของคุณแล้ว Visual Studio จะดูแลการตั้งค่าทั้งหมดและอื่น ๆ

วิธีนี้จะใช้ได้ผลก็ต่อเมื่อคุณใช้ Visual Studio 2017 15.4 ขึ้นไปหากไม่ใช่คุณจะต้องทำตามวิธีอื่น ๆ ตามที่ผู้อื่นอธิบายไว้


1
นี่คือโฟลว์มาตรฐานสำหรับ VS / Class Libraries (ซึ่งก็คือโปรเจ็กต์ Azure Functions) และไม่เฉพาะเจาะจงสำหรับ Azure Functions ขั้นตอนเฉพาะสำหรับ Azure Functions คือขั้นตอนที่ระบุไว้ด้านล่าง ฉันจะเพิ่มหมายเหตุในคำตอบเดิมของฉันรวมถึงรายละเอียดสำหรับขั้นตอนที่อัปเดตใน 2.0
Fabio Cavalcante

7

สมมติว่าเราต้องการใช้SFTPไคลเอนต์ซึ่งเป็นไลบรารีภายนอกที่เก็บไว้ที่ใดที่หนึ่งในNuGet.

ในการดำเนินการดังกล่าวให้เป็นไปตามข้อกำหนดล่าสุดของAzure Functionsให้ทำดังต่อไปนี้:

  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's ด้วยตนเองลงในถังโฟลเดอร์โดยใช้Azure เมฆสำรวจจากVisual Studio

ใส่คำอธิบายภาพที่นี่


มีอะไรเปลี่ยนแปลงไปบ้างไหมตั้งแต่คำตอบนี้ ดูเหมือนจะไม่ได้ผลอีกต่อไป ฉันเห็น "ข้อผิดพลาดของบริการคอมไพล์" - เรียกใช้งาน 'Functions.TimerTrigger2' (ล้มเหลว, Id = a318d5b7-a02c-4ba0-bb04-037beda89b1c) ไม่พบไฟล์ 'D: \ home \ site \ wwwroot \ bin \ Google.Apis . Sheets.v4.dll '
ผู้ใช้

เมื่อคุณได้รับการติดตั้งสคริปต์ผ่านfunction.proj, สถานที่สำหรับการที่dllจะปรากฏในส่วนท่อนหลังจากช่วงระยะเวลาหนึ่ง บางครั้งคุณต้องโหลดหน้าซ้ำสำหรับฟังก์ชัน Azure อีกครั้งบางครั้งกดปุ่ม "Run" เพื่อดูการติดตั้งแพ็คเกจ NuGet และตำแหน่งด้วย โปรดตรวจสอบสิ่งที่กำลังพิมพ์ในส่วนบันทึกเป็นตำแหน่งที่ตั้งและลองใส่สิ่งนั้น
Arsen Khachaturyan

2

โปรดทราบว่ารูปแบบ. csproj ใหม่ใน Visual studio 2017 ได้รับการสนับสนุนด้วย ถ้าคุณสร้างโปรเจ็กต์ของคุณเป็น ASPNET Web Project รันไทม์ Azure Functions จะดาวน์โหลดแพ็กเกจ nuget ทั้งหมดที่จำเป็นก่อนสร้างโปรเจ็กต์ของคุณ


สำหรับ ASP.NET Web Project นั้น VS 2015 ก็ใช้ได้เช่นกัน สำหรับ Azure Functions Tools นั่นคือ VS 2017 เท่านั้น ความแตกต่างที่สำคัญคือคุณกำลังปรับใช้บิตที่คอมไพล์ไว้ล่วงหน้า (และการอ้างอิง) ดังนั้นรันไทม์จึงไม่จัดการการคืนค่าให้คุณ แต่ใช่นั่นเป็นวิธีที่ใหม่กว่าในการเขียนฟังก์ชันและจัดการการอ้างอิง ฉันจะอัปเดตคำตอบเพื่อแสดงคุณสมบัติล่าสุด
Fabio Cavalcante
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.