Giải pháp nhắm mục tiêu lại từ .Net 4.0 đến 4.5 - làm cách nào để nhắm mục tiêu lại các gói NuGet?


205

Tôi đã di chuyển một giải pháp hiện đang nhắm mục tiêu .NET 4.0 trong VS2010 sang VS2012 và bây giờ tôi muốn nhắm mục tiêu lại thành .Net 4.5

Điều tôi không chắc chắn là các gói NuGet. Ví dụ, EF5, mà tôi đã cập nhật từ EF4 trong VS2010 hóa ra thực sự là EF 4.4 như bạn có thể thấy ở đây:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

Tôi cũng có thể thấy các mục sau trong gói.config cho dự án:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Vì vậy, câu hỏi của tôi là:

Cách tốt nhất để nhắm mục tiêu lại tất cả các gói NuGet hiện đang được đặt thành nhắm mục tiêu .NET 4.0 sang nhắm mục tiêu .NET 4.5 là gì?


Câu trả lời:


266

NuGet 2.1 cung cấp một tính năng giúp việc này trở nên đơn giản hơn rất nhiều: chỉ cần thực hiện update-package -reinstall -ignoreDependenciestừ Bảng điều khiển quản lý gói.

NuGet 2.0 không xử lý việc nhắm mục tiêu lại ứng dụng của bạn rất tốt. Để thay đổi khung mục tiêu của các gói của bạn, bạn phải gỡ cài đặt và cài đặt lại các gói (lưu ý các gói bạn đã cài đặt để bạn có thể cài đặt lại từng gói).

Các lý do gói phải được gỡ cài đặt và cài đặt lại là:

  • Khi cài đặt gói, chúng tôi xác định khung mục tiêu của dự án của bạn
  • Sau đó, chúng tôi kết hợp nó với nội dung gói, tìm thư mục \ lib \ thích hợp (và thư mục \ content \)
  • Tham chiếu hội được thêm bằng Đường dẫn Gợi ý trỏ đến thư mục \ lib \ của gói, với thư mục con bên phải (ví dụ: \ lib \ net40)
  • Các tệp nội dung được sao chép từ thư mục gói \ content \, với thư mục con bên phải (ví dụ \ content \ net40)
  • Chúng tôi ghi lại targetFramework được sử dụng để cài đặt gói trong tệp tests.config
  • Sau khi bạn thay đổi khung mục tiêu của dự án, Đường dẫn Gợi ý vẫn trỏ đến net40
  • Khi bạn gỡ cài đặt các gói, chúng tôi sẽ kiểm tra TargetFramework đã được ghi trong gói.config để xem libs / nội dung của khung mục tiêu cần xóa khỏi dự án của bạn
  • Khi bạn cài đặt lại gói, chúng tôi sẽ phát hiện khung mục tiêu được cập nhật của bạn và tham chiếu / sao chép đúng libs / nội dung

