NuGet 패키지 위치를 변경할 수 있습니까?


283

대부분의 프로젝트에 대해 다음과 같은 규칙이 있습니다.

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

외부 라이브러리 소스 폴더 안에 보관 하지 않는다는 것을 알 수 있습니다. 또한 NuGet 사용에 관심이 있지만 소스 폴더 안에 이러한 외부 라이브러리를 원하지 않습니다. NuGet에는 모든 패키지가로드되는 디렉토리를 변경하는 설정이 있습니까?


10
예, 그렇습니다! 이것은 내가 사용하는 (또는 매우 가까운) 프로젝트 구조이며, NuGet이이를 지원할 수 있는지 항상 궁금했습니다.
Noldorin

다음 답변 으로이 작업을 수행하는 방법에 대해 자세히 설명했습니다. stackoverflow.com/a/19466173/564726 . solutionDir 옵션을 restore 명령에서 제거해야 제대로 작동합니다.
BrutalDev

2
.sln을 최상위 폴더와 같은 수준에 배치했습니다. :)
Ian Warburton

답변:


242

이제 패키지가 설치된 폴더를 제어 할 수 있습니다.

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

편집 : Phil Haack의 2010 년 12 월 10 일 11:45 PM (작업 항목 / 위 링크)에 대한 의견을 참조하십시오. 지원은 1.0에서 부분적으로 구현되지만 문서화되어 있지 않습니다.

@dfowler에 따르면 다음과 같이 솔루션 옆에 nuget.config 파일을 추가하십시오.

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

nuget 패키지 패키지 폴더 재정의를 만들기위한이.

버전 2.1 업데이트

Azat가 언급했듯이 이제 패키지 위치를 제어하는 ​​방법에 대한 공식 문서가 있습니다. 2.1릴리스 정보 는 nuget.config 파일에 다음 구성을 지정합니다 (구성 파일을 배치 할 유효한 위치 및 계층 적 구성 모델의 작동 방식에 대한 설명은 릴리스 정보를 참조하십시오).

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

그러면 파일을 넣은 구성 수준의 패키지 폴더가 변경됩니다 (솔루션 디렉토리에 프로젝트를 배치하면 프로젝트 디렉토리에 프로젝트 등). 릴리스 노트 상태는 다음과 같습니다.

[...] 솔루션 루트 아래에 기존 패키지 폴더가있는 경우 NuGet이 패키지를 새 위치에 배치하기 전에 해당 폴더를 삭제해야합니다.


5
실제로 위의 구성 파일을 사용하는 것이 가능합니다. 강조되지 않은 이유는 UI와 다른 방법을 통해이를 활성화하는 워크 플로를 거치지 않았기 때문에 약간의 기발함을 기대하기 때문입니다.
davidfowl

5
nuget.config 작동 방식에 대한 @dfowler의 전체 설명 은 reviewboard.nupack.com/r/131 을 참조하십시오 . 예를 들어, 유효한 nuget.config는 다음과 같습니다 : <settings> <repositoryPath> lib </ repositoryPath> </ settings>
Lee Harold

5
docs.nuget.org/docs/release-notes/nuget-2.1 " '패키지'폴더 위치 지정"단락 참조
Azat

1
2.1+에서 작동하는 새로운 방식이 작동하지 않음을 확인할 수 있습니다. 그리고 코드 플렉스에는 nuget.codeplex.com/workitem/2921관련된 버그가 있습니다 .
Case

5
두 번째 버전은 저에게 효과적이며 최신 NuGet을 사용하므로 두 솔루션이 동일한 저장소를 공유 할 수 있습니다. 나는 사람들이 절대 경로를 사용할 수 있기 때문에 작동하지 않을 수 있다고 생각합니까? 절대 경로와 상대 경로가 중요한 것 같습니다.
Csaba Toth

63
  1. "nuget.config"라는 파일을 생성했습니다.
  2. 해당 파일을 솔루션 폴더에 추가했습니다

이것은 나를 위해 작동하지 않았다 :

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

이것은 나를 위해 일했다 :

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

