2013-07-12 9 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はデフォルトオプションを持つことになりそうです。それは1e7345624dとcomittedされています。私はそれをフォークした後で実現しました。私はもう一度遅すぎたと思う;-)

+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% 
関連する問題