Khôi phục gói NuGet không hoạt động


165

Tôi đã kiểm tra một dự án trên một máy tính, kiểm tra trên một máy tính khác và thấy rằng các tệp nhị phân được cài đặt bởi NuGet bị thiếu. Tôi cũng có thể kiểm tra chúng để kiểm soát nguồn, nhưng có vẻ như có một giải pháp tốt hơn:

http://docs.nuget.org/docs/workflows/USE-nuget-without-commmit-packages

Tôi đã làm theo các hướng dẫn đó, bây giờ có một .nugetthư mục nơi cần có, có các mục sau trong tệp .csproj của tôi:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

và khi tôi xây dựng lại giải pháp của mình, các gói bị thiếu không được khôi phục.

Tôi đang thiếu gì? Làm thế nào tôi có thể chẩn đoán vấn đề này?


Bạn có thấy nuget.exe được kích hoạt trong Nhật ký đầu ra không?
Pranav

Và quan trọng: bạn có thấy bất kỳ lỗi nào trong Nhật ký đầu ra không?
Maartenba

Câu trả lời:


272

Lưu ý rằng bạn có thể buộc khôi phục gói để thực thi bằng cách chạy các lệnh sau trong bảng điều khiển trình quản lý gói nuget

Cập nhật-Gói -Reinstall

Buộc cài đặt lại mọi thứ trong giải pháp.


Cập nhật-Gói -Reinstall -ProjectName myProj

Buộc cài đặt lại mọi thứ trong dự án myProj.

Lưu ý : Đây là tùy chọn hạt nhân. Khi sử dụng lệnh này, bạn có thể không nhận được các phiên bản tương tự của các gói bạn đã cài đặt và điều đó có thể dẫn đến các vấn đề. Điều này ít có khả năng xảy ra ở cấp độ dự án trái ngược với cấp độ giải pháp.

Bạn có thể dùng -safe tùy chọn tham số dòng lệnh để hạn chế nâng cấp lên các phiên bản mới hơn với cùng thành phần phiên bản Chính và nhỏ. Tùy chọn này đã được thêm vào sau đó và giải quyết một số vấn đề được đề cập trong các bình luận.

Cập nhật-Gói -Reinstall -Safe


7
@ NightOwl888 nghe có vẻ như cần phải báo cáo với nuget vì sẽ không có cách nào có thể làm được điều đó, trừ khi bạn thực sự luôn gặp vấn đề ràng buộc địa ngục DLL và may mắn là nó đã hoạt động, nhưng cài đặt lại nó đã chấm dứt vận may của bạn.
Chris Marisic

4
@nightowl nếu bạn đang sử dụng kiểm soát nguồn, sẽ không khó để sao lưu các thay đổi.
ErikE

4
Điểm thu hút chính ở đây là các phiên bản gói không được duy trì, vì vậy phiên bản gói mới nhất sẽ được cài đặt. Đây có thể là một vấn đề nếu dự án của bạn không tương thích với phiên bản mới ..
JDandChips

4
Vâng, Gói-Cập nhật -Reinstall đã làm việc cho tôi. Tôi không biết tại sao IDE không làm điều đó. Mọi thứ được đặt chính xác. Ugghh, tôi thề, NuGet vừa tốt vừa khó chịu.
Jeremy Ray Brown

2
rất vui khi bạn thêm "điều quan trọng! điều này có thể phá hủy dự án của bạn" tại BOTTOM trong câu trả lời của bạn!
devman

25

Đối với những người khác vấp vào bài đăng này, đọc nó.

NuGet 2.7+ đã giới thiệu cho chúng tôi về Khôi phục gói tự động . Đây được coi là một cách tiếp cận tốt hơn cho hầu hết các ứng dụng vì nó không can thiệp vào quá trình MSBuild. Ít đau đầu.

Một số liên kết để giúp bạn bắt đầu:


2
Cảm ơn bạn đã có câu trả lời phù hợp với phiên bản hiện tại của NuGet.
Eric J.

20

Bạn phải chọn một trong những cách sau:

Cài đặt lại gói theo tên của nó trong tất cả các dự án của giải pháp:

Update-Package –reinstall <packageName>

Cài đặt lại gói theo tên của nó và bỏ qua các phụ thuộc của nó trong tất cả các dự án của giải pháp:

Update-Package –reinstall <packageName> -ignoreDependencies

Cài đặt lại một gói theo tên của nó trong một dự án:

Update-Package –reinstall <packageName> <projectName>

