Có thể thay đổi vị trí của các gói cho NuGet?


283

Tôi có quy ước sau cho hầu hết các dự án của mình:

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe

Bạn sẽ nhận thấy rằng tôi không giữ các thư viện bên ngoài trong thư mục nguồn. Tôi cũng rất thích sử dụng NuGet nhưng không muốn các thư viện bên ngoài này trong thư mục nguồn. NuGet có cài đặt để thay đổi thư mục mà tất cả các gói được tải vào không?


10
Có có có! Đây chính xác là cấu trúc dự án tôi sử dụng (hoặc rất gần) và tôi luôn tự hỏi với NuGet có thể hỗ trợ nó ...
Noldorin

Tôi đã đi vào chi tiết về cách thực hiện điều này với câu trả lời sau: stackoverflow.com/a/19466173/564726 . Bạn thường cần xóa tùy chọn SolutionDir khỏi lệnh khôi phục để nó hoạt động chính xác.
BrutalDev

2
Tôi đặt .sln ở cùng cấp độ với các thư mục cấp cao nhất của bạn. :)
Ian Warburton

Câu trả lời:


242

Bây giờ có thể kiểm soát thư mục nào các gói được cài đặt vào.

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

Chỉnh sửa: Xem bình luận của Phil Haack vào ngày 10 tháng 12 năm 2010 lúc 11:45 PM (trong mục công việc / liên kết ở trên). Sự hỗ trợ được thực hiện một phần trong 1.0, nhưng không được ghi lại.

Theo @dfowler: Thêm tệp nuget.config bên cạnh giải pháp bằng cách này:

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

một gói nuget để tạo ghi đè thư mục gói.

Cập nhật cho phiên bản 2.1

Như Azat đã nhận xét, hiện đã có tài liệu chính thức về cách kiểm soát các vị trí gói. Các ghi chú phát hành cho 2.1 quy định cụ thể cấu hình sau đây trong một tập tin nuget.config (xem ghi chú phát hành cho một mô tả về nơi hợp lệ để đưa các tập tin cấu hình và cách thứ bậc công trình mô hình cấu hình):

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

Điều này sẽ thay đổi thư mục gói cho mức cấu hình mà bạn đặt tệp vào (giải pháp nếu bạn đặt nó trong thư mục giải pháp, dự án trong thư mục dự án, v.v.). Lưu ý rằng trạng thái ghi chú phát hành:

[...] Nếu bạn có một thư mục gói hiện có bên dưới thư mục gốc của giải pháp, bạn sẽ cần xóa nó trước khi NuGet sẽ đặt các gói ở vị trí mới.


5
Nó thực sự có thể sử dụng các tập tin cấu hình ở trên. Lý do nó không được nhấn mạnh là vì chúng tôi chưa thông qua quy trình làm việc cho phép điều này thông qua giao diện người dùng và các phương tiện khác vì vậy mong đợi một số điều khó hiểu.
davidfowl

5
Xem reviewboard.nupack.com/r/131 để biết mô tả đầy đủ của @dfowler về cách hoạt động của nuget.config. Ví dụ: một nuget.config hợp lệ sẽ trông như thế này: <settings> <repositoryPath> lib </ repositoryPath> </ settings>
Lee Harold

5
docs.nuget.org/docs/release-notes/nuget-2.1 Xem đoạn "Chỉ định 'gói' Vị trí thư mục"
Azat

1
Tôi có thể xác nhận cách làm mới trong 2.1+ không hoạt động. Và có lỗi về nó trên codeplex : nuget.codeplex.com/workitem/2921 .
Trường hợp

5
Phiên bản thứ hai hoạt động với tôi, tôi sử dụng NuGet mới nhất và bây giờ hai giải pháp có thể chia sẻ cùng một repo. Tôi nghĩ rằng nó có thể không hoạt động một số người bởi vì họ có thể sử dụng đường dẫn tuyệt đối? Có vẻ như vấn đề con đường tuyệt đối so với tương đối.
Csaba Toth

63
  1. Tạo một tệp có tên "nuget.config".
  2. Đã thêm tệp đó vào thư mục giải pháp của tôi

điều này KHÔNG làm việc cho tôi:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

điều này đã làm việc cho tôi:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>

Tương tự ở đây. Cấu hình> config không hoạt động, nhưng cài đặt> repositoryPath đã làm.
Gene Reddick

Chỉ có giải pháp thứ hai hoạt động: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
Nó phụ thuộc vào phiên bản NuGet mà bạn đang sử dụng.
Bronumski

