มีอะไรใหม่ใน .NET Core 2 และ C# 7 : ไม่ต้อง run dotnet restore

มีอะไรใหม่ใน .NET Core 2 และ C# 7 : ไม่ต้อง run dotnet restore
ใน .NET เวอร์ชั่น 2.0 ขึ้นไปเราไม่ต้อง run คำสั่ง dotnet restore อีกต่อไปแล้ว เพราะเมื่อท่านใช้คำสั่งที่ต้องการ dotnet restore NuGet จะ run ให้เองโดยอัตโนมัติ
dotnet restore เป็นคำสั่งหรับดึง dependency ไฟล์ต่างๆ เช่นไฟล์ Assembly ที่เป็น library ของ .NET Core และเครื่องเมื่ออื่น ๆ ที่โปรเจ็กต์นั้นต้องการใช้ โดยดาวน์โหลดซอฟต์แวร์ผ่านบริการของ NuGet เป็นคำสั่งที่มีมาตั้งแต่ .NET Core เวอร์ชั่น 1.x โดยการดึง dependency และเครื่องมือจะเกิดขึ้นพร้อม ๆ กันและทำงานขนานกัน
NuGet คือกลไกการใช้โค้ดร่วมกัน มันทำหน้าที่กำหนดการนิยาม การเก็บ และการนำโค้ดมาใช้งาน
โดยจะมีเครื่องมือสำหรับแต่ละหน้าที่มาให้ NuGet จับรวมสิ่งที่เกี่ยวข้องกันบีบอัดไว้เป็นซิปไฟล์ที่มีนามสกุล .nupkg เรียกว่า package
ในนั้นอาจประกอบด้วยโค้ดที่คอมไพล์แล้ว (อยู่ในสภาพ DLL : Dynamic Liked Library) และไฟล์อื่น ๆ ที่เกี่ยวข้องกับโค้ดนั้น เช่น ไฟล์ manifest ซึ่งเป็นไฟล์ที่เก็บข้อมูลพรรณนาลักษณะของ DLL นั้น ๆ เช่นหมายเลขเวอร์ชั่น นักพัฒนา ฯ สามารถสร้างเพ็กเกจลักษณะนี้เพื่อแบ่งปันโค้ดร่วมกันกับนักพัฒนา ฯ อื่น ๆ ได้โดยสะดวก
การที่จะดึง package ที่เป็น dependency ได้ NuGet จำเป็นต้องอาศัยสิ่งที่เรียกว่า feed ซึ่งเป็นไฟล์เก็บข้อมูลว่าจะให้ไปเอา package มาจากที่ใด
เราสามารถสร้าง feed เป็นไฟล์ชื่อ NuGet.cofig เก็บไว้ในโฟลเดอร์ของโปรเจ็กต์หรือจะป้อนที่ command prompt โดยใช้ argument –packages ก็ได้
แต่ถ้าไม่ได้กำหนดไว้ NuGet จะไปอ่านเอาจาก cache ที่อยู่ในโฟลเดอร์ .nuget/packages ของ “home folder” ของผู้ใช้ที่มีอยู่ในทุกระบบปฏิบัติการ
ยกตัวอย่างเช่นในระบบปฏิบัติการ Linux จะเป็นโฟลดอร์ /home/user1 ถ้าเป็นระบบปฏิบัติการวินโดวส์จะเป็นโฟลเดอร์ C:\Users\user1
ลำดับการทำงานของคำสั่ง dotnet restore คือ มันจะดึง package ที่มีเครื่องมือที่จำเป็นต้องใช้สำหรับโปรเจ็กต์นั้น ๆ
จากนั้นก็มาดูว่าเครื่องมือแต่ละตัวมี dependency อะไรบ้าง และจะไปไล่ดึง package ที่มี dependency มาจนครบทุกตัว
แต่เราสามารถเปลี่ยนแปลงการทำงานของ dotnet restore โดยนำข้อกำหนดไปใส่ไว้ในไฟล์ NuGet.config เองก็ได้
ยกตัวอย่างเช่นเราอาจระบุได้ว่าต้องการให้เอา package ต่าง ๆ ที่ดาวน์โหลดมาไปเก็บไว้ที่ไหนโดยการแก้ไขหัวข้อ globalPackagesFolder ที่อยู่ภายใน NetGet.config
ภายในนั้นจะมี node ย่อยต่าง ๆ เช่น <config> <bindingRedirects> และ <solution> เป็นต้น
node ย่อยเหล่านี้ทำหน้าที่กำหนดภาคต่าง ๆ โดยภายในแต่ละภาคจะมีหน่วยที่มี attribute เป็นคำสั่ง add ตามด้วยกุญแจที่คู่กับค่า (key/value)
ยกตัวอย่างบรรทัดที่ 2 จะเห็นคำสั่ง add ตามด้วย key คือ nugget.org ส่วน value ที่มีค่าเป็น URL ที่ระบุ server ของ NuGet ภายในหนึ่งภาคอาจมี attribute ได้หลายอัน
โค้ดบรรทัดที่ 1 ถึง 5 คือภาค <packageSources> ทำหน้าที่แสดงรายการแหล่งที่มาของ package
เมื่อ NuGet ทำกระบวนการ restore มันจะตรวจดูรายการเหล่านี้เพื่อใช้เป็นแหล่งต้นทางของการดาวน์โหลด package
ในโค้ดตัวอย่างนี้มี source อยู่สามแหล่ง
สองแหล่งแรกคือ "nuget.org" และ "Contoso" ระบุเป็น URL เพื่อการดาวน์โหลดผ่านอินเตอร์เน็ต
ส่วนอันที่สาม "Test Source" ระบุเป็นเส้นทางของไฟล์เพื่อการนำ package มาจากฮาร์ดดิสก์ของคอมพิวเตอร์เครื่องนั้น
โค้ดบรรทัดที่ 7 ถึง 16 คือภาค <packageSourceCredentials> กำหนดชื่อผู้ใช้และรหัสผ่านสำหรับการดาวน์โหลด source
โดยจะมี node ย่อยสำหรับแหล่งต้นทางของการดาวน์โหลด package แยกต่างหากจากกัน
บรรทัดที่ 8 ถึง 11 เป็นของ "Contoso"
ขณะที่บรรทัดที่ 22 ถึง 15 เป็นของ "Test Source"
โปรดสังเกตคำว่า "Test Source" มีเคาะวรรคอยู่ภายในเมื่อนำมาเป็นชื่อ node จะต้องแทนที่เคาะวรรคด้วย _x0020_ ทำให้มีชื่อ node เป็น <Test_x0020_Source>
โค้ดบรรทัด 18 ถึง 27 เป็นตัวอย่างภาค <packageSourceCredentials> ที่มีรหัสผ่านเป็นชนิด "ClearTextPassword" ซึ่งหมายถึงการใช้รหัสผ่านแบบไม่เข้ารหัส (unencrypted password)
ยกตัวอย่างเช่นตัวแปรสภาพแวดล้อม home ของระบบปฏิบัติการวินโดวส์ถูกกำหนดไว้เป็น c:\users\username
ดังนั้นหากเรากำหนด %HOME%\NuGetRepository ไว้ใน NuGet.config จะมีผลให้ NuGet แปลความหมายเป็น c:\users\username\NuGetRepository
ในกรณีระบบปฏิบัติการ Linux หรือ Mac OSกำหนดค่าของตัวแปรสภาพแวดล้อม home ไว้เป็น /home/myStuff
หากเรากำหนดค่าใน NuGet.config ไว้เป็น %HOME%/NuGetRepository จะได้ผลลัพธ์เป็น /home/myStuff/NuGetRepository
ในโค้ดตัวอย่างบรรทัด 12 เรากำหนดค่าของ "repositoryPath" ให้มีค่าเป็น "%PACKAGEHOME%\External" ซึ่งเป็นการกำหนดเส้นทางไฟล์แบบระบบปฏิบัติการวินโดวส์
หากเป็นระบบปฏิบัติการ Linux หรือ Mac OS จะต้องเขียนว่า $PACKAGE_HOME/External แทน บรรทัด 19 key "defaultPushSource" ทำหน้าที่ระบุตำแหน่ง server สำหรับคำสั่ง push บรรทัด 22-24 แสดงตัวอย่างการกำหนดค่า proxy server โดยมีรายการเป็น ชื่อ server ชื่อผู้ใช้ และรหัสผ่าน (สำหรับ proxy) ตามลำดับ
บรรทัด 27 ถึง 33 คือ node <packageRestore> ทำหน้าที่กำหนดพฤติกรรมการ restore ของ NuGet
ยกตัวอย่างเช่น บรรทัด 29 คีย์ "enabled" เป็นตัวกำหนดว่าอนุญาตให้ NuGet ดาวน์โหลด package ที่ขาดหายไปหรือไม่
key “automatic” ในบรรทัด 32 กำหนดว่าให้หา package ที่หายไปขณะติดตั้งโปรแกรม visual studio ด้วยหรือไม่
ใน .NET Core เวอร์ชั่น 2 เป็นต้นไป กระบวนการของคำสั่ง dotnet restore จะเริ่มโดยอัตโนมัติเมื่อเราใช้สั่งคำสั่งใดคำสั่งหนึ่งต่อไปนี้
- dotnet new => สร้างโปรเจ็กต์ใหม่
- dotnet build => build โปรเจ็กต์
- dotnet build server => มีปฏิสัมพันธ์กับ server ที่ถูกเริ่มการทำงานโดยการ build
- dotnet run => run sourcecode
- dotnet test => run หน่วยทดสอบ (Unit test)
- dotnet publish => จับโค้ดและ dependency ทั้งหมดมาทำเป็น package เพื่อการ deploy
- dotnet pack => จับโค้ดทั้งหมดอัดเป็น package สำหรับ NuGet
ยกตัวอย่างเช่น ระบบอัตโนมัติบางแบบเช่นระบบการ build โปรแกรมที่จำเป็นต้องเรียกคำสั่ง dotnet restore เองเพื่อจะได้ควบคุมการใช้งานเครือข่ายได้
วิธียกเลิกการ restoreโดยอัตโนมัติทำได้โดยใส่ตัวเลือก --no-restore ต่อท้ายแต่ละคำสั่งที่ว่ามาข้างต้น