여기도 마찬가지입니다. 구성> 구성이 작동하지 않았지만 설정> repositoryPath가 작동했습니다.
Gene Reddick

두 번째 해결책 만 작동합니다. docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
사용중인 NuGet 버전에 따라 다릅니다.
Bronumski

1
상대 경로는 솔루션과 관련이 있으므로 프로젝트의 레벨이 다르면 작동하지 않습니다.
Nine Tails

2
이것은 VIsual Studio 2013에서 잘 작동하지만 Visual Studio 2015를 사용하는 경우 sln 파일 근처의 패키지 폴더에 패키지를 설치합니다.
fhnaseer

40

이 게시물을 읽는 다른 사람을 위해 좋습니다. 여기서 위의 수많은 답변에 대해 이해합니다.

  1. .nuget 폴더의 nuget.config 파일은 해당 폴더를 기준 으로합니다. 새 폴더가 '../Packages'와 같은 경우 항상 상자 밖으로 나갈 수 있으므로 중요합니다. @ bruce14가 말했듯이 대신 '../../Packages'를 수행해야합니다.

  2. 패키지 복원을 활성화하지 않고 표준 위치 외부에서 패키지 폴더를 찾을 수있는 최신 nuget (2.8.5)을 얻을 수 없습니다. 따라서 패키지 복원을 활성화하면 .nuget 폴더 안에있는 nuget.config 파일에 다음을 추가하여 위치를 변경해야합니다.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (중요) nuget.config 파일 내에서 패키지 폴더 위치를 변경하는 경우 변경 사항을 적용하려면 Visual Studio 다시 시작하거나 솔루션을 닫거나 다시로드해야합니다.


5
당신의 # 3 포인트가 하루를 저축했습니다. 지난 3 시간 동안 # 3 포인트를 읽을 때까지 미쳤다. : '(형제 님 감사합니다!
hellodear

24

Visual Studio 2015의 Nuget 3.2 솔루션은 다음과 같습니다.

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

부모 폴더에 슬래시 사용 위의 파일 (nuget.config)을 솔루션 폴더에 저장하십시오.

여기를 참조 하십시오


완전한! Visual Studio 2015 및 Nuget 버전 3.2.0.10516에 대한 작업
Anon Dev

슬래시를 의미 한 것 같습니다. 그러나 솔루션이 Windows에있는 경우 해당 슬래시가 뒤로 오거나 어쩌면 앞으로 슬래시가 오타 일 수 있으며 뒤로 오도록 변경해야합니다.
Gerard ONeill

2015 년에 .. \ .. \ Packages를 사용하여 한 폴더 위로 이동해야합니다.
Rhyous

1
../lib이는 백 슬래시가 아니라 슬래시입니다. 무슨 뜻인가요?
jpmc26

예, 정확히 슬래시입니다. 업데이트 된 답변
phuongnd

15

2.1 릴리스 노트에서 제안 된 솔루션은 기본적으로 작동하지 않습니다. 그들은 코드가 있다는 것을 언급하지 않았습니다.

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

    ...
}

작동하지 않습니다. 이 문제를 해결하려면 NuGet.targets 파일을 수정하고 'OutputDirectory'매개 변수를 제거해야합니다.

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

이제 NuGet.config의 어딘가에 'repositoryPath'설정을 추가하면 (설정 파일을 넣을 수있는 유효한 장소에 대한 설명은 릴리스 노트 참조) 모든 패키지를 단일 위치로 복원하지만 .... csproj는 여전히 상대 경로로 작성된 어셈블리에 대한 힌트를 포함합니다 ...

나는 여전히 PackageManager를 변경하는 대신 왜 어려운 일을했는지 ​​이해하지 못하므로 PackagesDir에 상대적인 힌트 경로를 추가합니다. 그것이 로컬 (내 데스크탑)과 빌드 에이전트에서 다른 패키지 위치를 갖기 위해 수동으로 수행하는 방법 입니다.

