Pertanyaan bagus. Untuk masalah spesifik Anda, sepertinya Anda memiliki ketidakcocokan dalam dependensi yang Anda selesaikan. Ketika hal-hal seperti ini terjadi, itu kemungkinan karena Anda menjalankan aplikasi pada dnx yang tidak kompatibel. Kami masih membuat perubahan sangat besar jadi jika Anda pernah melihat metode yang hilang dari jenis yang hilang, kemungkinan Anda akhirnya menjalankan betaX
paket dan betaY
dnx atau sebaliknya.
Lebih khusus lagi, Assembly Neutral Interfaces telah dihapus dalam versi beta4 tetapi sepertinya aplikasi yang Anda jalankan masih menggunakannya.
Kami memiliki rencana untuk membuatnya sehingga paket dapat menandai dnx minimum yang harus dijalankan untuk membuat pesan kesalahan lebih jelas. Seiring berjalannya waktu, perubahan yang terjadi akan mereda.
Secara umum, saya merasa sudah waktunya saya menulis panduan tentang cara mendiagnosis masalah seperti ini ketika menggunakan dnx (karena ini cukup berbeda dengan .NET yang ada).
Ketergantungan yang Anda masukkan project.json
hanya tingkat atas. Versi juga selalu minimum (seperti paket NuGet). Ini berarti bahwa ketika Anda menentukan Foo 1.0.0-beta4
Anda benar-benar menentukan Foo >= 1.0.0-beta4
. Ini berarti jika Anda meminta MVC 0.0.1
dan versi minimum pada umpan yang Anda konfigurasikan adalah MVC 3.0.0
, Anda akan mendapatkannya. Kami juga TIDAK PERNAH melayang versi Anda kecuali Anda menentukannya. Jika Anda meminta 1.0.0 dan itu ada, Anda akan mendapatkan 1.0.0 bahkan jika versi yang lebih baru ada. Menentukan versi kosong SELALU buruk dan akan ditolak di build selanjutnya.
Ada fitur baru yang kami perkenalkan ke nuget yang disebut versi mengambang. Hari ini hanya berfungsi pada tag pra-rilis, tetapi pada versi berikutnya akan berfungsi pada lebih banyak bagian dari versi. Ini mirip dengan sintaks npm dan gem untuk menentukan rentang versi dalam file spesifikasi paket.
1.0.0-*
- Berarti memberi saya versi TERTINGGI yang cocok dengan awalan (menurut aturan versi semantik ) ATAU jika tidak ada versi yang cocok dengan awalan itu, gunakan perilaku normal dan dapatkan saya versi TERENDAH> = versi yang ditentukan.
Ketika Anda menjalankan restore di build terbaru, itu akan menulis file bernama project.lock.json
. File ini akan memiliki penutupan transitif dependensi untuk semua kerangka kerja target yang didefinisikan dalam project.json
.
Ketika sesuatu seperti ini gagal, Anda dapat melakukan hal berikut:
Lihatlah dependensi yang diselesaikan menggunakan kpm list
. Ini akan menunjukkan kepada Anda versi-versi paket yang diselesaikan yang dirujuk oleh proyek Anda dan ketergantungan apa yang menariknya. Misalnya jika A -> B, itu akan menunjukkan:
SEBUAH
-> B
B
->
Output daftar KPM aktual:
Ketergantungan dependensi untuk 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
* Berarti ketergantungan langsung.
Jika Anda memiliki studio visual yang berfungsi (yang terputus dengan DNX sekarang), Anda dapat melihat node referensi. Ini memiliki data yang sama diwakili secara visual:
Mari kita lihat seperti apa kegagalan dependensi:
Inilah 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
tidak ada. Jadi menjalankan kpm restore menunjukkan hal berikut:
Ketika mendiagnosis ketika pemulihan mungkin gagal, lihat permintaan HTTP yang dibuat, mereka memberi tahu Anda apa yang dilihat oleh sumber paket yang dikonfigurasikan kpm. Perhatikan pada gambar di atas, ada CACHE
permintaan. Ini adalah caching bawaan berdasarkan jenis sumber daya (nupkg atau nuspec) dan memiliki TTL yang dapat dikonfigurasi (lihat kpm restore --help
). Jika Anda ingin memaksa kpm
untuk menekan sumber NuGet jarak jauh, gunakan --no-cache
bendera:
Kesalahan ini juga muncul di Visual Studio di jendela output log manajer paket:
Catatan samping!
Sumber Paket
Saya akan menjelaskan cara kerja NuGet.config sekarang (yang kemungkinan akan berubah di masa depan). Secara default Anda memiliki NuGet.config dengan sumber NuGet.org default yang dikonfigurasi secara global di %appdata%\NuGet\NuGet.Config
. Anda dapat mengelola sumber-sumber global ini dalam studio visual atau dengan alat baris perintah NuGet. Anda harus selalu melihat sumber efektif Anda (yang tercantum dalam output kpm) ketika mencoba mendiagnosis kegagalan.
Baca lebih lanjut tentang NuGet.config di sini
Kembali pada kenyataan:
Ketika dependensi tidak terselesaikan, menjalankan aplikasi akan memberi Anda ini:
> 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)
Runtime pada dasarnya mencoba untuk memvalidasi bahwa seluruh grafik dependensi diselesaikan sebelum mencoba untuk menjalankan. Jika disarankan berjalan kpm restore
itu karena tidak dapat menemukan dependensi yang tercantum.
Alasan lain mengapa Anda mungkin mendapatkan kesalahan ini adalah jika Anda menjalankan rasa dnx yang salah. Jika aplikasi Anda hanya menentukan dnx451 dan Anda mencoba menjalankan dnx CoreCLR, Anda mungkin melihat masalah yang sama. Perhatikan kerangka kerja target dalam pesan kesalahan:
Untuk menjalankan:
dnx4x - runs on dnx-clr-{etc}
dnxcore50 - runs on dnx-coreclr-{etc}
Ketika Anda mencoba untuk menjalankan, Anda harus ingat bahwa pemetaan mental dari CLR ke kerangka kerja target yang didefinisikan dalam Anda project.json
.
Ini juga muncul di Visual Studio di bawah simpul referensi:
Node yang ditandai sebagai kuning tidak terselesaikan.
Ini juga muncul di daftar kesalahan:
Bangunan
Kesalahan ini juga muncul saat membangun. Ketika membangun dari baris perintah, outputnya sangat verbose dan bisa sangat berguna ketika mendiagnosis masalah:
> 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
Keluaran menunjukkan semua rakitan dilewatkan ke kompiler dari paket dan referensi proyek. Ketika Anda mulai mendapatkan kegagalan membangun, penting untuk melihat di sini untuk memastikan bahwa paket yang Anda gunakan benar-benar berfungsi pada platform target itu.
Berikut ini contoh paket yang tidak berfungsi pada 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 versi 3.0.0 tidak memiliki rakitan yang berjalan di dnxcore50 (lihat folder lib paket unzipped). Ketika kami menjalankan kpm build
:
Perhatikan ia mengatakan "menggunakan Paket Microsoft.Owin.Host.SystemWeb" tetapi tidak ada "File:". Ini bisa menjadi alasan kegagalan pembangunan.
Di sini berakhir dump otak saya