NuGet의 패키지를 버전 제어에 체크인 하시겠습니까?


87

NuGet 이전에는 프로젝트에서 사용되는 모든 외부 DLL을 체크인하는 것이 일반적으로 허용되는 '모범 사례'였습니다. 일반적으로 Libs또는 3rdParty디렉토리에 있습니다.

NuGet으로 작업 할 때 packages디렉터리 를 체크인해야합니까 , 아니면 MSBuild가 nuget 피드에서 필요한 패키지를 자동으로 다운로드 할 수있는 방법이 있습니까?


2
이것에 대한 대답은 의견의 문제입니다. "exclude / No"캠프는 제공된 기능 세트가 개발 중에 쉽게 만들고 패키지 저장소 (예 : nuget.org)에서 가져 오기만하면 빌드 할 때만 수행 할 수 있다고 유지합니다. "include / Yes"캠프는 외부 저장소를 사용할 수 없게되면 패키지 없이는 코드가 빌드되지 않을 것이라고 주장합니다. 결정을 내리기 전에 양면을 읽으십시오. 참조 : softwareengineering.stackexchange.com/questions/301547/...
CJBS

답변:


68

아니

이 질문이 제기되었으므로 이제 패키지를 소스 제어에 커밋하지 않고도 NuGet을 사용할 수있는 쉬운 워크 플로가 있습니다.

패키지 관리자 콘솔에서 'NuGetPowerTools' 를 설치해야합니다 .

Install-Package NuGetPowerTools

그런 다음 프로젝트에서 팩 복원을 지원하도록하려면 다른 명령을 실행해야합니다.

Enable-PackageRestore

이제 패키지 폴더없이 코드베이스를 커밋 할 준비가되었습니다. 이전 명령은 패키지가 누락 된 경우 자동으로 다운로드되고 추가되도록 프로젝트 파일을 변경했습니다.

출처

패키지를 소스 제어에 커밋하지 않고 NuGet 사용


41
NuGet-1.6부터는 더 이상 NuGetPowerTools가 필요하지 않습니다. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 Enable NuGet Package Restore. 문서를 참조하십시오 .
Kaleb Pederson 2012

3
예, .nuget 폴더와 그 아래 파일을 체크인해야합니다.
결석

11
@Edward-철학적으로 NuGet 패키지가 종속성이라는 점을 감안할 때 소스 제어에 포함하지 않는 이유는 무엇입니까? 소스 제어에 체크인되는 것은 빌드에 충분한 코드의 100 % 여야합니다. NuGet 패키지를 포함하지 않으면 외부 종속성이 생성됩니다. 패키지 다운로드 위치가 변경되거나 어떤 이상한 이유로 더 이상 사용할 수없는 경우 어떻게됩니까? 또는 나중에 다시 다운로드되는 패키지에 약간의 변경이있어 빌드가 중단 될 가능성이 더 높습니다. 프로젝트를 빌드하는 데 필요한 모든 것이 소스 제어에 있었다면 피할 수 있었을 것입니다.
Howiecamp

5
@Howiecamp 나는 더 이상 동의 할 수 없었다. 논리를 이해하지 못합니다. 소스 제어가 완전히 독립된 시스템이되기를 원합니다. 특히 프로젝트가 다소 레거시이고 잠시 동안 액세스되지 않은 경우. 다시 돌아와서 수정없이 작동하도록하고 싶습니다. Nuget은 내가 갖고 싶지 않은 단일 실패 지점입니다.
Telavian

2
@Howiecamp 우리의 솔루션은 자체 nuget 서버를 호스팅하고 내부에있는 모든 nuget 패키지를 GIT-LFS에 넣는 것입니다. 이것은 단일 실패 지점을 제거하고 모든 것을 버전 제어하에 멋지게 유지합니다. 그러나 우리는 여전히 패키지를 폴더에 체크인하지 않습니다 - 그리고 우리는 여전히 복원 자동 패키지를 사용
캐스퍼 레온 닐슨

30

예. 질문에서 언급 한 "libs"디렉토리와 동일한 "packages"디렉토리를 고려하십시오. 이것이 제가 OSS 프로젝트에서 개인적으로 취하는 접근 방식입니다.

MSBuild가 필요한 패키지를 자동으로 다운로드 할 수 있도록하는 기능을 조사 중이지만 아직 구현되지 않았습니다 (NuGet 1.1 기준).

일부 사람들은 이미 이러한 기능을 자체적으로 구현했을 수 있지만, 우리의 계획은 NuGet 1.2 또는 1.3에 해당 기능을 내장하는 것입니다.


10
이 기능이 추가 되었으면합니다. 필요에 따라 패키지를 CI 서버 또는 개발 PC로 가져 와서 타사 DLL로 소스 제어 저장소가 커지는 것을 방지 할 수 있으면 좋을 것입니다.
John Mills

