Khôi phục tài liệu tham khảo Nuget?


182

Tôi có giải pháp & dự án trong Visual Studio 2012.

Dự án có một tập tin packages.configtrong thư mục gốc của dự án.

Đối với mục đích của câu hỏi này, giả sử tôi vô tình xóa các thư viện này khỏi Referencesphần dự án của tôi.

Khi đi vào trình quản lý gói NuGet, giao diện vẫn báo cáo một đánh dấu bên cạnh các gói này, cho biết chúng đã được cài đặt.

Cách duy nhất tôi có thể thấy cách khắc phục tình trạng này là xóa tất cả các mục từ packages.configđó, việc này sẽ khắc phục sự cố giao diện NuGet báo cáo chúng là đã cài đặt và thêm lại từng mục.

Có cách nào thông minh hơn không? Tôi đã hy vọng cho phép 'kích hoạt nuget để khôi phục các gói bị thiếu' sẽ giải quyết điều này, nhưng dường như nó không làm gì cả.

Câu trả lời:


329

Hãy thử cài đặt lại các gói .

Trong Bảng điều khiển Trình quản lý gói NuGet, nhập lệnh sau:

Update-Package -Reinstall -ProjectName Your.Project.Name

Nếu bạn muốn cài đặt lại các gói và khôi phục các tham chiếu cho toàn bộ giải pháp, hãy bỏ qua -ProjectNametham số.


10
Bản dịch tiếng Anh của liên kết: translate.google.com/
Good

18
Lưu ý: Lệnh này sẽ cài đặt lại các tham chiếu trên tất cả các dự án hiện đang mở trong Visual Studio, thay vì chỉ dự án được chọn trong bảng điều khiển.
simbolo

3
Lệnh này sẽ cài đặt lại các gói trong toàn bộ giải pháp, không chỉ trong một dự án được chọn!
Alex Sorokoletov

14
Nguy hiểm vô cùng !!!! Nếu quá trình bị gián đoạn, bạn sẽ mất tất cả các tham chiếu gói của mình và sẽ cần thêm từng cái một vào mỗi dự án trong giải pháp của bạn.
Bill Velasquez

2
@BillVelasquez điều này chỉ ăn tất cả các tài liệu tham khảo của tôi. Vâng, cảm ơn chúa cho git, tôi đoán.
Gleno


13

Trong trường hợp điều này giúp được ai đó, đối với tôi, không có điều nào ở trên là đủ. Tôi vẫn không thể xây dựng, VS vẫn không thể tìm thấy các tài liệu tham khảo. Chìa khóa đơn giản là đóng và mở lại giải pháp sau khi khôi phục lại các gói.

Đây là kịch bản (sử dụng Visual Studio 2012):

Bạn mở một Giải pháp thiếu gói. Các tài liệu tham khảo cho thấy rằng VS không thể tìm thấy chúng. Có nhiều cách để khôi phục các gói bị thiếu, bao gồm

  • xây dựng giải pháp được thiết lập để tự động khôi phục
  • mở Bảng điều khiển quản lý gói và nhấp vào nút "Khôi phục" đẹp
  • làm gì nuget restorenếu bạn đã cài đặt dòng lệnh nuget

Nhưng cho dù cách tiếp cận là gì, những tài liệu tham khảo đó vẫn sẽ được hiển thị là thiếu. Và khi bạn xây dựng nó sẽ thất bại. Thở dài. Tuy nhiên, nếu bạn đóng giải pháp và mở lại, bây giờ VS kiểm tra lại những thứ tốt đẹp <HintPath>đó, thấy rằng các gói trở lại nơi chúng thuộc về, và tất cả đều tốt với thế giới.

Cập nhật

Có phải Visual Studio vẫn không thấy rằng bạn có gói? Vẫn hiển thị một tài liệu tham khảo mà nó không thể giải quyết? Đảm bảo rằng phiên bản của gói bạn đã khôi phục giống hệt như <HintPath>trong tệp .csproj của bạn. Ngay cả một số sửa lỗi nhỏ (ví dụ: 1.10.1 đến 1.10.2) sẽ khiến tham chiếu không thành công. Bạn có thể khắc phục điều này bằng cách chỉnh sửa trực tiếp csproj xml của mình hoặc cách khác bằng cách xóa tham chiếu và tạo một tham chiếu mới chỉ vào phiên bản mới được khôi phục trong thư mục gói.


