2017-10-16 28 views
8

Tôi có đoạn code sau đây trong một tập tin csproj:Sự khác nhau giữa <TargetFramework> và <RuntimeFrameworkVersion> là gì?

<TargetFramework>netcoreapp1.0</TargetFramework>

Trong quản lý gói NuGet, nó nói rằng tôi có phiên bản 1.0.5 Microsoft.NETCore.App

Bây giờ cho phép nói tôi có đoạn code sau trong cùng một tập tin csproj:

<TargetFramework>netcoreapp1.0</TargetFramework> <RuntimeFrameworkVersion>1.1.4</RuntimeFrameworkVersion>

Các NuGet quản lý gói bây giờ sẽ nói rằng tôi có phiên bản Microsoft.NETCore.App 1.1.4

tôi về cơ bản cố gắng sử dụng các khuôn khổ mới nhất trước khi .NETCore 2.0 (có một số vấn đề EF khi tôi chuyển đổi) sẽ là .NETCore 1.1.4 nhưng thuộc tính nhiều khung trong csproj khiến tôi không chắc chắn nên sử dụng thẻ nào. Tôi không thể tìm thấy bất kỳ tài nguyên nào phân biệt rõ ràng sự khác biệt giữa hai tài nguyên.

Trả lời

9

Các TargetFramework được sử dụng bởi NuGet để giải quyết phụ thuộc và xác định tài sản được sử dụng để biên soạn và xây dựng ứng dụng. (Phía sau hậu trường, một vài thuộc tính khác như TargetFrameworkMonikerTargetFrameworkVersion có hiệu lực nhưng SDK tóm tắt nó thành một khung đơn giản hơn TargetFramework cho khung mà nó biết).

RuntimeFrameworkVersion dành riêng cho .NET Core/netcoreapp. SDK sẽ chèn phụ thuộc vào Microsoft.NETCore.App cho phiên bản RuntimeFrameworkVersion được đặt hoặc sử dụng phiên bản mới nhất mà nó biết về .NET Core < 2.0. Phiên bản được giải quyết sau đó được ghi vào tệp runtimeconfig.json cho trình phân giải khung công cụ lưu trữ .NET Core để giải quyết phiên bản của khung công tác được chia sẻ để tải (=> thời gian chạy .NET Core 1.1.4 chẳng hạn).

Lý do bạn có thể sử dụng 1.1.* cho netcoreapp1.0 là do gói NuGet thực sự chứa các nội dung cần thiết để xây dựng các ứng dụng .NET Core 1.0. *. Tuy nhiên, công cụ không biết điều này vì vậy bạn sẽ nhận được một ứng dụng .NET Core 1.0 nhưng nó sẽ được tải bởi khung công tác 1.1 vì đó là những gì kết thúc trong tệp runtimeconfig.json.

Sự khác biệt quan trọng là:

  • Nó chỉ vấn đề cho thực thi khép kín mà phiên bản của Microsoft.NETCore.App được sử dụng.
    • Gói này sẽ đưa vào khung hoàn chỉnh với phiên bản mong muốn khi thực hiện xuất bản độc lập (ví dụ:dotnet publish -r win7-x64)
    • Khi bạn chạy một ứng dụng được xây dựng cho 1.0.3 nhưng bạn đã cài đặt thời gian chạy 1.0.5, thời gian chạy 1.0.5 sẽ tự động được sử dụng.
    • Nếu bạn không đặt RuntimeFrameworkVersion và phiên bản mới của SDK được phát hành để biết về các phiên bản vá mới hơn của .NET Core, phiên bản mới nhất sẽ tự động sử dụng. Nếu bạn đặt phiên bản rõ ràng, bạn có thể không cập nhật mà không cần chỉnh sửa tệp dự án.
  • Các RuntimeFrameworkVersion cũng là thời gian chạy tối thiểu mà các ứng dụng sẽ được tải - nếu bạn đặt nó vào 1.0.4 và cố gắng để chạy trên một máy tính mà chỉ có 1.0.3 cài đặt, ứng dụng sẽ không bắt đầu, trừ khi bạn chỉnh sửa các tập tin runtimeconfig.json.
  • RuntimeFrameworkVersion có thể được đặt thành phiên bản nổi, hữu ích khi nhắm mục tiêu các phiên bản xem trước hoặc bản dựng hàng ngày, ví dụ: 2.1.0-preview1-* sẽ giải quyết phiên bản preview1 mới nhất có sẵn trên nguồn cấp dữ liệu NuGet được định cấu hình.

Ngoài ra, chỉ có một vài lý do để xây dựng bằng cách sử dụng phiên bản cao hơn Microsoft.NETCore.App, như sửa lỗi xây dựng cho thành phần DiaSymReader.

Trong .NET Lõi 2.0, phiên bản của RuntimeFrameworkVersion sẽ luôn luôn được 2.0.0 cho "các ứng dụng di động" (không khép kín) vì việc thực hiện của khuôn khổ này không còn được cung cấp bởi sự phụ thuộc của Microsoft.NETCore.App và gói NuGet này chỉ được được sử dụng để cung cấp các bộ tham chiếu để biên dịch.

+2

Đây là một câu trả lời tuyệt vời! Làm tốt lắm thưa ngài. –

+0

Vì vậy, hậu quả thực tế của việc có cả hai thuộc tính như trong mẫu mã của tôi ở trên là gì? Thẻ 'RuntimeFrameworkVersion' rõ ràng ra lệnh với NuGet thấy, ưu tiên hơn thẻ' TargetFramework'. Tuy nhiên, nếu tôi bỏ qua thẻ 'TargetFramework', dự án không thể xây dựng với * Giá trị TargetFramework '' không được nhận dạng. Nó có thể sai chính tả. Nếu không, thì các thuộc tính TargetFrameworkIdentifier và/hoặc TargetFrameworkVersion phải được xác định rõ ràng. * – 8protons

+2

Khung mục tiêu chỉ định slice của gói được sử dụng để biên dịch. Vì vậy, nếu bạn viết 'foobar1.0', nó sẽ không hoạt động. Ngoài ra, 'RuntimeFrameworkVersion' là đặc trưng cho khung mục tiêu' netcoreapp' –

2

Từ các tài liệu, bạn nên sử dụng runtimeframeworkversion chỉ

Nếu bạn cần một phiên bản cụ thể của thời gian chạy khi nhắm mục tiêu NET Core, bạn nên sử dụng tài sản trong dự án của bạn (ví dụ, 1.0.4) thay vì tham khảo metapackage.

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj

+3

'RuntimeFrameworkVersion' chỉ nên được sử dụng khi cần có phiên bản cụ thể của gói' Microsoft.NETCore.App'. Chỉ có một số trường hợp sử dụng hạn chế mà bạn thực sự muốn thực hiện việc này. –

+2

Nếu tôi nhận xét thẻ TargetFramework của mình, tôi nhận được lỗi sau trong tệp 'Microsoft.NET.TargetFrameworkInference.targets':" Giá trị TargetFramework '' không được nhận dạng. Nó có thể sai chính tả. Nếu không, thì TargetFrameworkIdentifier và/hoặc thuộc tính TargetFrameworkVersion phải được chỉ định rõ ràng " – 8protons

Các vấn đề liên quan