Sử dụng VS 2012 với dự án ASP.NET MVC 4 và sau khi nhắm mục tiêu lại .NET Framework từ 4.0 đến 4.5, tôi đã thực hiện update-package -reinstalltrong Gói quản lý gói. Tất cả các gói bắt đầu được gỡ cài đặt và cập nhật và tất cả Windows 8 đột ngột khởi động lại và khi nó quay lại, nó báo "PC của bạn gặp sự cố và khởi động lại. Bạn có muốn gửi thông tin cho Microsoft không?" :( Scaring ... Nhân tiện, đây là phiên bản NuGet tôi đã cài đặt ngay bây giờ: Đã 2.2.40116.9051mở một vấn đề ở đây: nuget.codeplex.com/workitem/3049
Maccaferri

12
các tùy chọn -reinstall chưa bao giờ làm việc cho tôi. Nó sẽ xóa theo thứ tự sai và lỗi về "không thể xóa X vì Y phụ thuộc vào nó" hoặc đôi khi chỉ không thực hiện lại các gói. Lần trước tôi đã thử nó, nó đã xóa EntityFramework và sau đó không bao giờ thêm lại.
Mã hóaWithSpike

4
update-pack -reinstall không phải là giải pháp cho tôi. Nó cũng cập nhật rất nhiều gói, thay vì để chúng trên các phiên bản chúng tôi sử dụng và đã thử nghiệm. Chẳng hạn, Ninject đã được chuyển lên v3 và đó là một phiên bản thay đổi đột phá.
Steve Owen

13
Thậm chí không thử cài đặt trang cập nhật. Điều này thật rắc rối khi nó chạy trên máy cục bộ của tôi đến nỗi tôi phải ngăn người quản lý Gói NuGet đi xa hơn. Nó đã loại bỏ phiên bản jQuery 1.10 của tôi và thay thế bằng 1.4.4 vì một số lý do. Chỉ cần làm thủ công và tiết kiệm cho mình những rắc rối.
JustinMichaels

2
Đồng ý với điều lộn xộn, và đó thậm chí là hai năm kể từ bài đăng này. Nó tìm thấy các phiên bản thấp hơn của các loại nugets nhất định, và làm hỏng rất nhiều tài liệu tham khảo. Và đó là sau gần hai giờ cập nhật (trên máy trạm cao cấp từ đầu năm 2014). 20 dự án trong giải pháp.
Arve Systad

42

Đối với những người gặp vấn đề với update-package -reinstall <packagename>lệnh, hãy cân nhắc chạy nó bằng -ignoreDependenciescờ, như thế này:

update-package -reinstall <packagename> -ignoreDependencies

Cờ này sẽ để lại các phụ thuộc gói của bạn, nếu không chúng có thể được cập nhật ngay cả khi gói ban đầu bạn muốn cài đặt lại vẫn giữ nguyên phiên bản của nó.

Thêm thông tin ở đây .


Cảm ơn, điều đó thực sự tiết kiệm rất nhiều rắc rối. Xem Nuget đang cố gắng cài đặt lại 10 phụ thuộc mà EnterpriseL Library có xu hướng tạo ra, trên 30 dự án, đang hướng tới một công việc dài ngày. Điều này mang nó xuống đến phút.
David Keaveny

Như những người khác đã đề cập, rất có thể phá vỡ mọi thứ.
Gleno

9
Bạn có thể tự động hóa giải pháp này cho toàn bộ giải pháp bằng cách thay đổi nó một chút khi chạy trong Bảng điều khiển quản lý gói:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson Theo kinh nghiệm của tôi, lệnh có hoạt động rộng không?

1
@ BjornAliGöransson - Xin lỗi nếu tôi không đủ rõ ràng. Câu trả lời cung cấp một cách để cập nhật một gói duy nhất trên toàn bộ giải pháp. Kịch bản của tôi sẽ đi qua mọi gói NuGet trong giải pháp và nhắm mục tiêu lại nó qua giải pháp. Câu trả lời là hoàn hảo cho một dự án duy nhất nhưng kịch bản tôi cung cấp có thể tốt hơn nếu bạn có nhiều gói cần phải nhắm mục tiêu lại.
Kaleb Pederson

22

Sau khi thử câu trả lời được chấp nhận không thành công, tôi muốn đề xuất một lệnh ít rủi ro hơn:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Để biết thêm thông tin: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
Theo tài liệu được liên kết -reinstallsẽ chỉ cài đặt cùng một phiên bản, vì vậy không thấy bất kỳ lợi ích nào khi sử dụng -safe. Tui bỏ lỡ điều gì vậy?
Kaleb Pederson

4

Trong khi cố gắng cài đặt lại giải pháp gói rộng, tôi đã gặp phải một lỗi phụ thuộc (mặc dù sử dụng -ignoreDependenciescờ) và tất cả các tệp của gói.config cho mọi dự án đã bị xóa. Trong VS2013, có vẻ như các gói.config không được chuyển trở lại vào đĩa và được thêm lại cho đến khi tất cả các phụ thuộc / tham chiếu được nâng cấp được gắn lại vào dự án.

Trong trường hợp của tôi, điều làm việc là nâng cấp từng dự án một lần bằng cách thêm -ProjectName tên dự án vào update-packagelệnh. Trong trường hợp này, gói.config được cập nhật khi mỗi dự án được nâng cấp.

Có thể không thực tế đối với các giải pháp rất lớn nhưng có vẻ như một sự thỏa hiệp hợp lý để vẫn tận dụng nâng cấp tự động cho càng nhiều dự án càng tốt và cô lập các giải pháp có vấn đề mà không có mọi gói .config trong giải pháp của bạn bị xóa.


3
Tôi gặp vấn đề tương tự. UpdatePackage -Reinstallđã xóa gói.config và tham chiếu dự án cho một vài dự án (cụ thể là các dự án đã tạo ra các cụm lắp ráp được tạo trong chúng). Chúng tôi đã khắc phục điều này bằng cách hoàn tác tất cả các thay đổi đối với dự án bị vặn và chạy:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Với Visual Studio cho Mac 2019, nhấp chuột phải vào thư mục Gói hiển thị tùy chọn 'Retarget' trong menu. Điều này đã giải quyết vấn đề nhắm mục tiêu lại cho tất cả các gói trong dự án yêu cầu nhắm mục tiêu lại. Có vẻ như không có Trình quản lý gói NuGet trong menu Công cụ trong Visual Studio cho Mac (ít nhất là của tôi), vì vậy tôi không thể khởi chạy Gói quản lý gói.

Tùy chọn menu Retarget trong Gói nhấp chuột phải

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.