1
Lưu ý rằng các đường dẫn tương đối liên quan đến giải pháp vì vậy nếu các dự án của bạn ở các cấp độ khác nhau thì nó sẽ không hoạt động.
Nine Tails

2
Điều này hoạt động tốt cho VIsual Studio 2013, nhưng nếu tôi đang sử dụng Visual Studio 2015 thì nó vẫn cài đặt các gói trong thư mục gói gần tệp sln,
fhnaseer

40

Được rồi vì lợi ích của bất cứ ai khác đọc bài đăng này - đây là những gì tôi hiểu về vô số câu trả lời ở trên:

  1. Tệp nuget.config trong thư mục .nuget có liên quan đến thư mục đó. Điều này rất quan trọng vì nếu thư mục mới của bạn là một cái gì đó như '../Packages' sẽ đặt nó ở nơi nó luôn đi ra khỏi hộp. Như @ bruce14 nói rằng bạn phải làm '../../Packages'

  2. Tôi không thể lấy nuget mới nhất (2.8.5) để tìm thư mục gói bên ngoài vị trí chuẩn mà không bật khôi phục gói. Vì vậy, một khi bạn kích hoạt khôi phục gói thì nên thêm phần sau vào tệp nuget.config bên trong thư mục .nuget để thay đổi vị trí:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (Điều này rất quan trọng) Nếu bạn thực hiện BẤT K change thay đổi nào đối với vị trí thư mục gói bên trong tệp nuget.config, bạn phải khởi động lại visual studio hoặc đóng / tải lại giải pháp để các thay đổi có hiệu lực


5
Tin tôi đi, điểm số 3 của bạn đã cứu tôi. Tôi phát điên từ 3 giờ trước cho đến khi tôi đọc được điểm số 3 của bạn. : '(Cảm ơn bạn rất nhiều bro!
hellodear 18/07/17

24

Một giải pháp cho Nuget 3.2 trên Visual Studio 2015 là:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

Sử dụng dấu gạch chéo về phía trước cho thư mục cha. Lưu tập tin trên (nuget.config) trong thư mục giải pháp.

Tham khảo có sẵn ở đây


Hoàn hảo! Làm việc cho Visual Studio 2015 và Nuget phiên bản 3.2.0.10516
Anon Dev

Bạn dường như có nghĩa là một dấu gạch chéo về phía trước .. nhưng nếu giải pháp nằm trên cửa sổ, có lẽ dấu gạch chéo phía trước biến thành một dấu gạch chéo ngược hoặc có lẽ dấu gạch chéo về phía trước là lỗi đánh máy và nên đổi thành một dấu lùi.
Gerard ONeill

Tôi đang ở 2015 và tôi cần sử dụng .. \ .. \ Gói để có một thư mục.
Rhyous

1
../libĐó là một dấu gạch chéo về phía trước, không phải là một dấu gạch chéo ngược. Ý bạn là gì
jpmc26

Vâng, nó chính xác là dấu gạch chéo về phía trước. Cập nhật câu trả lời
phuongnd

15

Giải pháp được đề xuất trong ghi chú phát hành cho 2.1 không hoạt động vượt trội. Họ quên đề cập rằng có mã:

internal string ResolveInstallPath()
{
    if (!string.IsNullOrEmpty(this.OutputDirectory))
    {
        return this.OutputDirectory;
    }
    ISettings settings = this._configSettings;

    ...
}

mà ngăn cản nó làm việc. Để khắc phục điều này, bạn cần sửa đổi tệp NuGet.target của mình và xóa tham số 'OutputDirectory':

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

Vì vậy, bây giờ, nếu bạn thêm cấu hình 'repositoryPath' ở đâu đó trong NuGet.config (xem ghi chú phát hành để biết mô tả về các vị trí hợp lệ để đặt tệp cấu hình), nó sẽ khôi phục tất cả các gói vào một vị trí, nhưng ... .csproj của bạn vẫn chứa các gợi ý cho các hội đồng được viết dưới dạng đường dẫn tương đối ...

Tôi vẫn không hiểu tại sao họ lại đi một cách khó khăn thay vì thay đổi Gói Trình quản lý để nó sẽ thêm các đường dẫn gợi ý liên quan đến GóiDir. Đó là cách tôi làm thủ công để có các vị trí gói khác nhau cục bộ (trên máy tính để bàn của tôi) và trên tác nhân xây dựng.

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>