1
Bạn đưa ra một điểm rất quan trọng về việc khôi phục chỉ đảm bảo các gói nằm trong thư mục gói (tất nhiên có thể có nhiều nơi). Tuy nhiên, việc đóng và mở lại vẫn không hiệu quả với tôi ngay cả với các phiên bản gói chính xác, cuối cùng tôi đã phải sửa đổi thủ công các đường dẫn gợi ý trong mỗi tệp csproj. Tôi tin rằng điều này là do di chuyển thư mục gói liên quan đến dự án.
Shaun

Chỉnh sửa .csprojtệp để đảm bảo số phiên bản phù hợp với tôi. Cảm ơn!
Mateen Ulhaq

11

Mặc dù giải pháp được cung cấp bởi @jmfenoll hoạt động, nhưng nó cập nhật lên các gói mới nhất. Trong trường hợp của tôi, khi đã cài đặt beta2 (phát hành trước), nó đã cập nhật tất cả các lib thành RC1 (có lỗi). Do đó, giải pháp trên chỉ làm một nửa công việc.

Nếu bạn ở trong hoàn cảnh giống như tôi và bạn muốn đồng bộ hóa dự án của mình với phiên bản chính xác của các gói NuGet bạn có / hoặc được chỉ định trong packages.config, thì tập lệnh này có thể giúp bạn. Chỉ cần sao chép và dán nó vào Bảng điều khiển quản lý gói của bạn

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

Và sau đó thực hiện nó với một tên gói riêng như

Sync-References AutoMapper

hoặc cho tất cả các gói như

Sync-References

Tín dụng đi đến Dan Haywoodbài đăng trên blog của mình .


8

Tập lệnh sau có thể được chạy trong cửa sổ Gói Manger Console và sẽ xóa tất cả các gói khỏi từng dự án trong giải pháp của bạn trước khi cài đặt lại chúng.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

Điều này sẽ chạy lại tập lệnh cài đặt của mỗi gói, nó sẽ khôi phục các tham chiếu lắp ráp bị thiếu. Thật không may, tất cả những thứ khác mà cài đặt tập lệnh có thể làm - như tạo tệp và sửa đổi cấu hình - cũng sẽ xảy ra lần nữa. Bạn có thể muốn bắt đầu với một bản sao hoạt động sạch sẽ và sử dụng công cụ SCM của bạn để chọn và chọn những thay đổi trong dự án của bạn để giữ và những gì cần bỏ qua.


3

Tôi đã thêm các DLL bằng tay. Nhấp chuột phải vào Tài liệu tham khảo trong dự án, chọn Thêm tài liệu tham khảo và sau đó trong hộp thoại nhấn nút Duyệt. Các DLL NuGet trong thư mục gói của giải pháp. Để có được tên của chúng, bạn có thể nhấp chuột phải vào các tham chiếu trong dự án khác hoạt động chính xác và chọn thuộc tính và tìm trong thuộc tính đường dẫn.


Đây là giải pháp đơn giản nhất. Nó hoạt động với tôi chỉ bằng cách duyệt thư mục gói.
Hao Nguyen

2

Trong Visual Studio 2015 (Soulestion nằm dưới sự kiểm soát nguồn, MVC-Project), csano đã Update-Package -Reinstall -ProjectName Your.Project.Namehoạt động, nhưng nó đã gây rối với một số khóa ghi.

Tôi đã phải xóa "gói" -Folder thủ công trước đó. (Nó dường như bị khóa vì kiểm soát nguồn).

Ngoài ra, tôi đã phải cài đặt lại Gói MVC từ Trình quản lý gói NuGet.


2

