NuGet 이전에는 프로젝트에서 사용되는 모든 외부 DLL을 체크인하는 것이 일반적으로 허용되는 '모범 사례'였습니다. 일반적으로 Libs
또는 3rdParty
디렉토리에 있습니다.
NuGet으로 작업 할 때 packages
디렉터리 를 체크인해야합니까 , 아니면 MSBuild가 nuget 피드에서 필요한 패키지를 자동으로 다운로드 할 수있는 방법이 있습니까?
NuGet 이전에는 프로젝트에서 사용되는 모든 외부 DLL을 체크인하는 것이 일반적으로 허용되는 '모범 사례'였습니다. 일반적으로 Libs
또는 3rdParty
디렉토리에 있습니다.
NuGet으로 작업 할 때 packages
디렉터리 를 체크인해야합니까 , 아니면 MSBuild가 nuget 피드에서 필요한 패키지를 자동으로 다운로드 할 수있는 방법이 있습니까?
답변:
이 질문이 제기되었으므로 이제 패키지를 소스 제어에 커밋하지 않고도 NuGet을 사용할 수있는 쉬운 워크 플로가 있습니다.
패키지 관리자 콘솔에서 'NuGetPowerTools' 를 설치해야합니다 .
Install-Package NuGetPowerTools
그런 다음 프로젝트에서 팩 복원을 지원하도록하려면 다른 명령을 실행해야합니다.
Enable-PackageRestore
이제 패키지 폴더없이 코드베이스를 커밋 할 준비가되었습니다. 이전 명령은 패키지가 누락 된 경우 자동으로 다운로드되고 추가되도록 프로젝트 파일을 변경했습니다.
Enable NuGet Package Restore
. 문서를 참조하십시오 .
예. 질문에서 언급 한 "libs"디렉토리와 동일한 "packages"디렉토리를 고려하십시오. 이것이 제가 OSS 프로젝트에서 개인적으로 취하는 접근 방식입니다.
MSBuild가 필요한 패키지를 자동으로 다운로드 할 수 있도록하는 기능을 조사 중이지만 아직 구현되지 않았습니다 (NuGet 1.1 기준).
일부 사람들은 이미 이러한 기능을 자체적으로 구현했을 수 있지만, 우리의 계획은 NuGet 1.2 또는 1.3에 해당 기능을 내장하는 것입니다.
여기에있는 모든 대답에도 불구하고 "어떤 종류의"버전 제어하에 모든 종속성을 갖지 않는 것은 여전히 끔찍한 해결책입니다.
GIT의 경우 이는 GIT-LFS를 의미합니다.
NPM의 최근 에피소드는 왜 당신이 의존하는 인터넷 저장소가 고장 나거나 사용할 수 없는지 등을 보여줍니다.
더 이상 물건을 만들 수 없으므로 전달할 수 없습니다.
npm
패키지 목록을 해제하지 않았기 때문에 고장 났지만 실제로 삭제했습니다. NuGet은이 작업을 수행하지 않습니다. 어느 시점에서든 NuGet에 액세스 할 수없는 경우 뭔가 심각한 문제입니다. 나는 git에 의존성의 craptonne을 저장하는 것이 좋은 해결책이라고 생각하지 않습니다. 의존성을 특정 버전으로 잠그고 그것이 중요하다면 당신과 인터넷 사이에 거울을 두십시오.
질문을 한 후, 나는 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 > 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 > msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
</Target>
이 질문이 처음 게시되고 답변되었을 때 현실이 달랐다는 것을 알고 있었지만 다행히 답변이 약간 변경되었습니다. 이제 NuGet을 사용하여 Pre-Build 이벤트를 사용하여 MSBuild를 통해 종속성을 다운로드 할 수 있습니다. 코드 저장소에 패키지 폴더를 넣을 필요가 없으며 모든 종속성은 빌드시 다운로드 및 / 또는 업데이트됩니다. 해결 방법 일 수 있지만 충분히 괜찮아 보입니다. 자세한 내용은 다음 블로그 게시물을 참조하십시오. http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html
2013 년 9 월 20 일부로 "Nuget Restore"라는 것이 있습니다. 원할 경우 실제로 패키지 폴더를 체크인 할 필요가 없습니다. (특히 DVCS를 사용하는 경우)
이것을 확인하십시오 : 패키지를 소스 제어에 커밋하지 않고 NuGet 사용 http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
이 게시물은 매우 오래되었습니다. 대답은 여전히 아니오이지만 솔루션이 변경되었습니다. NuGet 2.7 이상부터는 소스에 NuGet.exe 파일을 포함하지 않고도 자동 패키지 복원을 활성화 할 수 있으며 (최소한 말하지 않는 것은 바람직하지 않음) 최신 DVCS를 사용하는 경우 패키지 폴더를 무시할 수 있습니다. 특별한 사용자 지정이 필요한 경우 솔루션 루트에 nuget.config 파일을 만들 수 있습니다.
http://docs.nuget.org/docs/reference/package-restore
또한 새로운 csproj 형식을 사용하면 지금 통합되어 있으므로 추가 nuget.config 파일도 피할 수 있습니다. 더 잘 설명하는이 게시물을 확인하십시오.