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

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

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

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



답변

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

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이 패키지를 새 위치에 배치하기 전에 해당 폴더를 삭제해야합니다.


답변

  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>


답변

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

  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 다시 시작하거나 솔루션을 닫거나 다시로드해야합니다.


답변

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

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

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

여기를 참조 하십시오


답변

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>


답변

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

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

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


답변

이 답변 중 일부는 팁이 누락되어 나에게 도움이되지 않았습니다 (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