2014-11-07 15 views
18

Mam kilka małych projektów C#, które używają kilku pakietów NuGet. Chciałbym móc automatycznie zaktualizować wersję danego pakietu. Co więcej: chciałbym zostać ostrzeżony, jeśli projekt korzysta z innej wersji niż pozostałe.Jak wymusić tę samą wersję pakietu Nuget w wielu projektach C#?

W jaki sposób mogę wymusić tę samą zależność od wersji w wielu projektach C#?

+0

Dobrym punktem wyjścia jest 'Zarządzanie Nuget Pakiety dla dialogu Solution' w Visual Studio. Wyświetla listę pakietów dla każdej wersji, dzięki czemu można łatwo zauważyć wiele wersji. Nie zapewnia to jednak mechanizmu egzekwowania tego. – theDmi

+1

Czy rozważałeś zamiast tego używanie Paketu (https://fsprojects.github.io/Paket/) jako klienta nuget? Nadal możesz używać tych samych starych serwerów nuget, ale otrzymujesz nowoczesny, dobrze zaprojektowany klient zamiast tego, który domyślnie będzie wymuszał tę samą zależność od wersji w twoim rozwiązaniu (jak również daje mnóstwo innych wspaniałych funkcji, których domyślny klient nuget nie będzie działał dać ci). – wasatz

Odpowiedz

6

wierzę znalazłem konfigurację, która rozwiązuje ten problem (i wiele inne problemy).

Właśnie zdałem sobie sprawę, że można użyć folderu jako źródła nugetu. Oto co zrobiłem:

root 
    + localnuget 
     + Newtonsoft.Json.6.0.1.nupkg 
    + nuget.config 
    + packages 
     + Newtonsoft.Json.6.0.1 
    + src 
     + project1 

nuget.config wygląda następująco:

<configuration>                            
    <config>                             
    <add key="repositoryPath" value="packages" />                   
    </config>                             
    <packageSources>                           
    <add key="local source" value="localnuget">                
    </packageSources>                           
</configuration>   

Możesz dodać serwer Nuget do nuget.config, aby uzyskać dostęp do aktualizacji lub nowych zależności w czasie rozwoju:

<add key="nuget.org" value="https://www.nuget.org/api/v2/" /> 

Kiedy skończysz, możesz skopiować .nupkg z cache [1] do localnuget folderu, by sprawdzić go w.

Istnieją 3 rzeczy, które kocham o tej konfiguracji:

  1. jestem teraz w stanie wykorzystać możliwości Nuget, takie jak dodawanie rekwizyty i cele. Jeśli masz generator kodu (np. Protobuf lub oszczędzanie), staje się to bez ceny.

  2. To (częściowo) rozwiązuje problem Visual Studio nie kopiując wszystkich bibliotek DLL [2], ponieważ musisz określić zależności w pliku .nuspec, a nuget ładuje pośrednie zależności automatycznie.

  3. Kiedyś miałem pojedynczy plik rozwiązania dla wszystkich projektów, więc aktualizowanie pakietów nugetowych było łatwiejsze. Nie próbowałem jeszcze, ale myślę, że też rozwiązałem ten problem. Mogę mieć pakiety nuget dla projektu, który chcę wyeksportować z danego rozwiązania.

[1] http://www.hanselman.com/blog/HowToAccessNuGetWhenNuGetorgIsDownOrYoureOnAPlane.aspx

[2] http://www.google.com/search?q=visual+studio+not+copying+referenced+dll

8

Dziękuję za pytanie - więc nie jestem sam. Dużo czasu poświęcałem zapewnieniu, że wszystkie projekty w moim rozwiązaniu używają tej samej wersji pakietu. Interfejs użytkownika NuGet (a także interfejs wiersza poleceń) również przyczynia się do posiadania różnych wersji wśród projektów w ramach rozwiązania. W szczególności, gdy do rozwiązania dodaje się nowy projekt i pakiet X zostanie dodany do nowego projektu, NuGet jest zbyt chciwy, aby pobrać najnowszą wersję z nuget.org zamiast najpierw użyć wersji lokalnej, która byłaby lepszą obsługą domyślną .

Całkowicie zgadzam się z tobą, że NuGet powinien ostrzegać, jeśli różne wersje pakietu są używane w rozwiązaniu. I powinno to pomóc uniknąć tego i naprawić taki labirynt wersji.

Najlepszym znalazłem zrobić to wyliczyć wszystkie pliki w folderze packages.config roztworze (swoje projekty-root), które wyglądają jak

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net451" /> 
    ... 
</packages> 

następnie sortowania XML węzłów id i analizowanie numery wersji.

Jeśli wystąpi którykolwiek pakiet z różnymi numerami wersji, dzięki czemu wszyscy równi, a następnie uruchomienie komendy Nuget

Update-Package -ProjectName 'acme.lab.project' -Reinstall 

powinien naprawić błędne wersje pakietów.

(Od Nuget jest open source z pewnością byłoby fajne rzeczy, aby uzyskać nasze ręce brudne i wdrożenie brakującą użyteczność unikania wersja konfliktu.)

+0

Dzięki za to. Naprawiłem projekt, który stale uzyskiwał ostrzeżenia o konfliktach, kopiując plik packages.config z działającego projektu wraz z powiązaniami zespołu i uruchamiając powyższe polecenie. – CountZero

0

nie wiem jak to egzekwowane, ale znalazłem kartę konsolidację "", aby pomóc. Ta karta pokazuje pakiet, który ma inną wersję niż rozwiązanie. Stamtąd możesz wybrać projekty i użyć przycisku instalacji, aby zainstalować dla nich tę samą wersję pakietu.

enter image description here

Powiązane problemy