Cài đặt lại tất cả các gói trong một dự án cụ thể:

Update-Package -reinstall -ProjectName <projectName>

Cài đặt lại tất cả các gói trong một giải pháp:

Update-Package -reinstall 

Giải quyết vấn đề của tôi nhanh chóng và phong cách bẩn.
blackorchid

20

Bạn đã kích hoạt chế độ khôi phục gói trong dự án có các gói / nhị phân bị thiếu chưa? Có một sự cố đã biết yêu cầu các gói phải được cài đặt chính xác khi bật chế độ khôi phục:

http://nuget.codeplex.com/workitem/1879


Liên kết ban đầu đã chết; đây có thể là sự thay thế: https://github.com/NuGet/Home/issues/1968


3
Cảm ơn các liên kết. Cho phép chế độ khôi phục gói trong một dự án có các gói / nhị phân bị thiếu sẽ là trường hợp phổ biến. Nếu bạn không có các gói, đó là khi bạn muốn lấy chúng. Trường hợp sử dụng thất bại.
Anthony

2
Khi bạn nói, "kích hoạt chế độ khôi phục gói trong dự án có các gói bị thiếu", ý bạn là gì? Có một lệnh console mà tôi cần phải chạy để làm điều đó?
CodeWar Warrior

90
NuGet thất bại tôi hàng ngày, tôi hoàn toàn coi thường nó.
Jammer

14

VS 2017

Công cụ> Trình quản lý gói NuGet> Cài đặt trình quản lý gói> Chung Nhấp vào "Xóa tất cả bộ đệm của NuGet"


Khi kiểm tra một giải pháp ngoài kiểm soát nguồn (được quản lý bằng Visual Studio Team Explorer với DevOps / Git), các bản dựng không thể thực hiện được do thiếu các tham chiếu và các gói khôi phục không làm gì cả. Giải pháp này là một trong những chính xác cho trường hợp này.
PJRobot

12

Tôi đã gặp vấn đề này trong hai kịch bản.

Đầu tiên, khi tôi cố gắng xây dựng giải pháp của mình từ dòng lệnh bằng msbuild.exe. Thứ hai, khi tôi cố gắng xây dựng sln và các dự án chứa trên máy chủ xây dựng của mình bằng TFS và CI.

Tôi nhận được lỗi tuyên bố rằng tài liệu tham khảo bị thiếu. Khi kiểm tra cả thư mục xây dựng cục bộ của tôi và máy chủ TFS, tôi thấy rằng thư mục / gói không được tạo và các gói nuget không được sao chép. Làm theo các hướng dẫn được liệt kê trong câu trả lời của Alexandre http://nuget.codeplex.com/workitem/1879 cũng không hiệu quả với tôi.

Tôi đã kích hoạt Gói khôi phục qua VS2010 và tôi đã thấy các bản dựng chỉ hoạt động từ bên trong VS2010. Một lần nữa, sử dụng msbuild không thành công. Cách giải quyết của tôi có thể hoàn toàn không hợp lệ, nhưng đối với môi trường của tôi, điều này có mọi thứ hoạt động từ một dòng lệnh được xây dựng cục bộ, cũng như từ một bản dựng CI trong TFS.

Tôi đã đi vào. \ Nuget và thay đổi dòng này trong tệp .nuget \ NuGet.target:

từ:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

to: (chú ý, không có dấu ngoặc kép quanh các biến)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

Tôi hiểu rằng nếu thư mục của tôi có không gian trong đó, điều này sẽ thất bại, nhưng tôi không có không gian trong thư mục của mình và vì vậy cách giải quyết này đã giúp bản dựng của tôi hoàn thành thành công ... trong thời điểm hiện tại.

Tôi sẽ nói rằng việc bật ghi nhật ký cấp chẩn đoán trong bản dựng của bạn sẽ giúp hiển thị những lệnh nào đang được msbuild thực thi. Đây là những gì khiến tôi tạm thời hack tệp mục tiêu.


Tôi gặp vấn đề với dấu ngoặc kép và phải thực hiện chỉnh sửa giống như bạn đã làm. Rất bực bội!
Greg

5

Nếu bất cứ điều gì khác không hoạt động, hãy thử:

  1. Đóng dự án.
  2. Xóa thư mục gói trong thư mục giải pháp của bạn.
  3. Mở Project một lần nữa và khôi phục các gói Nugget một lần nữa.

Làm việc cho tôi và thật dễ dàng để thử.


