İyi soru. Özel sorununuz için, çözülmüş bağımlılıklarınızda bir uyumsuzluğunuz var gibi görünüyor. Böyle bir şey olduğunda, muhtemelen uygulamanızı uyumsuz bir dnx üzerinde çalıştırdığınız için. Hala çok büyük kırılma değişiklikleri yapıyoruz, bu yüzden eğer türün eksik olduğunu görürseniz, muhtemelen betaX
paketleri çalıştırırsınız ve betaY
dnx ya da tam tersi.
Daha spesifik olarak, Montaj Nötr Arabirimleri beta4'te kaldırıldı, ancak çalıştırdığınız uygulama hala onları kullanıyor gibi görünüyor.
Hata mesajlarını daha net hale getirmek için paketlerin çalışması gereken minimum dnx'i işaretleyebilmesi için bunu yapmayı planlıyoruz. Ayrıca zaman geçtikçe, kırılma değişiklikleri ölecektir.
Genel olarak, dnx kullanırken (mevcut .NET'ten oldukça farklı olduğu için) böyle sorunları nasıl teşhis edeceğime dair bir rehber yazmanın zamanı geldiğini hissediyorum.
Koyduğunuz bağımlılıklar project.json
yalnızca üst düzeydir. Sürümler de her zaman minimumdur (tıpkı bir NuGet paketi gibi). Bu, belirttiğinizde Foo 1.0.0-beta4
gerçekten belirlediğiniz anlamına gelir Foo >= 1.0.0-beta4
. Bu MVC 0.0.1
, yapılandırılmış özet akışınız için sorarsanız ve minimum sürümler ise MVC 3.0.0
, bunu alırsınız demektir. Ayrıca ASLA bunu belirtmek sürece versiyonunu yüzer. 1.0.0 için sorarsanız ve mevcutsa, daha yeni sürümler olsa bile 1.0.0 alırsınız. Boş sürümleri belirtmek HER ZAMAN kötüdür ve sonraki sürümlerde izin verilmeyecektir.
Kayan sürümler olarak adlandırılan nuget'e tanıttığımız yeni bir özellik var. Bugün sadece yayın öncesi etiketinde çalışıyor, ancak bir sonraki sürümde sürümün daha fazla bölümünde çalışacak. Bu, paket belirtim dosyasındaki sürüm aralıklarını belirtmek için npm ve gem sözdizimine benzer.
1.0.0-*
- Bana önekle eşleşen en YÜKSEK sürümü verin ( anlamsal sürümleme kurallarına göre) ) VEYA bu önekle eşleşen bir sürüm yoksa, normal davranışı kullan ve bana EN DÜŞÜK sürümü> = belirtilen sürümü al.
En son sürümlerde geri yüklemeyi çalıştırdığınızda, adlı bir dosya yazacaktır project.lock.json
. Bu dosya, içinde tanımlanan tüm hedef çerçeveler için bağımlılıkların geçişli kapanışına sahip olacakproject.json
.
Böyle bir şey başarısız olduğunda aşağıdakileri yapabilirsiniz:
Kullanarak çözülmüş bağımlılıklara bir göz atın kpm list
. Bu, projeniz tarafından başvurulan paketlerin çözümlenmiş sürümlerini ve hangi bağımlılığın onu çektiğini gösterecektir. Örneğin, A -> B ise, şunu gösterir:
bir
-> B
B
->
Gerçek KPM listesi çıktısı:
ClassLibrary39 için listeleme bağımlılıkları (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
* doğrudan bağımlılık anlamına gelir.
Çalışan bir görsel stüdyosunuz varsa (şu anda DNX ile kırılıyor), referans düğümüne bakabilirsiniz. Görsel olarak temsil edilen aynı verilere sahiptir:
Bir bağımlılık hatasının nasıl göründüğüne bakalım:
İşte proje.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
mevcut değil. Yani kpm geri yükleme aşağıdakileri gösterir:
Geri yükleme işleminin ne zaman başarısız olabileceğini teşhis ederken, yapılan HTTP isteklerine bakın, kpm'in hangi yapılandırılmış paket kaynaklarına baktığını söylerler. Yukarıdaki resimde bir uyarı var. CACHE
istek var. Bu, kaynak türüne (nupkg veya nuspec) dayalı yerleşik önbellektir ve yapılandırılabilir bir TTL'ye sahiptir (bakın kpm restore --help
). kpm
Uzak NuGet kaynaklarını vurmaya zorlamak istiyorsanız , --no-cache
bayrağı kullanın :
Bu hatalar ayrıca paket yöneticisi günlük çıktı penceresindeki Visual Studio'da da gösterilir:
Kenar notu!
Paket Kaynakları
NuGet.config'in şu anda nasıl çalıştığını açıklayacağım (gelecekte değişecek). Varsayılan olarak, global olarak yapılandırılmış varsayılan NuGet.org kaynağına sahip bir NuGet.config dosyanız vardır.%appdata%\NuGet\NuGet.Config
. Bu global kaynakları görsel stüdyoda veya NuGet komut satırı aracıyla yönetebilirsiniz. Arızaları teşhis etmeye çalışırken her zaman etkili kaynaklarınıza (kpm çıktısında listelenenler) bakmalısınız.
NuGet.config hakkında daha fazla bilgiyi buradan edinebilirsiniz
Gerçekliğe dönüş:
Bağımlılıklar çözülmediğinde, uygulamayı çalıştırmak size bunu verecektir:
> 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)
Çalışma zamanı temel olarak, çalıştırma girişiminden önce tüm bağımlılık grafiğinin çözümlendiğini doğrulamaya çalışır. Koşmayı önerirsekpm restore
, listelenen bağımlılıkları bulamadığı için.
Bu hatayı almanızın bir başka nedeni, yanlış dnx lezzetini çalıştırmanızdır. Uygulamanız yalnızca dnx451 belirtirse ve CoreCLR dnx'i çalıştırmayı denerseniz, benzer bir sorun görebilirsiniz. Hata mesajındaki hedef çerçeveye dikkat edin:
Koşu için:
dnx4x - runs on dnx-clr-{etc}
dnxcore50 - runs on dnx-coreclr-{etc}
Çalıştırmak çalışırken aşağıdaki konularda tanımlanan hedef çerçevesine clr o zihinsel eşleme hatırlamalıyız project.json
.
Bu, Visual Studio'da başvuru düğümü altında da görünür:
Sarı olarak işaretlenen düğümler çözülmez.
Bunlar ayrıca hata listesinde de gösterilir:
bina
Bu hatalar ayrıca inşa ederken de ortaya çıkar. Komut satırından oluştururken, çıktı çok ayrıntılıdır ve sorunları teşhis ederken son derece yararlı olabilir:
> 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
Çıktı, paketlerden ve proje referanslarından derleyiciye aktarılan tüm montajları gösterir. Derleme hataları almaya başladığınızda, kullandığınız paketin o hedef platformda gerçekten çalıştığından emin olmak için buraya bakmak yararlı olacaktır.
İşte dnxcore50'de çalışmayan bir paket örneği:
{
"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 sürüm 3.0.0'ın dnxcore50 üzerinde çalışan derlemesi yoktur (sıkıştırılmamış paketin lib klasörüne bakın). Koştuğumuzda kpm build
:
"Paketi Microsoft.Owin.Host.SystemWeb kullanma" diyor ancak "Dosya:" yoktur. İnşa başarısızlığının nedeni bu olabilir.
İşte beyin dökümü bitiyor