<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
너가 확실히 맞아. 우리 회사에서는 실제로 NuGet 버전을 사용하여 설명하고있는 것과 정확히 일치하도록 수정했습니다. 즉, 프로젝트 파일의 위치가 아닌 Packages Dir에 상대적인 HintPath를 추가합니다. 이것은 완벽하게 작동합니다. 불행히도 우리는 NuGet의 공식 버전 변경 사항을 적용하려고 시도한 적이 없었지만 지금은 그렇게해야 할 때입니다.
afrischke

1
@ afrischke : 그렇게 할 수 있다면 좋을 것입니다. 감사. 언제 이런 일이 일어날 지 아십니까?
sgtz

11

Shane Kms 답변 외에도 Nuget 패키지 복원을 활성화 한 경우 다음과 같이 .nuget 폴더에있는 NuGet.config를 편집하십시오.

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

추가 ".. \"는 솔루션 폴더가 아니라 .nuget 폴더에서 역 추적하므로주의하십시오.


9

이 답변 중 일부는 팁이 누락되어 나에게 도움이되지 않았습니다 (Nuget 2.8.6). 다른 사람들에게 유용 할 수 있으므로 여기에 추가하려고 시도합니다.

다음 소스를 읽은 후 :
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
이 나타납니다

  1. 다른 repositoryPath로 Install-Package를 올바르게 작동 시키려면 슬래시 를 사용해야 합니다 . Uri 개체를 사용하여 위치를 구문 분석하기 때문입니다.
  2. 처음에 $ 가 없으면 여전히 내 설정을 무시하고있었습니다.
  3. NuGet은 구성 파일을 캐시하므로 수정 후 솔루션 / VS를 다시로드해야합니다.
  4. AppData \ Roaming \ NuGet에서 내 글로벌 NuGet.exe를 수정하고 패키지를 복원하기 시작했기 때문에 NuGet.exe 명령을 사용 하여이 옵션을 설정하는 동안 이상한 문제가 발생했습니다 (파일의 우선 순위가 높기 때문에 추측).

예 :

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

NuGet 명령을 사용하여 다음과 같이 구문이 올바른지 확인할 수 있습니다.

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

8

.NET Core 프로젝트 및 Visual Studio 2017의 경우 다음 구성을 제공하여 모든 패키지를 상대 경로로 복원 할 수있었습니다.

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

내 경험에 따르면 lib 폴더는 sln 파일의 위치에 관계없이 Nuget.config가있는 것과 동일한 수준에서 만들어졌습니다. 테스트했으며 동작은 명령 줄 닷넷 복원과 동일하며 Visual Studio 2017 재 구축


나는 이것을 시도했다. 내가 설정 한 globalPackagesFolder내 프로젝트의 패키지 폴더에 키를 누릅니다. 로 단일 패키지를 추가하려고했습니다 dotnet add package MyPackage. nuget.exe83 .NET 패키지의 전체 프레임 워크를 해당 폴더로 다운로드했습니다. 그건 내가 의도 한 것이 아닙니다. 로컬 소스 제어 패키지 폴더에 단일 MyPackage가 필요했습니다.
월리스 켈리

그거 하지마! 새 앱을 만들 때마다 전체 프레임 워크 패키지가 다운로드되므로 HDD 속도가 매우 빠릅니다.
Alaa Masoud 2019

1
이 질문에 대한 또 다른 질문 : stackoverflow.com/a/47407399/4572240 "respositoryPath는 packages.config 프로젝트에 사용되고 globalPackagesFolder는 PackageReference 프로젝트에 사용됩니다".
Siderite Zackwehdex

7

허용 된 답변의 구성 파일은 VS2012에서 작동합니다. 그러나 나를 위해 다음을 수행 할 때만 작동합니다.

  1. VS에서 새 프로젝트를 만듭니다.
  2. Exit VS-이것은 중요한 것 같습니다.
  3. 구성 파일을 프로젝트 폴더로 복사하십시오.
  4. VS를 다시 시작하고 패키지를 추가하십시오.

이 단계를 따르면 공유 패키지 폴더를 사용할 수 있습니다.


VS를 다시 시작하는 것이 이것이 작동하는 유일한 방법입니다. 패키지 관리자가 캐시하는 것 같아요.
Filip

6

