Saya mencoba menjalankan versi modifikasi dari sampel HelloWeb untuk ASP.NET vNext di DNX menggunakan Kestrel. Saya mengerti bahwa ini sangat sulit , tetapi saya berharap tim ASP.NET setidaknya akan membuat aplikasi web yang paling sederhana bekerja :)
Lingkungan Hidup:
- Linux (Ubuntu, cukup banyak)
- Mono 3.12.1
- DNX 1.0.0-beta4-11257 (Saya juga memiliki 11249)
"Aplikasi Web" kode, di Startup.cs
:
using Microsoft.AspNet.Builder;
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseWelcomePage();
}
}
Konfigurasi proyek, di project.json
:
{
"dependencies": {
"Kestrel": "1.0.0-beta4",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta4",
"Microsoft.AspNet.Hosting": "1.0.0-beta4",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta4",
"Microsoft.Framework.Runtime": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Common": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Loader": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Interfaces": "1.0.0-beta4",
},
"commands": {
"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
},
"frameworks": {
"dnx451": {}
}
}
kpm restore
tampaknya berfungsi dengan baik.
Namun, ketika saya mencoba menjalankan, saya mendapatkan pengecualian yang menunjukkan bahwa Microsoft.Framework.Runtime.IApplicationEnvironment
tidak dapat ditemukan. Baris perintah dan kesalahan (agak diformat ulang)
.../HelloWeb$ dnx . kestrel
System.IO.FileNotFoundException: Could not load file or assembly
'Microsoft.Framework.Runtime.IApplicationEnvironment,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
or one of its dependencies.
File name: 'Microsoft.Framework.Runtime.IApplicationEnvironment,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke
(System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder,
System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00000] in <filename unknown>:0
Meskipun jelas, kebutuhan saya yang paling mendesak adalah untuk memperbaikinya, saya juga menghargai saran tentang cara pindah untuk mendiagnosis apa yang salah sehingga saya dapat memperbaiki sendiri masalah serupa di masa mendatang. (Itu juga kemungkinan akan membuat pertanyaan ini lebih bermanfaat bagi orang lain.)
Saya telah menemukan Microsoft.Framework.Runtime.IApplicationEnvironment
di Microsoft.Framework.Runtime.Interfaces
sumber perakitan , dan itu tampaknya tidak berubah baru-baru ini. Tidak jelas mengapa pengecualian menunjukkan nama seolah-olah itu adalah seluruh rakitan itu sendiri, bukan hanya antarmuka dalam rakitan lain. Saya menduga ini mungkin karena perakitan antarmuka netral , tetapi tidak jelas dari kesalahan. ( [AssemblyNeutral]
Sudah mati, jadi bukan itu ... )
sumber
Jawaban:
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 danbetaY
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 menentukanFoo 1.0.0-beta4
Anda benar-benar menentukanFoo >= 1.0.0-beta4
. Ini berarti jika Anda memintaMVC 0.0.1
dan versi minimum pada umpan yang Anda konfigurasikan adalahMVC 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 dalamproject.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:Output daftar KPM aktual:
Ketergantungan dependensi untuk ClassLibrary39 (C: \ Users \ davifowl \ Documents \ Visual Studio 14 \ Projects \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)
* 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
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 (lihatkpm restore --help
). Jika Anda ingin memaksakpm
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:
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:
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:
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:
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
sumber
Saya masih belum tahu sepenuhnya apa yang salah, tetapi saya sekarang memiliki serangkaian langkah untuk setidaknya membuatnya lebih mudah untuk mencoba berbagai hal:
~/.config/NuGet.config
untuk memastikan Anda menggunakan umpan NuGet yang tepatSaya akhirnya menggunakan baris perintah berikut untuk menguji berbagai opsi dengan cara yang cukup bersih:
Sepertinya masalah saya sebenarnya karena versi dependensi yang salah diinstal. Sejumlah versi
"1.0.0-beta4"
tampaknya sangat berbeda dengan"1.0.0-beta4-*"
. Sebagai contoh,Kestrel
ketergantungan menginstal versi 1.0.0-beta4-11185 ketika hanya ditentukan sebagai1.0.0-beta4
, tetapi versi 1.0.0-beta4-11262 dengan-*
di akhir. Saya ingin menentukanbeta4
secara eksplisit untuk menghindari kecelakaan menggunakan versi beta3 denganKonfigurasi proyek berikut berfungsi dengan baik:
sumber
-*
selalu memberi Anda versi pra-rilis terbaru, sementara tanpanya Anda mendapatkan versi terendah yang memenuhi semua dependensi (seperti biasa dengan NuGet). Tes ini memiliki beberapa contoh."frameworks": {"dnx451": {}}
telah diperbaiki untuk saya, tidak perlu untukdnxcore50
dnvm upgrade-self
, ini tidak akan ditingkatkan ke versi terbaru. Menjalankan command prompt VS sebagai admin menunjukkan versi dnvmrc1...
, namun ketika tidak sebagai admin itubeta5...
. Setelah perintah Anda, baik admin dan non admin meminta petunjuk yang ditampilkan sebagai versirc2...
(terbaru).dnx451
ataudnxcore50
jawaban ini membantu saya memahami topik ini sedikit lebih banyak: stackoverflow.com/a/30846048/89590 Jawaban singkat:dnx451
sesuai untuk mono.Anda dapat mengatur var env bernama
DNX_TRACE
untuk1
melihat TON info lebih lanjut diagnostik. Diperingatkan, ini info yang lebih banyak !sumber
Untuk membuatnya berfungsi, saya memodifikasi
project.json
.. sekarang sepertinya:Kuncinya sepertinya adalah bagian kerangka kerja.
Ubah nama juga mengubah cara
k web
kerjanya sehingga sekarangdnx . web
ataudnx . kestrel
Perbarui - sedikit lebih banyak info
Anehnya, setelah berjalan tanpa kerangka yang didefinisikan, ia pergi dan mendapatkan banyak hal tambahan ketika saya melakukannya
kpm restore
:.. maka itu berjalan dengan baik. Kemudian saya beralih kembali ke bagian framework
.. dan itu masih berfungsi, padahal sebelumnya akan memunculkan kesalahan!
Sangat aneh!
(Saya menjalankan
1.0.0-beta4-11257
)Pembaruan lebih lanjut
Saya memutar instance Ubuntu baru, dan mendapatkan kesalahan yang sama seperti Anda .. Pikir saya adalah bahwa masalah mungkin disebabkan oleh itu hanya mencoba untuk mendapatkan paket dari
nuget.org
dan tidakmyget.org
(yang memiliki hal-hal yang lebih baru) jadi saya turunNuGet.Config
ke dalam root dari proyek .... ini sepertinya telah memperbaikinya untuk saya dengan mendapatkan versi yang benar (setelah yang lain
kpm restore
).sumber
Hari ini, semua
package.json
versi saya berakhir dengan"-rc2-*"
(Hanya pengecualian yang saya lihat sejauh ini adalah
Microsoft.Framework.Configuration
paket - paketnya, yang perlu salah satu"1.0.0-rc1-*"
atau"1.0.0-*"
)Mengenai "kereta versi" yang @davidfowl sebutkan, sepertinya BANYAK rasa sakit telah menghilang antara beta8 dan rc2.
Saya paling beruntung
coreclr
dengan 2 umpan NuGet ini:Ketika saya lakukan telah hilang masalah paket, 90% dari waktu itu ini penyebab yang sama:
Sebagian besar waktu, saya bisa mengatasi ini dengan memaksa feed NuGet.org utama:
Ini config.json yang berfungsi:
sumber
Saya mengalami masalah ketergantungan yang hilang juga dengan mencoba untuk menenangkan referensi dnxcore50 dan dnx451.
Jika saya memahami hak ini, "dependensi": {} dibagi di antara kerangka kerja.
Lalu "dependensi": {} di dalam "kerangka kerja": khusus untuk kerangka itu.
dnxcore50 adalah runtime modular (mandiri) sehingga pada dasarnya berisi semua runtime inti perlu menjalankan program tidak seperti kerangka kerja .net klasik di mana Anda memiliki dependensi inti yang tersebar di tempat lain.
Jadi dengan mengatakan bahwa saya ingin tetap berpegang pada pendekatan minimal saya memutuskan untuk meng-host di mac atau linux di beberapa titik.
Perbarui Ran menjadi masalah ketergantungan yang aneh dengan tampilan cshtml, baru saja berjalan dengan dnx451 untuk saat ini.
Ini proyek saya. Json
sumber