คำถามที่ดี. สำหรับปัญหาเฉพาะของคุณดูเหมือนว่าคุณมีการอ้างอิงที่แก้ไขไม่ตรงกัน เมื่อสิ่งนี้เกิดขึ้นอาจเป็นเพราะคุณกำลังเรียกใช้แอปพลิเคชันของคุณบน dnx ที่เข้ากันไม่ได้ เรายังคงทำการเปลี่ยนแปลงที่ยิ่งใหญ่มากดังนั้นหากคุณเคยเห็นวิธีการหายไปของประเภทที่ขาดหายไปโอกาสที่คุณจะเรียกใช้betaX
แพ็คเกจและbetaY
dnx หรือในทางกลับกัน
โดยเฉพาะอย่างยิ่งAssembly Neutral Interfacesถูกลบออกใน beta4 แต่ดูเหมือนว่าแอปพลิเคชันที่คุณใช้งานยังคงใช้งานอยู่
เรามีแผนที่จะจัดทำขึ้นเพื่อให้แพ็กเกจสามารถทำเครื่องหมาย dnx ขั้นต่ำที่ต้องใช้ในการรันเพื่อให้ข้อความแสดงข้อผิดพลาดชัดเจนยิ่งขึ้น เมื่อเวลาผ่านไปการเปลี่ยนแปลงที่ทำลายล้างก็จะตายลง
โดยทั่วไปแล้วฉันรู้สึกว่าถึงเวลาที่ต้องเขียนคำแนะนำเกี่ยวกับวิธีการวินิจฉัยปัญหาเช่นนี้เมื่อใช้ dnx (เนื่องจากมันค่อนข้างแตกต่างจาก. NET ที่มีอยู่)
การอ้างอิงที่คุณใส่ไว้project.json
เป็นระดับบนสุดเท่านั้น เวอร์ชันเป็นขั้นต่ำเสมอ (เหมือนกับแพ็คเกจ NuGet) ซึ่งหมายความว่าเมื่อคุณระบุคุณระบุจริงๆFoo 1.0.0-beta4
Foo >= 1.0.0-beta4
ซึ่งหมายความว่าหากคุณขอMVC 0.0.1
และเวอร์ชันขั้นต่ำในฟีดที่กำหนดค่าไว้คือMVC 3.0.0
คุณจะได้รับเวอร์ชันนั้น เราไม่เคยลอยเวอร์ชันของคุณเว้นแต่คุณจะระบุ หากคุณขอ 1.0.0 และมีอยู่คุณจะได้รับ 1.0.0 แม้ว่าจะมีเวอร์ชันใหม่กว่าก็ตาม การระบุเวอร์ชันว่างเป็นสิ่งที่ไม่ดีเสมอไปและจะไม่ได้รับอนุญาตในการสร้างในภายหลัง
มีคุณลักษณะใหม่ที่เรากำลังแนะนำให้รู้จักกับนักเก็ตที่เรียกว่าเวอร์ชันลอย วันนี้ใช้ได้เฉพาะกับแท็กก่อนเปิดตัว แต่ในเวอร์ชันถัดไปจะใช้งานได้กับส่วนอื่น ๆ ของเวอร์ชัน ซึ่งคล้ายกับไวยากรณ์ของ npm และ gem สำหรับการระบุช่วงเวอร์ชันในไฟล์ข้อมูลจำเพาะแพ็กเกจ
1.0.0-*
- หมายถึงให้ฉันเป็นเวอร์ชันที่สูงที่สุดที่ตรงกับคำนำหน้า (ตามกฎการกำหนดเวอร์ชันเชิงความหมาย ) หรือหากไม่มีเวอร์ชันที่ตรงกับคำนำหน้านั้นให้ใช้พฤติกรรมปกติและรับเวอร์ชันต่ำสุด> = เวอร์ชันที่ระบุให้ฉัน
project.lock.json
เมื่อคุณเรียกคืนค่าในล่าสุดสร้างก็จะเขียนออกไฟล์ที่เรียกว่า ไฟล์นี้จะมีการปิดการอ้างอิงสำหรับกรอบงานเป้าหมายทั้งหมดที่กำหนดไว้ในรูปแบบproject.json
.
เมื่อสิ่งนี้ล้มเหลวคุณสามารถทำสิ่งต่อไปนี้:
ดูการอ้างอิงที่แก้ไขโดยใช้kpm list
. สิ่งนี้จะแสดงให้คุณเห็นแพ็คเกจเวอร์ชันแก้ไขที่อ้างถึงโดยโปรเจ็กต์ของคุณและสิ่งที่การอ้างอิงดึงเข้ามาเช่นถ้า A -> B มันจะแสดง:
ก
-> ข
ข
->
เอาต์พุตรายการ KPM จริง:
รายการการอ้างอิงสำหรับ ClassLibrary39 (C: \ Users \ davifowl \ Documents \ Visual Studio 14 \ Projects \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)
[Target framework DNX,Version=v4.5.1 (dnx451)]
framework/Microsoft.CSharp 4.0.0.0
-> ClassLibrary39 1.0.0
framework/mscorlib 4.0.0.0
-> ClassLibrary39 1.0.0
framework/System 4.0.0.0
-> ClassLibrary39 1.0.0
framework/System.Core 4.0.0.0
-> ClassLibrary39 1.0.0
*Newtonsoft.Json 6.0.1
-> ClassLibrary39 1.0.0
[Target framework DNXCore,Version=v5.0 (dnxcore50)]
*Newtonsoft.Json 6.0.1
-> ClassLibrary39 1.0.0
System.Runtime 4.0.20-beta-22709
-> ClassLibrary39 1.0.0
* หมายถึงการพึ่งพาโดยตรง
หากคุณมีวิชวลสตูดิโอที่ใช้งานได้ (ซึ่งแตกกับ DNX ในขณะนี้) คุณสามารถดูโหนดอ้างอิงได้ มีข้อมูลเดียวกันกับภาพ:
มาดูกันว่าความล้มเหลวในการพึ่งพามีลักษณะอย่างไร:
นี่คือ project.json
{
"version": "1.0.0-*",
"dependencies": {
"Newtonsoft.Json": "8.0.0"
},
"frameworks" : {
"dnx451" : {
"dependencies": {
}
},
"dnxcore50" : {
"dependencies": {
"System.Runtime": "4.0.20-beta-22709"
}
}
}
}
Newtonsoft.Json 8.0.0
ไม่มีอยู่จริง ดังนั้นการเรียกคืน kpm จึงแสดงสิ่งต่อไปนี้:
เมื่อวินิจฉัยว่าการคืนค่าอาจล้มเหลวให้ดูที่คำขอ HTTP ที่สร้างขึ้นพวกเขาจะบอกคุณว่าแหล่งที่มาของแพ็กเกจที่กำหนดค่าไว้ที่ kpm ดูแล้วมีCACHE
คำขอใดในภาพด้านบน นี่คือการแคชในตัวตามประเภทของทรัพยากร (nupkg หรือ nuspec) และมี TTL ที่กำหนดค่าได้ (ดูที่kpm restore --help
) หากคุณต้องการบังคับkpm
ให้กดแหล่งที่มา NuGet ระยะไกลให้ใช้--no-cache
แฟล็ก:
ข้อผิดพลาดเหล่านี้ยังแสดงใน Visual Studio ในหน้าต่างเอาต์พุตบันทึกตัวจัดการแพ็คเกจ:
หมายเหตุด้าน!
แหล่งที่มาของแพ็คเกจ
ฉันจะอธิบายวิธีการทำงานของ NuGet.config ในตอนนี้ (ซึ่งอาจมีการเปลี่ยนแปลงในอนาคต) โดยค่าเริ่มต้นคุณมี NuGet.config ที่มีแหล่งที่มา NuGet.org เริ่มต้นที่กำหนดค่าไว้ทั่วโลกในรูปแบบ%appdata%\NuGet\NuGet.Config
. คุณสามารถจัดการแหล่งข้อมูลส่วนกลางเหล่านี้ภายในวิชวลสตูดิโอหรือด้วยเครื่องมือบรรทัดคำสั่ง NuGet คุณควรดูแหล่งที่มาที่มีประสิทธิภาพของคุณเสมอ (รายการที่แสดงในเอาต์พุต kpm) เมื่อพยายามวินิจฉัยความล้มเหลว
อ่านเพิ่มเติมเกี่ยวกับ NuGet.config ที่นี่
กลับสู่ความเป็นจริง:
เมื่อการอ้างอิงไม่ได้รับการแก้ไขการเรียกใช้แอปพลิเคชันจะให้สิ่งนี้แก่คุณ:
> dnx . run
System.InvalidOperationException: Failed to resolve the following dependencies for target framework 'DNX,Version=v4.5.1':
Newtonsoft.Json 8.0.0
Searched Locations:
C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\{name}\project.json
C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\test\{name}\project.json
C:\Users\davifowl\.dnx\packages\{name}\{version}\{name}.nuspec
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\{name}.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\{name}.dll
C:\WINDOWS\Microsoft.NET\assembly\GAC_32\{name}\{version}\{name}.dll
C:\WINDOWS\Microsoft.NET\assembly\GAC_64\{name}\{version}\{name}.dll
C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\{name}\{version}\{name}.dll
Try running 'kpm restore'.
at Microsoft.Framework.Runtime.DefaultHost.GetEntryPoint(String applicationName)
at Microsoft.Framework.ApplicationHost.Program.ExecuteMain(DefaultHost host, String applicationName, String[] args)
at Microsoft.Framework.ApplicationHost.Program.Main(String[] args)
รันไทม์โดยทั่วไปจะพยายามตรวจสอบว่ากราฟการอ้างอิงทั้งหมดได้รับการแก้ไขก่อนที่จะพยายามเรียกใช้ หากแนะนำให้รันkpm restore
เป็นเพราะไม่พบการอ้างอิงในรายการ
อีกสาเหตุหนึ่งที่คุณอาจได้รับข้อผิดพลาดนี้คือถ้าคุณใช้รสชาติ dnx ผิด หากแอปพลิเคชันของคุณระบุเฉพาะ dnx451 และคุณพยายามเรียกใช้ CoreCLR dnx คุณอาจพบปัญหาที่คล้ายกัน ใส่ใจกับกรอบเป้าหมายในข้อความแสดงข้อผิดพลาด:
สำหรับการวิ่ง:
dnx4x - runs on dnx-clr-{etc}
dnxcore50 - runs on dnx-coreclr-{etc}
เมื่อคุณพยายามเรียกใช้คุณควรจำไว้ว่าการทำแผนที่จิตจาก clr ถึงกรอบเป้าหมายที่กำหนดไว้ในproject.json
ไฟล์.
สิ่งนี้ยังปรากฏใน Visual Studio ภายใต้โหนดอ้างอิง:
โหนดที่ทำเครื่องหมายเป็นสีเหลืองไม่ได้รับการแก้ไข
สิ่งเหล่านี้ปรากฏในรายการข้อผิดพลาดด้วย:
อาคาร
ข้อผิดพลาดเหล่านี้ยังปรากฏขึ้นเมื่อสร้าง เมื่อสร้างจากบรรทัดคำสั่งเอาต์พุตจะมีรายละเอียดมากและมีประโยชน์อย่างมากเมื่อวินิจฉัยปัญหา:
> kpm build
Building ClassLibrary39 for DNX,Version=v4.5.1
Using Project dependency ClassLibrary39 1.0.0
Source: C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\ClassLibrary39\project.json
Using Assembly dependency framework/mscorlib 4.0.0.0
Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\mscorlib.dll
Using Assembly dependency framework/System 4.0.0.0
Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.dll
Using Assembly dependency framework/System.Core 4.0.0.0
Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Core.dll
Using Assembly dependency framework/Microsoft.CSharp 4.0.0.0
Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Microsoft.CSharp.dll
Building ClassLibrary39 for DNXCore,Version=v5.0
Using Project dependency ClassLibrary39 1.0.0
Source: C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\ClassLibrary39\project.json
Using Package dependency System.Console 4.0.0-beta-22709
Source: C:\Users\davifowl\.dnx\packages\System.Console\4.0.0-beta-22709
File: lib\contract\System.Console.dll
Using Package dependency System.IO 4.0.10-beta-22231
Source: C:\Users\davifowl\.dnx\packages\System.IO\4.0.10-beta-22231
File: lib\contract\System.IO.dll
Using Package dependency System.Runtime 4.0.20-beta-22231
Source: C:\Users\davifowl\.dnx\packages\System.Runtime\4.0.20-beta-22231
File: lib\contract\System.Runtime.dll
Using Package dependency System.Text.Encoding 4.0.10-beta-22231
Source: C:\Users\davifowl\.dnx\packages\System.Text.Encoding\4.0.10-beta-22231
File: lib\contract\System.Text.Encoding.dll
Using Package dependency System.Threading.Tasks 4.0.10-beta-22231
Source: C:\Users\davifowl\.dnx\packages\System.Threading.Tasks\4.0.10-beta-22231
File: lib\contract\System.Threading.Tasks.dll
เอาต์พุตแสดงแอสเซมบลีทั้งหมดที่ส่งผ่านไปยังคอมไพเลอร์จากแพ็กเกจและการอ้างอิงโปรเจ็กต์ เมื่อคุณเริ่มบิวด์ล้มเหลวคุณควรดูที่นี่เพื่อให้แน่ใจว่าแพ็กเกจที่คุณใช้นั้นใช้งานได้จริงบนแพลตฟอร์มเป้าหมายนั้น
นี่คือตัวอย่างของแพ็คเกจที่ใช้ไม่ได้กับ dnxcore50:
{
"version": "1.0.0-*",
"dependencies": {
"Microsoft.Owin.Host.SystemWeb": "3.0.0"
},
"frameworks": {
"dnx451": {
"dependencies": {
}
},
"dnxcore50": {
"dependencies": {
"System.Console": "4.0.0-beta-22709"
}
}
}
}
Microsoft.Owin.Host.SystemWeb เวอร์ชัน 3.0.0 ไม่มีแอสเซมบลีใด ๆ ที่ทำงานบน dnxcore50 (ดูที่โฟลเดอร์ lib ของแพ็กเกจที่คลายซิป) เมื่อเราเรียกใช้kpm build
:
สังเกตว่า "ใช้ Package Microsoft.Owin.Host.SystemWeb" แต่ไม่มี "File:" นี่อาจเป็นสาเหตุของการสร้างล้มเหลว
นี่เป็นการทิ้งสมองของฉัน