packages.config 대신 PackageReference를 사용하여 프로젝트의 경로를 변경하려면 globalPackagesFolder

에서 https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (PackageReference를 사용하는 프로젝트 만 해당)

기본 전역 패키지 폴더의 위치 기본값은 % userprofile % .nuget \ packages (Windows) 또는 ~ / .nuget / packages (Mac / Linux)입니다. 프로젝트 별 nuget.config 파일에서 상대 경로를 사용할 수 있습니다. 이 설정은 NUGET_PACKAGES 환경 변수에 의해 우선하며이 변수가 우선합니다.

repositoryPath (packages.config 만)

기본 $ (Solutiondir) / packages 폴더 대신 NuGet 패키지를 설치할 위치입니다. 프로젝트 별 nuget.config 파일에서 상대 경로를 사용할 수 있습니다. 이 설정은 NUGET_PACKAGES 환경 변수에 의해 우선하며이 변수가 우선합니다.

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

솔루션 파일 옆에 Nuget.config를 넣고 작동했습니다.


5

내가 방금 발견 한 또 하나의 작은 음식. (이것은 너무 기본적이어서 일부는 언급하지 않았지만 내 솔루션에는 중요했습니다.) "packages"폴더는 .sln 파일과 같은 폴더에있게됩니다.

.sln 파일을 옮긴 다음 내부의 모든 경로를 수정하여 다양한 프로젝트와 짜잔을 찾습니다! 패키지 폴더는 원하는 위치에있게되었습니다.


4

VS 2017 업데이트 :

Nuget 팀의 사람들이 마침내 Nuget을 사용하기 시작하여 몇 가지 중요한 것을 찾고 수정하는 데 도움이되었습니다. 따라서 지금 (실제로 VS 2017로 마이그레이션하지 않았으므로 실수하지 않은 경우) 아래는 더 이상 필요하지 않습니다. "repositoryPath"를 로컬 폴더로 설정하면 작동합니다. 기본적으로 솔루션 폴더에서 시스템 레벨로 이동 한 기본 복원 위치로 그대로 둘 수도 있습니다. 다시-나는 여전히 혼자서 테스트하지 않았다.

VS 2015 이하

다른 답변에 대한 팁 (특히 this ) :

NuGet Package 폴더의 위치는 구성을 통해 변경할 수 있지만 VisualStudio는 여전히이 폴더의 어셈블리를 상대적으로 참조합니다.

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

이 문제를 해결하기 위해 (더 나은 솔루션이 될 때까지) subst 명령을 사용하여 패키지 폴더의 새 위치를 가리키는 가상 드라이브를 만들었습니다.

subst N: C:\Development\NuGet\Packages

이제 새로운 NuGet 패키지를 추가 할 때 프로젝트 참조는 절대 위치를 사용합니다.

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

노트 :

  1. 이러한 가상 드라이브는 다시 시작한 후에 삭제되므로 처리해야합니다.
  2. 프로젝트 파일에서 기존 참조를 바꾸는 것을 잊지 마십시오.

오늘날에도 여전히 그렇습니까? 새로 추가 한 패키지에 대해 절대 위치를 사용할 수 없습니까? 이 가상 드라이브 솔루션은 귀찮습니다
batmaci

그래도 아무 변화도
없었던

2
실제로 상대 경로를 선호합니다. 다른 개발자가 코드의 루트 위치가 다른 경우 소스 제어에서 충돌이 발생하지 않습니다.
jbyrd

당신이 할 수없는 이유를 궁금해 <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> 사용하는 대신subst
비 노드 Srivastav

모든 패키지를 솔루션이 아닌 단일 장소에두기를 원했습니다
Kamarey

3

Nuget 2.8.3으로 업데이트 중입니다. 설치된 패키지의 위치를 ​​변경하기 위해 오른쪽 클릭 솔루션에서 패키지 복원을 활성화했습니다. NuGet.Config를 편집하고 다음 줄을 추가했습니다.

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

그런 다음 솔루션을 다시 빌드하고 모든 패키지를 원하는 폴더로 다운로드하고 참조를 자동으로 업데이트했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.