Câu hỏi hay. Đối với vấn đề cụ thể của bạn, có vẻ như bạn có một sự không phù hợp trong các phụ thuộc được giải quyết của bạn. Khi điều này xảy ra, có thể là do bạn đang chạy ứng dụng của mình trên một dnx không tương thích. Chúng tôi vẫn đang thực hiện các thay đổi lớn, vì vậy nếu bạn thấy thiếu phương thức, có thể bạn đã kết thúc việc chạy betaX
các gói vàbetaY
dnx hoặc ngược lại.
Cụ thể hơn, Giao diện trung lập hội đã bị xóa trong beta4 nhưng có vẻ như ứng dụng bạn đang chạy vẫn đang sử dụng chúng.
Chúng tôi có kế hoạch để làm cho nó để các gói có thể đánh dấu dnx tối thiểu mà chúng yêu cầu chạy để làm cho thông báo lỗi rõ ràng hơn. Cũng như thời gian trôi qua, những thay đổi phá vỡ sẽ chết dần.
Nói chung, tôi cảm thấy như đã đến lúc tôi viết một hướng dẫn về cách chẩn đoán các vấn đề như thế này khi sử dụng dnx (vì nó khá khác với .NET hiện tại).
Phụ thuộc bạn đưa vào project.json
chỉ là cấp cao nhất. Các phiên bản cũng luôn ở mức tối thiểu (giống như gói NuGet). Điều này có nghĩa là khi bạn chỉ định Foo 1.0.0-beta4
bạn thực sự chỉ định Foo >= 1.0.0-beta4
. Điều này có nghĩa là nếu bạn yêu cầu MVC 0.0.1
và các phiên bản tối thiểu trên nguồn cấp dữ liệu được định cấu hình của bạn là MVC 3.0.0
, bạn sẽ nhận được phiên bản đó. Chúng tôi cũng KHÔNG BAO GIỜ thả nổi phiên bản của bạn trừ khi bạn chỉ định nó. Nếu bạn yêu cầu 1.0.0 và nó tồn tại, bạn sẽ nhận được 1.0.0 ngay cả khi các phiên bản mới hơn tồn tại. Chỉ định các phiên bản trống là LUÔN LUÔN xấu và sẽ không được phép trong các bản dựng sau.
Có một tính năng mới mà chúng tôi đang giới thiệu cho nuget được gọi là phiên bản nổi. Ngày nay, nó chỉ hoạt động trên thẻ phát hành trước, nhưng trong phiên bản tiếp theo, nó sẽ hoạt động trên nhiều phần của phiên bản. Điều này tương tự như cú pháp npm và gem để chỉ định phạm vi phiên bản trong tệp đặc tả gói.
1.0.0-*
- Có nghĩa là cung cấp cho tôi phiên bản CAO NHẤT khớp với tiền tố (theo quy tắc phiên bản ngữ nghĩa ) HOẶC nếu không có phiên bản phù hợp với tiền tố đó, hãy sử dụng hành vi bình thường và đưa cho tôi phiên bản thấp nhất> = phiên bản đã chỉ định.
Khi bạn chạy khôi phục trong các bản dựng mới nhất, nó sẽ ghi ra một tệp có tên project.lock.json
. Tập tin này sẽ có sự đóng cửa quá mức của các phụ thuộc cho tất cả các khung mục tiêu được xác định trong project.json
.
Khi một cái gì đó như thế này thất bại, bạn có thể làm như sau:
Hãy xem các phụ thuộc được giải quyết bằng cách sử dụng kpm list
. Điều này sẽ cho bạn thấy các phiên bản đã giải quyết của các gói được tham chiếu bởi dự án của bạn và phụ thuộc nào đã kéo nó vào. Ví dụ: nếu A -> B, nó sẽ hiển thị:
Một
-> B
B
->
Đầu ra danh sách KPM thực tế:
Liệt kê các phụ thuộc cho ClassL Library39 (C: \ Users \ davifowl \ Documents \ Visual Studio 14 \ Project \ ClassL Library39 \ src \ ClassL Library39 \ 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
* có nghĩa là phụ thuộc trực tiếp.
Nếu bạn có một phòng thu trực quan hoạt động (phá vỡ với DNX ngay bây giờ), bạn có thể xem nút tham chiếu. Nó có cùng dữ liệu được biểu thị trực quan:
Hãy xem xét một sự thất bại phụ thuộc trông như thế nào:
Đây là 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
không tồn tại. Vì vậy, chạy khôi phục kpm hiển thị như sau:
Khi chẩn đoán khi khôi phục có thể thất bại, hãy xem các yêu cầu HTTP được thực hiện, chúng cho bạn biết nguồn gói được cấu hình mà kpm đã xem. Lưu ý trong hình trên, có một CACHE
yêu cầu. Đây là bộ nhớ đệm được xây dựng dựa trên loại tài nguyên (nupkg hoặc nuspec) và có một cấu hình TTL (nhìn vào kpm restore --help
). Nếu bạn muốn buộc kpm
phải nhấn các nguồn NuGet từ xa, hãy sử dụng --no-cache
cờ:
Những lỗi này cũng xuất hiện trong Visual Studio trong cửa sổ đầu ra nhật ký trình quản lý gói:
Lưu ý bên!
Nguồn gói
Tôi sẽ mô tả cách NuGet.config hoạt động ngay bây giờ (có thể sẽ thay đổi trong tương lai). Theo mặc định, bạn có NuGet.config với nguồn NuGet.org mặc định được định cấu hình trên toàn cầu trong%appdata%\NuGet\NuGet.Config
. Bạn có thể quản lý các nguồn toàn cầu này trong phòng thu trực quan hoặc bằng công cụ dòng lệnh NuGet. Bạn phải luôn luôn xem các nguồn hiệu quả của mình (những nguồn được liệt kê trong đầu ra kpm) khi cố gắng chẩn đoán lỗi.
Tìm hiểu thêm về NuGet.config tại đây
Trở lại thực tế:
Khi các phụ thuộc không được giải quyết, việc chạy ứng dụng sẽ cung cấp cho bạn điều này:
> 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)
Về cơ bản thời gian chạy cố gắng xác nhận rằng toàn bộ biểu đồ phụ thuộc đã được giải quyết trước khi thử chạy. Nếu nó gợi ý chạykpm restore
nó bởi vì nó không thể tìm thấy các phụ thuộc được liệt kê.
Một lý do khác khiến bạn có thể gặp lỗi này là nếu bạn đang chạy sai hương vị dnx. Nếu ứng dụng của bạn chỉ chỉ định dnx451 và bạn cố chạy CoreCLR dnx, bạn có thể thấy một vấn đề tương tự. Hãy chú ý đến khung mục tiêu trong thông báo lỗi:
Để chạy:
dnx4x - runs on dnx-clr-{etc}
dnxcore50 - runs on dnx-coreclr-{etc}
Khi bạn đang cố gắng chạy, bạn nên nhớ rằng ánh xạ tinh thần từ clr đến khung mục tiêu được xác định trong của bạn project.json
.
Điều này cũng hiển thị trong Visual Studio dưới nút tham chiếu:
Các nút được đánh dấu là màu vàng không được giải quyết.
Những điều này cũng hiển thị trong danh sách lỗi:
Xây dựng
Những lỗi này cũng hiển thị khi xây dựng. Khi xây dựng từ dòng lệnh, đầu ra rất dài dòng và có thể cực kỳ hữu ích khi chẩn đoán sự cố:
> 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
Đầu ra cho thấy tất cả các tập hợp được chuyển vào trình biên dịch từ các gói và tham chiếu dự án. Khi bạn bắt đầu gặp lỗi xây dựng, thật hữu ích khi xem ở đây để đảm bảo rằng gói bạn đang sử dụng thực sự hoạt động trên nền tảng đích đó.
Đây là một ví dụ về gói không hoạt động trên 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 phiên bản 3.0.0 không có bất kỳ hội đồng nào chạy trên dnxcore50 (hãy xem thư mục lib của gói đã giải nén). Khi chúng tôi chạy kpm build
:
Lưu ý rằng nó "sử dụng Gói Microsoft.Owin.Host.SystemWeb" nhưng không có "Tệp:". Đây có thể là lý do cho một thất bại xây dựng.
Ở đây kết thúc não của tôi