2
Điều này làm việc cho tôi. Ở bước 3, tôi không phải khôi phục thủ công các gói - chúng tự động khôi phục khi tôi mở dự án.
Tawab Wakil

5

Nếu không có câu trả lời nào khác phù hợp với bạn thì hãy thử những điều sau đây là điều duy nhất phù hợp với tôi:

Tìm .csprojtập tin của bạn và chỉnh sửa nó trong một trình soạn thảo văn bản.

Tìm <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">thẻ trong .csprojtệp của bạn và xóa toàn bộ khối.

Cài đặt lại tất cả các gói trong giải pháp:

Update-Package -reinstall

Sau đó, các gói nuget của bạn sẽ được khôi phục, tôi nghĩ rằng đây có thể là trường hợp bên lề chỉ xảy ra khi bạn di chuyển dự án của mình đến một vị trí khác.


Điều này đã cứu tôi khỏi đi các loại hạt hoàn toàn. Cảm ơn!
Jeff Hay

4

Chỉ cần những người khác có thể gặp phải vấn đề này, tôi đã có thể giải quyết vấn đề bằng cách đóng Visual Studio và mở lại dự án. Khi dự án được tải, các gói được khôi phục trong giai đoạn khởi tạo.


4

Đối với tôi, tôi đã có một thẻ trống NuGetPackageImportStamp trong .csproj

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

Nó lý tưởng nên chứa một số GUID hợp lệ.

Xóa thẻ đã nói ở trên và sau đó "Khôi phục Nugets" hoạt động với tôi.


1

Đôi khi có điều gì đó lạ xảy ra và sử dụng Visual Studio để tự động khôi phục không hoạt động. Trong trường hợp đó, bạn có thể sử dụng Bảng điều khiển quản lý gói NuGet. Điều đó được mở trong Visual Studio từ Công cụ -> Trình quản lý gói NuGet -> Bảng điều khiển quản lý gói . Các lệnh trong giao diện điều khiển rất đơn giản. Và để nhận trợ giúp ngữ cảnh trong khi gõ lệnh, chỉ cần nhấn nút và nó sẽ cung cấp cho bạn tất cả các tùy chọn bắt đầu bằng các chữ cái bạn đang gõ. Vì vậy, nếu một gói không được cài đặt, ví dụ log4net, hãy gõ lệnh sau:

Log4net cài đặt-gói

Bạn có thể làm nhiều hơn thế, như chỉ định phiên bản để cài đặt, cập nhật gói, gỡ cài đặt gói, v.v.

Tôi đã phải sử dụng bảng điều khiển để giúp tôi khi Visual Studio hoạt động như một kẻ lập dị.


1

Khôi phục gói tự động sẽ không thành công vì bất kỳ lý do nào sau đây:

  1. Bạn đã không xóa các tệp NuGet.exe và NuGet.target khỏi thư mục .nuget của giải pháp (có thể tìm thấy trong thư mục gốc của giải pháp)
  2. Bạn không bật khôi phục gói tự động từ Công cụ >> Tùy chọn >> Trình quản lý gói Nuget >> Cài đặt chung.
  3. Bạn đã quên xóa thủ công các tham chiếu trong tất cả các dự án của bạn vào tệp Nuget.target
  4. Bạn cần khởi động lại Visual Studio (đảm bảo quá trình bị hủy khỏi trình quản lý tác vụ của bạn trước khi bắt đầu lại).

Bài viết sau đây phác thảo chi tiết hơn về cách đi về điểm 1-3: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore


1
Về điểm số 1 của bạn, liên kết bạn cung cấp mâu thuẫn với lời khuyên của bạn: "Nếu bạn đang sử dụng TFS 1. Xóa các tệp NuGet.exe và NuGet.target khỏi thư mục .nuget của giải pháp 2. Giữ lại tệp NuGet.Config để tiếp tục bỏ qua thêm các gói để kiểm soát nguồn. "
Andrew Dennison

1

Tôi đã phá vỡ các gói NuGet sau khi tôi thực hiện Khôi phục hệ thống trên hệ thống của mình, sao lưu khoảng hai ngày. (Trong khi đó, các gói NuGet đã được cài đặt.) Để khắc phục, tôi phải truy cập thư mục .nuget \ gói trong hồ sơ người dùng của mình, tìm các gói và xóa chúng. Chỉ sau đó, Visual Studio mới kéo các gói xuống mới và thêm chúng đúng cách làm tài liệu tham khảo.


1

Cách giải quyết tốt nhất mà tôi thấy khi tạo Dự án mới từ đầu, sau đó nhập tất cả các tệp nguồn bằng mã. Dự án của tôi không quá phức tạp nên tôi không gặp vấn đề gì từ đó.