Kịch bản lệnh này sẽ cài đặt lại tất cả các gói của một dự án mà không làm hỏng các phụ thuộc hoặc cài đặt các phụ thuộc có thể đã bị xóa một cách có chủ đích. (Thêm cho các nhà phát triển gói phần của họ.)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies

1

Chỉ trong trường hợp nó giúp được ai đó - Trong kịch bản của tôi, tôi có một số thư viện dùng chung (có các dự án / giải pháp TFS của riêng họ) tất cả được kết hợp thành một giải pháp.

Nuget sẽ khôi phục các dự án thành công, nhưng DLL sẽ bị thiếu.

Vấn đề cơ bản là, trong khi giải pháp của bạn có thư mục gói riêng và đã khôi phục chúng chính xác vào thư mục đó, thì tệp dự án (ví dụ .csproj) đang tham chiếu một dự án khác có thể không tải gói. Mở tệp trong trình soạn thảo văn bản để xem tài liệu tham khảo của bạn đến từ đâu.

Điều này có thể xảy ra khi quản lý các gói trên các giải pháp chia sẻ được liên kết với nhau - vì bạn có thể muốn đảm bảo tất cả các DLL đều ở cùng cấp độ mà bạn có thể đặt điều này ở cấp cao nhất. Điều này có nghĩa là đôi khi nó sẽ tìm kiếm một giải pháp hoàn toàn khác cho một DLL được tham chiếu và vì vậy nếu bạn không tải xuống tất cả các dự án / giải pháp và cập nhật thì bạn có thể gặp vấn đề trên.


1

Tôi phải đồng ý với @Juri rằng câu trả lời rất phổ biến của jmfenoll vẫn chưa hoàn thành. Trong trường hợp tài liệu tham khảo bị hỏng, tôi gửi rằng hầu hết thời gian bạn không muốn cập nhật lên gói mới nhất , mà chỉ sửa các tài liệu tham khảo của bạn cho các phiên bản hiện tại mà bạn đang sử dụng. Và Juri cung cấp một chức năng tiện dụng Sync-Referencesđể làm việc đó.

Nhưng chúng ta có thể đi xa hơn một chút, cho phép linh hoạt lọc theo dự án cũng như gói:

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}

1

Tôi đã có cùng một vấn đề với các tài liệu tham khảo bị thiếu. Dưới kịch bản của tôi:

  • Máy Windows 10 mới và cài đặt VS Community 2015
  • Chỉ cần kiểm tra mã kho lưu trữ thông qua TFS
  • Một giải pháp được xây dựng tốt, một giải pháp có một dự án với các tham chiếu bị thiếu (ví dụ: EF, System.Http), nhưng các gói nuget tương đối đã được cài đặt đúng.

Tất cả các số phiên bản trong dự án và các gói khớp nhau, thực hiện khôi phục nuget (theo tất cả các cách của nó) không hoạt động.

Làm thế nào tôi sửa nó: chỉ cần xóa các thư mục gói trong root giải pháp và thực hiện khôi phục nuget. Tại thời điểm này, các dll được tải xuống chính xác và có thể được thêm vào cho các tài liệu tham khảo còn thiếu.


0

Tôi đã gặp phải vấn đề này quá nhiều, trong trường hợp của tôi Tải xuống NuGet bị thiếu đã được kiểm tra (nhưng nó không khôi phục chúng) và tôi không thể gỡ cài đặt & cài đặt lại vì tôi đã sửa đổi một số gói đã cài đặt ... vì vậy:

Tôi chỉ xóa bộ nhớ cache và xây dựng lại và nó hoạt động. (Trình quản lý gói công cụ-tùy chọn-Nuget - Chung)

đồng thời liên kết này cũng giúp https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .


0
  1. Sao chép tập tin gói.config của dự án và áp dụng tất cả sửa đổi phiên bản
  2. Hủy bỏ tất cả các gói và loại bỏ các phụ kiện

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Xóa thư mục gói trong thư mục gốc của dự án

  4. Sao chép gói sửa đổi.config vào thư mục gốc của trang web

  5. Chạy mã này để khôi phục dự án

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
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.