2
Visual Studio의 패키지 관리자와 명령 줄 도구가 모두 "패키지를 복구"할 수 있다면 정말 멋질 것입니다.
Shaun Wilson

1
아마도이 대답은 지금은 사용되지 않습니다 제거 / 편집에 좋은 것
렉스

3
@ 팀 대답은 현재 imho가 아닙니다
Edward Wilde

4
이 답변은 여전히 ​​최신입니다. 전역 저장소에없는 패키지를 고려하십시오 (복구 / 다운로드 할 방법 없음). IMHO 버전 관리 시스템에 패키지를 저장하는 것이 좋습니다.
Pavel Hodek

6

여기에있는 모든 대답에도 불구하고 "어떤 종류의"버전 제어하에 모든 종속성을 갖지 않는 것은 여전히 ​​끔찍한 해결책입니다.

GIT의 경우 이는 GIT-LFS를 의미합니다.

NPM의 최근 에피소드는 왜 당신이 의존하는 인터넷 저장소가 고장 나거나 사용할 수 없는지 등을 보여줍니다.

더 이상 물건을 만들 수 없으므로 전달할 수 없습니다.


1
이것은 아주 좋은 점입니다. 자체 내부 NuGet 서버가 있어도 빌드 중에 항상 사용할 수 있도록 신뢰할 수 있습니까? 또한 모든 빌드에 대해 항상 새 복사본을 얻기 위해 필요한 패키지 변경 빈도는?
Josh P

npm패키지 목록을 해제하지 않았기 때문에 고장 났지만 실제로 삭제했습니다. NuGet은이 작업을 수행하지 않습니다. 어느 시점에서든 NuGet에 액세스 할 수없는 경우 뭔가 심각한 문제입니다. 나는 git에 의존성의 craptonne을 저장하는 것이 좋은 해결책이라고 생각하지 않습니다. 의존성을 특정 버전으로 잠그고 그것이 중요하다면 당신과 인터넷 사이에 거울을 두십시오.
Dan

2
"NuGet은이 작업을 수행하지 않습니다." hudiluhu 당신은 완전히 통제 할 수없는 도메인의 미래에 대한 약속을했습니다. 현실 세계에서 당신의 통제 영역을 벗어난 것은 당신의 통제 영역을 벗어났습니다. 이것은 Npm뿐만 아니라 NuGet에도 적용됩니다. 더욱이 "미러"에 대한 당신의 생각은 내가 여기서 제안한 것과 정확히 일치하지만 당신의 세계에서 "미러"는 어떤 종류의 버전 제어 체계에 의해 뒷받침되지 않습니다. 다시 당신은 당신이 설정 한 문제를 해결하지 못했습니다.
Casper Leon Nielsen

5

질문을 한 후, 나는 toplovel Packages 디렉토리 를 확인할 필요가 없도록 다음과 같은 접근 방식을 적용했습니다 .

최상위 build.msbuild 파일에서 :

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

각 project.csproj 파일에서

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>

2
이 방법은 작동하지만 요즘에는 기본 제공 활성화 패키지 복원을 사용하는 것이 가장 좋습니다
Scott Weinstein

4

이 질문이 처음 게시되고 답변되었을 때 현실이 달랐다는 것을 알고 있었지만 다행히 답변이 약간 변경되었습니다. 이제 NuGet을 사용하여 Pre-Build 이벤트를 사용하여 MSBuild를 통해 종속성을 다운로드 할 수 있습니다. 코드 저장소에 패키지 폴더를 넣을 필요가 없으며 모든 종속성은 빌드시 다운로드 및 / 또는 업데이트됩니다. 해결 방법 일 수 있지만 충분히 괜찮아 보입니다. 자세한 내용은 다음 블로그 게시물을 참조하십시오. http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html


4
NuGet 리포지토리에 액세스하려면 빌드 서버가 필요하며 빌드 서버가 인터넷을 볼 수없는 곳에서 일한 유일한 곳은 아닙니다. 난 그냥 ...의 패키지 트리를 확인 돌아갈거야
piers7


3

이 게시물은 매우 오래되었습니다. 대답은 여전히 ​​아니오이지만 솔루션이 변경되었습니다. NuGet 2.7 이상부터는 소스에 NuGet.exe 파일을 포함하지 않고도 자동 패키지 복원을 활성화 할 수 있으며 (최소한 말하지 않는 것은 바람직하지 않음) 최신 DVCS를 사용하는 경우 패키지 폴더를 무시할 수 있습니다. 특별한 사용자 지정이 필요한 경우 솔루션 루트에 nuget.config 파일을 만들 수 있습니다.

http://docs.nuget.org/docs/reference/package-restore

또한 새로운 csproj 형식을 사용하면 지금 통합되어 있으므로 추가 nuget.config 파일도 피할 수 있습니다. 더 잘 설명하는이 게시물을 확인하십시오.

.nuget 폴더를 버전 관리에 추가해야합니까?

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