2012-03-20 14 views
36

Mam dwa repozytoria i potrzebuję skompilowanych bibliotek z jednego repozytorium w drugim. Nie chcę ręcznie sprawdzać repo1 dla zaktualizowanych bibliotek i kopiować/zatwierdzać do repo2, ponieważ to jest głupie. Mam repo1 budując pakiety NuGet na każdej kompilacji niezbędnych bibliotek i publikuję je na wewnętrznym serwerze NuGet. Projekty w repo2 mogą następnie odwoływać się do pakietów NuGet, a wszystko działa (prawie).Jak automatycznie aktualizować pakiety NuGet do najnowszej dostępnej wersji

Ostatnim utrudnieniem jest automatyczne aktualizowanie pakietów NuGet w projektach repo2. Ponieważ nie wiem, kiedy biblioteki w repo1 zostaną zaktualizowane (i nie powinienem), chciałbym utworzyć jakieś wydarzenie kompilacji projektów w repo2, które automatycznie zaktualizuje pakiety NuGet. Obecnie mam tylko zdarzenie poprzedzające kompilację, ale ponieważ pliki packages.config zawierają numer wersji zainstalowanego pakietu, ciągle otrzymuję zmodyfikowane pliki w repo2 (aktualizowane są pliki packages.config).

Moje pytanie brzmi: jaki jest dobry sposób na automatyczną aktualizację pakietów NuGet bez zbędnego fałszowania mojego repo2 VCS? ScottGu mówi Here (w komentarzach), że możliwe jest przechwytywanie aktualizacji pakietów do kompilacji CI, ale nie określa, w jaki sposób i moje obecne rozwiązanie jest nieporządne. Czy jest zbudowany w sposób, którego mi brakuje? A może lepsze warunki pracy?

+3

Bądź ostrożny. Biblioteki mogą zmienić i złamać oprogramowanie. http://blog.heroku.com/archives/2011/6/28/the_new_heroku_4_erosion_resistance_explicit_contracts/ –

+8

Oto, do czego służy nasz pakiet testów automatycznych :) – themilkyninja

+0

@themilkyninja czy kiedykolwiek dostałeś rozwiązanie? Mam do czynienia z dokładnie tym samym problemem. – stevebot

Odpowiedz

3

Można wykorzystać funkcję (prawdopodobnie trochę informacji: http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages) Pakiet Nuget Restore

At kompilacji projektu, to nazywa "nuget.exe -install", aby ponownie zainstalować pakiety z packages.config. Nie próbowałem, ale można dodać polecenie aktualizacji do pliku nuget.targets w ten sam sposób. (Będziesz musiał zadzwonić zarówno do aktualizacji nuget.exe, jak i istniejącej instalacji nuget.exe).

+4

Zajrzałem do tego i tylko przywróciłem pakiety do folderu pakietu na poziomie rozwiązania (a nie do rzeczywistego projektu). Nie chcę również sprawdzać plików w projekcie i ani 'nuget.exe update' ani' nuget.ext install' nie przywrócą wszystkich plików do projektu. Zasadniczo to, czego szukam, to [ta funkcja] (http://nuget.codeplex.com/workitem/1239) – themilkyninja

-1

Można zmodyfikować plik .cspoj wykonać "BeforeBuild" target tak:

<Target Name="BeforeBuild"> 
    <Exec Command="&quot;$(SolutionDir).nuget\NuGet&quot; update &quot;$(ProjectDir)packages.config&quot; -Id your.package.id" /> 
</Target> 

zauważyć, że: Bedziesz musiał mieć "Nuget.exe" w katalogu ur rozwiązanie

+1

To nie jest takie proste, jak umieszczenie go w etapach wstępnej kompilacji. W rzeczywistości jest już za późno: http://stackoverflow.com/questions/15027256/cannot-automatically-update-a-nuget-package-to-test-version-version-during-build –

0

To wyjaśnia, w jaki sposób to zrobić za pośrednictwem MSBuild

http://netitude.bc3tech.net/2014/11/28/auto-update-your-nuget-packages-at-build-time/

<Target Name="UpdatePackages" DependsOnTargets="CheckPrerequisites"> 
    <Exec Command="$(UpdateCommand)" 
     Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" /> 

    <Exec Command="$(UpdateCommand)" 
     LogStandardErrorAsError="true" 
     Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" /> 
</Target> 


<!-- Commands --> 
<UpdateCommand>$(NuGetCommand) update "$(PackagesConfig)" -source "$(PackageSources)" -id AutoUpdater $(NonInteractiveSwitch)</UpdateCommand> 
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand> 

<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand> 

<!-- We need to ensure packages are restored prior to assembly resolve --> 
<BuildDependsOn Condition="$(RestorePackages) == 'true'"> 
    RestorePackages; 
    UpdatePackages; 
    $(BuildDependsOn); 
</BuildDependsOn> 
Powiązane problemy