1
Bạn hoàn toàn đúng. Tại công ty của tôi, chúng tôi thực sự sử dụng một phiên bản NuGet mà chúng tôi đã tự sửa đổi chính xác những gì bạn đang mô tả, tức là nó thêm HintPath liên quan đến Gói Dir không liên quan đến vị trí của tệp dự án. Điều này hoạt động hoàn toàn tốt. Thật không may, chúng tôi chưa bao giờ cố gắng mang những thay đổi mà chúng tôi đã thực hiện cho NuGet lên phiên bản chính thức, nhưng có lẽ đã đến lúc phải làm điều đó ngay bây giờ ...
afrischke

1
@afrischke: sẽ thật tuyệt nếu bạn có thể làm điều đó. cảm ơn. Bất cứ ý tưởng khi điều này có thể xảy ra?
sgtz

11

Ngoài câu trả lời của Shane Kms, nếu bạn đã kích hoạt Khôi phục gói Nuget, bạn chỉnh sửa NuGet.config trong thư mục .nuget như sau:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

Lưu ý thêm ".. \", vì nó quay lại từ thư mục .nuget chứ không phải thư mục giải pháp.


9

Không có câu trả lời nào phù hợp với tôi (Nuget 2.8.6) vì thiếu một số mẹo, sẽ cố gắng thêm chúng vào đây vì nó có thể hữu ích cho những người khác.

Sau khi đọc các nguồn sau:
https://docs.nuget.org/consume/NuGet-Config-Sinstall
https://github.com/NuGet/Home/issues/1346
Dường như

  1. Để làm cho Gói cài đặt hoạt động đúng cách với kho lưu trữ khác nhau, bạn cần sử dụng chuyển tiếp dấu gạch chéo , đó là vì họ đang sử dụng đối tượng Uri để phân tích vị trí.
  2. Không có $ khi bắt đầu, nó vẫn bỏ qua các thiết lập của tôi.
  3. NuGet lưu tập tin cấu hình, vì vậy sau khi sửa đổi, bạn cần tải lại giải pháp / VS.
  4. Tôi cũng gặp vấn đề lạ khi sử dụng lệnh NuGet.exe để đặt tùy chọn này, vì nó đã sửa đổi NuGet.exe toàn cầu của tôi trong AppData \ Roaming \ NuGet và bắt đầu khôi phục các gói ở đó (Vì tệp đó có mức độ ưu tiên cao hơn, chỉ cần đoán).

Ví dụ

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

Bạn cũng có thể sử dụng lệnh NuGet để đảm bảo rằng cú pháp sẽ chính xác như thế này:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config

8

Đối với các dự án .NET Core và Visual Studio 2017 tôi đã có thể khôi phục tất cả các gói về đường dẫn tương đối bằng cách cung cấp cấu hình này:

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

Dựa trên kinh nghiệm của tôi, thư mục lib đã được tạo ở cùng cấp độ nơi Nuget.config được tìm thấy, bất kể tệp sln nằm ở đâu. Tôi đã thử nghiệm và hành vi tương tự đối với khôi phục dòng lệnh dotnet và Visual Studio 2017 xây dựng lại


Tôi đã thử điều này. Tôi đặt globalPackagesFolderkhóa vào thư mục gói của dự án. Tôi đã cố gắng để thêm một gói duy nhất với dotnet add package MyPackage. nuget.exeđã tải xuống toàn bộ khung của 83 gói .NET vào thư mục đó. Đó không phải là những gì tôi dự định. Tôi chỉ muốn MyPackage duy nhất của mình trong thư mục gói được kiểm soát nguồn cục bộ.
Wallace Kelly

ĐỪNG LÀM THẾ! Điều này sẽ áp đảo ổ cứng của bạn khá nhanh vì toàn bộ các gói khung sẽ được tải xuống mỗi khi bạn tạo một ứng dụng mới.
Alaa Masoud

1
theo câu trả lời này cho một câu hỏi khác: stackoverflow.com/a/47407399/4572240 "resp repositoryPath được sử dụng cho các dự án của gói.config, globalPackagesFolder được sử dụng cho các dự án của GóiReference".
Siderite Zackwehdex

7

Tệp cấu hình trong câu trả lời được chấp nhận hoạt động với tôi trong VS2012. Tuy nhiên, đối với tôi nó chỉ hoạt động khi tôi làm như sau:

  1. Tạo một dự án mới trong VS.
  2. Thoát VS - điều này có vẻ quan trọng.
  3. Sao chép các tập tin cấu hình vào thư mục dự án.
  4. Khởi động lại VS và thêm gói.

Nếu tôi làm theo các bước đó, tôi có thể sử dụng thư mục gói dùng chung.


Khởi động lại VS là cách duy nhất tôi có được điều này để làm việc. Đoán người quản lý gói lưu trữ nó.
Filip

6

