2013-07-12 2 views
10

내 회사에 대해 NuGet server 사용자 지정을 설정했습니다. 모든 것이 훌륭하게 작동합니다 - 게시 할 수 있고 패키지를 볼 수 있습니다.NuGet - 동일한 이름과 버전 번호의 패키지 덮어 쓰기 허용 안 함

저의 유일한 관심사는 동일한 패키지 이름과 버전 번호를 게시하여 기존 패키지를 덮어 쓸 수 있다는 것입니다. 이것은 이상적인 것이 아니며 동일한 이름과 버전을 가진 패키지가 이미 존재하는 경우 NuGet 서버에서 오류를 반환하고 싶습니다.

내가 어떻게이 작업을 수행 할 수 있는지에 대한 단서가 있습니까?

답변

9

또한 기존 패키지를 덮어 쓸 수 없게되어서 고맙게 생각합니다. 그러나 NuGet 서버를 사용하지 않아도되는 것은 아닙니다. A similar feature request has been closed about two years ago.

그러나 source code을 보면 몇 가지 옵션이 열립니다. CreatePackage() -method를 살펴보십시오.

// Make sure they can access this package 
if (Authenticate(context, apiKey, package.Id)) 
{ 
    _serverRepository.AddPackage(package); 
    WriteStatus(context, HttpStatusCode.Created, ""); 
} 

모두가 그렇게 생성자 주입을 사용하여 전달됩니다 그것은 지정된 패키지를 추가 할 수있다 (단지 API 키를 확인)하고 IServerPackageRepository 실제로 패키지를 추가 할 수 있는지 확인하기 위해 IPackageAuthenticationService를 사용 사용자 정의 구현을 전달하여 동작을 쉽게 확장 할 수 있습니다 (이에 대해서는 Ninject bindings 수정).

첫눈에 나는 사용자 지정을 위해 IServerPackageRepository으로 갈 것입니다. 현재 구현에서는 IFileSystem.AddFile (...)을 사용하여 패키지를 추가합니다. IFileSystem.FileExists (...)을 사용하여 패키지가 이미 있는지 확인할 수 있습니다.

지속적인 통합 관점에서 NuGet은 Semantic Versioning을 따르므로 기존 패키지를 덮어 쓰지 못하도록하는 것이 합리적입니다. 따라서 새로운 빌드에는 버그 수정, 새로운 기능 또는 변경 사항이 포함되어야합니다. 그러나 스냅 샷/사전 릴리스 덮어 쓰기 허용하도록 선택할 것입니다.

업데이트 : V2.8은 옵션 allowOverrideExistingPackageOnPush이있을 것이다 보인다 이전 버전과의 호환성에 대한 디폴트는 true. 그것은 1e7345624d으로 꾸몄다. 나는 그것을 포크 후에 깨달았다. 나는 너무 늦었다 .--)

+0

업데이트 : 지난 2 년 동안 나는이 ootb를 지원하는 [Klondike] (https://github.com/themotleyfool/Klondike)를 사용하고 있습니다. 훌륭합니다. – mkoertgen

1

같은 문제가 발생했습니다. 내 자신의 SymbolSource 서버를 실행합니다. 나는 출판 된 패키지의 기록을 유지하기로 결정했다. 패키지를 게시하기 전에 로그가 이미 게시되었는지 확인하고 게시하지 않을 수 있습니다. 이것은 모두 MS-DOS 배치 파일에서 수행됩니다. 아래를 참조하십시오.

@echo off 

rem Requires that the Visual Studio directory is in your 
rem PATH environment variable. It will be something like: 
rem C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 

rem API key for publishing to SymbolSource server 
set apiKey=<<<GUID>>> 

rem URL of the SymbolSource web app 
set lib=http://<<<address>>> 

rem Path to a simple text file on a file share - which happens to be the 
rem same place that the SymbolSource server web app is published. 
set log=\\<<<path>>>\publish_log.txt 

rem Path to the Visual Studio solution that contains the projects to be published. 
set sln=..\<<<solution name>>>.sln 

rem Build all projects in the solution. 
devenv %sln% /rebuild Debug 

rem Delete packages produced during last run. 
del *.nupkg 

rem Each line in projects.txt is a path to a .csproj file that we want to 
rem create a nuget package for. Each .csproj file has a corresponding .nuspec 
rem file that lives in the same directory. 
for /F %%i in (projects.txt) do nuget.exe pack %%i -IncludeReferencedProjects -Prop Configuration=Debug -Symbols 

rem Delete any local packages that have already been published. 
for /F %%i in (%log%) do if exist %%i del %%i 

for %%F in (".\*.symbols.nupkg") do nuget push %%~nxF %apiKey% -source %lib% 

rem Log information about published packages so, in the next run, 
rem we can tell what has been published and what has not. 
for %%F in (".\*.symbols.nupkg") do echo %%~nxF >> %log% 
관련 문제