1

Không có giải pháp nào khác hoạt động trong tình huống của tôi:

Các phụ thuộc AspNetCore đã được cài đặt / gỡ cài đặt và đang được lưu trữ. 'AspNetCore.All' sẽ từ chối cập nhật / cài đặt lại / gỡ bỏ đúng cách. Và bất kể những gì tôi đã làm, nó sẽ sử dụng các phụ thuộc được lưu trong bộ nhớ cache (mà nó không tương thích với), vì chúng là phiên bản cao hơn.

  1. Sao lưu mọi thứ. Lưu ý danh sách Phụ thuộc bạn sẽ cần cài đặt lại, Thoát VisualStudio
  2. Mở tất cả các tệp .proj trong trình soạn thảo văn bản và xóa tất cả PackageReference
  3. Trong mỗi dự án, xóa bin,obj thư mục
  4. Xóa mọi thư mục "gói" bạn tìm thấy trong giải pháp.
  5. Giải pháp mở, đi vào Tools > Nuget Package Manager > Package Manager SettingsClear all Nuget caches . Kiểm tra bảng điều khiển vì có thể không xóa được một số mục - sao chép đường dẫn thư mục và thoát khỏi phòng thu trực quan.
  6. Xóa mọi thứ khỏi thư mục đó Mở lại giải pháp và bắt đầu cài đặt lại các gói nuget từ đầu.

Nếu điều đó vẫn không hoạt động, hãy lặp lại mà còn tìm kiếm ổ đĩa của bạn trong windows explorer nugetvà xóa bất cứ thứ gì tìm kiếm trong bộ nhớ cache.


0

vs2015 không kích hoạt vấn đề khôi phục nuget. Giải pháp của tôi:

  1. thêm thư mục .nuget, thêm tệp NuGet.Config và NuGet.target trong Thư mục .nuget

  2. mỗi tệp dự án thêm: xây dựng

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>

Đây là cách làm cũ. Xem câu trả lời @davenewza và liên kết của anh ấy với blog.davidebbo.com/2014/01/ trên
timB33

0

Nếu lỗi bạn gặp phải là "không thể kết nối với máy chủ từ xa" như lỗi của tôi, thì nó cũng có lợi cho bạn để có kiểm tra này ngoài các kiểm tra được cung cấp trong các nhận xét trên.

Tôi thấy rằng có 2 Nguồn gói NUGET mà từ đó các gói có thể được tải xuống (trong Công cụ-> Trình quản lý gói Nuget-> Cài đặt trình quản lý gói). Một trong các Nguồn của Gói không hoạt động và Nuget chỉ cố tải xuống từ nguồn đó.

Mọi thứ rơi vào vị trí khi tôi thay đổi nguồn gói để tải xuống từ: https://www.nuget.org/api/v2/ EXPLICTLY trong cài đặt


0

Trong trường hợp của tôi, một nỗ lực khôi phục Nuget bị hủy bỏ đã làm hỏng một trong các packages.configtệp trong giải pháp. Tôi đã không khám phá điều này trước khi kiểm tra cây git làm việc của tôi. Sau khi hoàn nguyên các thay đổi trong tệp, khôi phục Nuget đã hoạt động trở lại.


0

Có một lối tắt để làm cho khôi phục Nuget hoạt động, 1. Đảm bảo kết nối internet hoặc các url Nuget phù hợp trong menu tùy chọn Công cụ VS 2. Xem thư mục .nuget hoặc nuget trong giải pháp, nếu không - sao chép từ bất kỳ để có nuget.exe

  1. XÓA các gói thư mục, nếu tồn tại

  2. Mở bảng điều khiển Trình quản lý gói thực hiện lệnh này

    • dán đường dẫn đầy đủ của nuget.exe RESTORE đường dẫn đầy đủ của tệp .sln!
  3. sử dụng lệnh Install-pacakge, nếu quá trình xây dựng không được thực hiện đối với bất kỳ tham chiếu bị thiếu nào. Hy vọng nó sẽ giúp (HIH)

0

Trong VS2017, nhấp chuột phải vào giải pháp => Mở CommandLine => Dòng lệnh của nhà phát triển.

Khi mở, nhập (và nhấn enter sau)

dotnet restore

Điều đó sẽ khôi phục bất kỳ / tất cả các gói và bạn có được đầu ra giao diện điều khiển đẹp của những gì đã được thực hiện ...

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.