Để thay đổi đường dẫn cho các dự án bằng GóiReference thay vì gói.config bạn cần sử dụng globalPackagesFolder

Từ https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (chỉ sử dụng gói ProjectReference)

Vị trí của thư mục gói toàn cầu mặc định. Mặc định là% userprofile% .nuget \ gói (Windows) hoặc ~ / .nuget / gói (Mac / Linux). Một đường dẫn tương đối có thể được sử dụng trong các tệp nuget.config dành riêng cho dự án. Cài đặt này bị ghi đè bởi biến môi trường NUGET_PACKAGES, được ưu tiên.

repositoryPath (chỉ gói.config)

Vị trí cài đặt các gói NuGet thay vì thư mục gói ($ Solutiondir) / gói mặc định. Một đường dẫn tương đối có thể được sử dụng trong các tệp nuget.config dành riêng cho dự án. Cài đặt này bị ghi đè bởi biến môi trường NUGET_PACKAGES, được ưu tiên.

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

Tôi đặt Nuget.config bên cạnh tệp giải pháp của mình và nó đã hoạt động.


5

Thêm một miếng ngon nhỏ mà tôi vừa khám phá. (Điều này có thể cơ bản đến mức một số người chưa đề cập đến nó, nhưng nó rất quan trọng đối với giải pháp của tôi.) Thư mục "gói" kết thúc trong cùng thư mục với tệp .sln của bạn.

Chúng tôi đã di chuyển tệp .sln của mình và sau đó sửa tất cả các đường dẫn bên trong để tìm các dự án khác nhau và thì đấy! Thư mục gói của chúng tôi đã kết thúc nơi chúng tôi muốn nó.


4

CẬP NHẬT cho VS 2017:

Có vẻ như mọi người trong nhóm Nuget cuối cùng đã bắt đầu sử dụng Nuget, chính họ đã giúp họ tìm và sửa một số thứ quan trọng. Vì vậy, bây giờ (nếu tôi không nhầm, vì vẫn chưa di chuyển sang VS 2017) thì không cần thiết nữa. Bạn sẽ có thể đặt "repositoryPath" thành một thư mục cục bộ và nó sẽ hoạt động. Thậm chí bạn có thể để nó ở tất cả vì theo mặc định vị trí khôi phục được chuyển ra khỏi các thư mục giải pháp đến cấp độ máy. Một lần nữa - tôi vẫn không tự mình kiểm tra nó

VS 2015 trở về trước

Chỉ là một mẹo để trả lời khác (cụ thể là thế này ):

Vị trí của thư mục Gói NuGet có thể được thay đổi thông qua cấu hình, nhưng VisualStudio vẫn tham chiếu các cụm trong thư mục này tương đối:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Để khắc phục điều này (cho đến khi có giải pháp tốt hơn) tôi đã sử dụng lệnh subs để tạo một ổ đĩa ảo trỏ đến một vị trí mới của thư mục Gói:

subst N: C:\Development\NuGet\Packages

Bây giờ khi thêm gói NuGet mới, tham chiếu dự án sử dụng vị trí tuyệt đối của nó:

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Ghi chú:

  1. Một ổ đĩa ảo như vậy sẽ bị xóa sau khi khởi động lại, vì vậy hãy đảm bảo bạn xử lý nó
  2. Đừng quên thay thế các tài liệu tham khảo hiện có trong các tập tin dự án.

Nó vẫn còn là trường hợp ngày hôm nay? Tôi có nghĩa là chúng ta không thể sử dụng vị trí absoulute cho các gói mới được thêm vào? giải pháp ổ đĩa ảo này có vẻ cồng kềnh đối với tôi
batmaci

Đúng, vẫn là một trường hợp không có gì thay đổi
Kamarey

2
Tôi thực sự thích một đường dẫn tương đối - theo cách đó không có xung đột trong kiểm soát nguồn nếu các nhà phát triển khác nhau có các vị trí gốc khác nhau cho mã.
jbyrd

Tôi tự hỏi tại sao bạn không thể làm <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> thay vì sử dụngsubst
Vinod Srivastav

Tôi muốn tất cả các gói ở cùng một nơi, không phải cho mỗi giải pháp
Kamarey

3

Chỉ cần cập nhật với Nuget 2.8.3. Để thay đổi vị trí của các gói đã cài đặt, tôi đã bật khôi phục gói từ giải pháp nhấp chuột phải. Đã chỉnh sửa NuGet.Config và thêm các dòng sau:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

Sau đó, xây dựng lại giải pháp, nó tải tất cả các gói vào thư mục mong muốn của tôi và tự động cập nhật các tài liệu tham khảo.


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.