둘 이상의 솔루션에서 참조 된 프로젝트가있는 외부 및 내부 패키지 소스와 비슷한 상황이 있습니다. 오늘 코드 기반 중 하나를 사용 하여이 작업을 수행했으며 개발자 워크 스테이션 및 빌드 서버와 함께 작동하는 것 같습니다. 아래 프로세스는이 시나리오를 염두에두고 있습니다 (공통 패키지 폴더를 다른 곳에 배치하는 것은 어렵지 않습니다).
- 코드베이스
- 프로젝트 A
- 프로젝트 B
- 프로젝트 C
- 솔루션
- 해결책 1
- 해결책 2
- 해결책 3
- 패키지 (모든 솔루션이 공유하는 공통 패키지)
Visual Studio 2015 업데이트 3을 통해 NuGet 3.5.0.1484부터 답변 업데이트
이 프로세스는 처음에이 문제를 해결하고 업데이트 할 때라고 생각했을 때보 다 조금 쉬워졌습니다. 일반적으로 프로세스는 적은 단계로 동일합니다. 결과는 다음을 해결하거나 제공하는 프로세스입니다.
- 소스 코드 제어에 커밋해야하는 모든 것이 솔루션에서 표시되고 추적됩니다.
- Visual Studio에서 패키지 관리자를 사용하여 새 패키지를 설치하거나 패키지를 업데이트하면 올바른 저장소 경로가 사용됩니다
- 초기 구성 후 .csproj 파일을 해킹하지 않습니다
- 개발자 워크 스테이션을 수정하지 않음 (체크 아웃시 코드 작성 준비)
알아야 할 몇 가지 잠재적 단점이 있습니다 (YMMV는 아직 경험하지 못했습니다). 아래에서 Benol의 답변과 의견을 참조하십시오.
NuGet.Config 추가
\ Solutions \ 폴더의 루트에 NuGet.Config 파일을 작성하려고합니다. 이 파일이 작성하는 UTF-8 인코딩 파일인지 확인하십시오.이를 수행하는 방법을 모르면 Visual Studio의 파일-> 새로 만들기-> 파일 메뉴를 사용하여 XML 파일 템플리트를 선택하십시오. NuGet.Config에 다음을 추가하십시오.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="$\..\Packages" />
</config>
</configuration>
repositoryPath 설정의 경우 $ 토큰을 사용하여 절대 경로 또는 상대 경로 (권장)를 지정할 수 있습니다. $ 토큰은 NuGet.Config가있는 위치를 기준으로합니다 ($ 토큰은 실제로 NuGet.Config 위치 보다 한 레벨 아래 에 있습니다). 따라서 \ Solutions \ NuGet.Config가 있고 \ Solutions \ Packages를 원하면 $ \ .. \ Packages를 값으로 지정해야합니다.
다음으로 "NuGet"(솔루션을 마우스 오른쪽 단추로 클릭하고 추가-> 새 솔루션 폴더)과 같은 솔루션 폴더에 솔루션 폴더를 추가하려고합니다. 솔루션 폴더는 Visual Studio 솔루션에만 존재하는 가상 폴더이며 드라이브에 실제 폴더를 만들지 않으며 어디서나 파일을 참조 할 수 있습니다. "NuGet"솔루션 폴더를 마우스 오른쪽 단추로 클릭 한 다음 추가-> 기존 항목을 선택하고 \ Solutions \ NuGet.Config를 선택하십시오.
우리가이 작업을 수행하는 이유는 솔루션에서 볼 수 있고 소스 코드 제어에 올바르게 적용되도록하는 데 도움이되기 때문입니다. 공유 프로젝트에 참여하는 코드베이스의 각 솔루션에 대해이 단계를 수행 할 수 있습니다.
NuGet.Config 파일을 .sln 파일 위의 \ Solutions \에 배치하면 NuGet이 "현재 작업 디렉토리"에서 폴더 구조를 재귀 적으로 탐색하여 사용할 NuGet.Config 파일을 찾습니다. "현재 작업 디렉토리"는 여기서 몇 가지 다른 것을 의미합니다. 하나는 NuGet.exe의 실행 경로이고 다른 하나는 .sln 파일의 위치입니다.
패키지 폴더 전환
먼저 각 솔루션 폴더를 살펴보고 존재하는 \ Packages \ 폴더를 삭제하는 것이 좋습니다 (먼저 Visual Studio를 닫아야합니다). 이렇게하면 NuGet이 새로 구성된 \ Packages \ 폴더를 어디에 두는지 쉽게 알 수 있으며 잘못된 \ Packages \ 폴더에 대한 링크가 실패한 후 수정할 수 있습니다.
Visual Studio에서 솔루션을 열고 모두 다시 빌드를 시작하십시오. 나타날 모든 빌드 오류를 무시하십시오.이 시점에서 예상됩니다. 그러나 빌드 프로세스 시작시 NuGet 패키지 복원 기능이 시작됩니다. \ Solutions \ Packages \ 폴더가 원하는 위치에 생성되었는지 확인하십시오. 그렇지 않은 경우 구성을 검토하십시오.
이제 솔루션의 각 프로젝트에 대해 다음을 수행하려고합니다.
- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 언로드를 선택하십시오.
- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Edit your-xxx.csproj를 선택하십시오.
- \ packages \에 대한 참조를 찾아 새 위치로 업데이트하십시오.
- 이들 중 대부분은 <HintPath> 참조이지만 전부는 아닙니다. 예를 들어 WebGrease와 Microsoft.Bcl.Build에는 업데이트해야 할 별도의 경로 설정이 있습니다.
- .csproj를 저장 한 다음 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 다시로드를 선택하십시오.
모든 .csproj 파일이 업데이트되면 다른 모두 다시 빌드를 시작하면 누락 된 참조에 대한 빌드 오류가 더 이상 발생하지 않습니다. 이제 작업이 완료되었으며 이제 공유 패키지 폴더를 사용하도록 NuGet을 구성했습니다.
VStudio 2012의 NuGet 2.7.1 (2.7.40906.75) 기준
명심해야 할 것은 nuget.config가 nuget 패키지 시스템의 모든 경로 설정을 제어하지는 않는다는 것입니다. 이것은 특히 이해하기 혼란 스러웠습니다. 특히 문제는 msbuild 및 Visual Studio (msbuild 호출)가 nuget.config의 경로를 사용하지 않고 nuget.targets 파일에서 경로를 재정의한다는 것입니다.
환경 준비
먼저 솔루션 폴더를 살펴보고 존재하는 모든 \ packages \ 폴더를 제거합니다. 이렇게하면 모든 패키지가 올바른 폴더에 눈에 띄게 설치되고 솔루션 전체에서 잘못된 경로 참조를 발견하는 데 도움이됩니다. 다음으로 최신 Nuget Visual Studio 확장이 설치되어 있는지 확인하십시오. 또한 각 솔루션에 최신 nuget.exe가 설치되어 있는지 확인하십시오. 명령 프롬프트를 열고 각 $ (SolutionDir) \ .nuget \ 폴더로 이동하여 다음 명령을 실행하십시오.
nuget update -self
NuGet에 대한 공통 패키지 폴더 경로 설정
각 $ (SolutionDir) \ .nuget \ NuGet.Config를 열고 <configuration> 섹션 안에 다음을 추가하십시오.
<config>
<add key="repositorypath" value="$\..\..\..\Packages" />
</config>
참고 : 절대 경로 또는 상대 경로를 사용할 수 있습니다. $와 함께 상대 경로를 사용하는경우 NuGet.Config 위치 아래 의 한 수준에 상대적이라는 것을명심하십시오 (버그라고 생각하십시오).
MSBuild 및 Visual Studio의 공통 패키지 폴더 경로 설정
각 $ (SolutionDir) \ .nuget \ NuGet.targets를 열고 다음 섹션을 수정하십시오 (Windows 이외의 경우 그 아래에 다른 섹션이 있음에 유의하십시오).
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
<PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>
패키지 업데이트
<PackagesDir>$([System.IO.Path]::GetFullPath("$(SolutionDir)\..\Packages"))</PackagesDir>
참고 : GetFullPath는 상대 경로를 절대 경로로 해석합니다.
모든 너겟 패키지를 공통 폴더로 복원
명령 프롬프트를 열고 각 $ (SolutionDir) \ .nuget으로 이동하여 다음 명령을 실행하십시오.
nuget restore ..\YourSolution.sln
이때 공통 위치에 단일 \ packages \ 폴더가 있어야하며 솔루션 폴더에는 하나도 없어야합니다. 그렇지 않은 경우 경로를 확인하십시오.
프로젝트 참조 수정
텍스트 편집기에서 모든 .csproj 파일을 열고 \ packages에 대한 참조를 찾아 올바른 경로로 업데이트하십시오. 이들 중 대부분은 <HintPath> 참조이지만 전부는 아닙니다. 예를 들어 WebGrease와 Microsoft.Bcl.Build에는 업데이트해야 할 별도의 경로 설정이 있습니다.
솔루션 구축
Visual Studio에서 솔루션을 열고 빌드를 시작하십시오. 복원해야하는 누락 된 패키지에 대해 불평하는 경우 패키지가 누락되어 복원해야한다고 가정하지 마십시오 (오류가 오도 될 수 있음). .csproj 파일 중 하나에서 잘못된 경로 일 수 있습니다. 패키지를 복원하기 전에 먼저 확인하십시오.
누락 된 패키지에 대한 빌드 오류가 있습니까?
.csproj 파일의 경로가 올바른지 이미 확인한 경우 두 가지 시도 옵션이 있습니다. 이것이 소스 코드 컨트롤에서 코드를 업데이트 한 결과라면 깨끗한 복사본을 확인한 다음 빌드 할 수 있습니다. 이것은 개발자 중 한 명에게 효과가 있었고 .suo 파일 또는 이와 유사한 파일에 아티팩트가 있다고 생각합니다. 다른 옵션은 해당 솔루션의 .nuget 폴더에있는 명령 행을 사용하여 패키지를 수동으로 복원하는 것입니다.
nuget restore ..\YourSolution.sln
$
상대 경로 앞에 누락되어 있다고 생각 합니다. 또한 NuGet.Config 파일에 대한 질문에 대한 답변은 여기에 있습니다 . 그것은 .nuget에서 처음으로 모습, 모든 상위 디렉토리에서, 다음의 AppData의 '글로벌'파일에서 : 다음 (어떤 역순으로 적용 하는 방법).