Sprawdzasz pakiety z NuGet do kontroli wersji?

87

Przed NuGet powszechnie akceptowaną „najlepszą praktyką” było rejestrowanie wszystkich zewnętrznych bibliotek DLL używanych w projekcie. Zwykle w katalogu Libslub 3rdParty.

Czy podczas pracy z programem NuGet mam zaewidencjonować packageskatalog, czy istnieje sposób, aby program MSBuild automatycznie pobierał potrzebne pakiety z źródła danych NuGet?

Scott Weinstein
źródło
2
Odpowiedź na to pytanie jest kwestią opinii. Obóz „wyklucz / Nie” utrzymuje, że ponieważ dostarczony zestaw funkcji ułatwia programowanie i budowanie, aby po prostu pobrać z repozytorium pakietów (np. Nuget.org), można to zrobić po prostu w czasie kompilacji. Obóz „włączanie / tak” utrzymuje, że kod nie zostałby zbudowany bez pakietów, gdyby zewnętrzne repozytorium stało się niedostępne. Przeczytaj obie strony przed podjęciem decyzji. Zobacz także: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Odpowiedzi:

68

Nie

Ponieważ zadano to pytanie, istnieje teraz łatwy przepływ pracy do korzystania z NuGet bez zatwierdzania pakietów do kontroli źródła

Z konsoli menedżera pakietów musisz zainstalować „NuGetPowerTools” :

Install-Package NuGetPowerTools

Następnie, aby umożliwić projektom obsługę przywracania pakietów, musisz uruchomić inne polecenie:

Enable-PackageRestore

Teraz możesz zatwierdzić swoją bazę kodu bez folderu packages. Poprzednie polecenie zmieniło pliki projektu, aby w przypadku braku pakietów były one automatycznie pobierane i dodawane.

Źródło

Używanie NuGet bez zatwierdzania pakietów do kontroli źródła

Edward Wilde
źródło
41
Począwszy od NuGet-1.6, nie potrzebujesz już NuGetPowerTools, aby to zrobić. Wystarczy kliknąć prawym przyciskiem myszy na rozwiązanie w Solution Explorer i wybrać, Enable NuGet Package Restore. Zobacz dokumentację .
Kaleb Pederson
3
Tak, musisz zaewidencjonować folder .nuget i pliki poniżej.
absync
11
@Edward - z filozoficznego punktu widzenia, dlaczego nie uwzględnić pakietów NuGet w kontroli źródła, biorąc pod uwagę, że są to zależności? To, co jest sprawdzane w kontroli źródła, powinno być w 100% wystarczające do kompilacji. Nie uwzględniając pakietów NuGet powstają zależności zewnętrzne, np. co się stanie, jeśli zmieni się lokalizacja pobierania pakietu lub z jakiegoś dziwnego powodu nie będzie już dostępna, itp. A może bardziej prawdopodobne jest, że nastąpi jakaś niewielka zmiana w pakiecie, który jest później ponownie pobierany i przerywa kompilację? Można by tego uniknąć, gdyby wszystko, co potrzebne do zbudowania projektu, znajdowało się pod kontrolą źródła.
Howiecamp
5
@Howiecamp Nie mogłem się bardziej zgodzić. Nie rozumiem logiki. Chcę, aby kontrola źródła była w pełni samodzielnym systemem. Zwłaszcza jeśli projekt jest nieco starszy i nie był dostępny przez jakiś czas. Chcę wrócić i sprawić, by działało bez modyfikacji. Nuget to pojedynczy punkt awarii, którego nie chcę mieć.
Telavian
2
@Howiecamp Nasze rozwiązanie polega na hostowaniu naszego własnego serwera nuget - i umieszczaniu wszystkich pakietów nuget, wewnętrznych lub zewnętrznych, w GIT-LFS. Eliminuje to pojedynczy punkt awarii i utrzymuje wszystko pod kontrolą wersji. Ale nadal nie sprawdzamy folderu pakietów - i nadal używamy automatycznego przywracania pakietów
Casper Leon Nielsen
30

Tak. Rozważ katalog "packages" jako odpowiednik twojego katalogu "libs", o którym wspomniałeś w pytaniu. To jest podejście, które osobiście stosuję w moich projektach OSS.

Badamy funkcje, które umożliwiłyby programowi MSBuild automatyczne pobieranie potrzebnych pakietów, ale nie zostały one zaimplementowane (od wersji NuGet 1.1).

Myślę, że niektórzy ludzie mogli już samodzielnie zaimplementować takie funkcje, ale naszym planem jest, miejmy nadzieję, włączenie tej funkcji do NuGet 1.2 lub 1.3.

Haacked
źródło
10
Zdecydowanie chciałbym, aby ta funkcja została dodana. Byłoby miło mieć możliwość ściągania pakietów w razie potrzeby na serwer CI lub na komputer deweloperski, aby uniknąć nadmuchania repozytorium kontroli źródła bibliotekami DLL innych firm.
John Mills,
2
Gdyby menedżer pakietów w Visual Studio i narzędzie wiersza poleceń potrafiły „naprawiać pakiety”, byłoby wspaniale.
Shaun Wilson
1
Być może dobrze byłoby usunąć / edytować tę odpowiedź, teraz jest ona przestarzała
Lex
3
@Tim odpowiedź nie jest aktualna imho
Edward Wilde
4
Ta odpowiedź JEST wciąż aktualna. Rozważ pakiety, które nie znajdują się w repozytorium globalnym (nie ma możliwości ich naprawy / pobrania). IMHO dobrą praktyką jest przechowywanie pakietów w systemie wersjonowania.
Pavel Hodek
6

Pomimo wszystkich odpowiedzi tutaj, nadal jest zwykłym okropnym rozwiązaniem, aby nie mieć wszystkich swoich zależności pod „jakąś” kontrolą wersji.

Dla GIT oznaczałoby to GIT-LFS.

Niedawny odcinek z NPM pokazuje, dlaczego: jeśli repozytorium internetowe, od którego jesteś zależny, zepsuje się, jest niedostępne itp., To masz przerąbane?

Nie jesteś już w stanie budować swoich rzeczy - a zatem nie jesteś w stanie dostarczyć.

Casper Leon Nielsen
źródło
1
To jest BARDZO dobry punkt. Nawet jeśli mamy własny wewnętrzny serwer NuGet, czy możemy na nim polegać, aby był zawsze dostępny podczas kompilacji? Ponadto, jak często nasze pakiety się zmieniają, że zawsze potrzebowaliśmy nowej kopii dla każdej kompilacji?
Josh P
npmzepsuł się, ponieważ nie wyrejestrował pakietów z listy, w rzeczywistości je usunął. NuGet tego nie robi; jeśli w dowolnym momencie nie możesz uzyskać dostępu do NuGet, coś jest strasznie nie tak. Nie sądzę, aby przechowywanie craptonne zależności w git było dobrym rozwiązaniem: po prostu zablokuj swoje zależności w określonej wersji i miej lustro pomiędzy tobą a Internetem, jeśli to dla ciebie ważne.
Dan
2
„NuGet tego nie robi”. Cóż, hudiluhu, właśnie złożyłeś obietnicę dotyczącą przyszłości domeny, która jest całkowicie poza twoją kontrolą. W prawdziwym świecie rzeczy są poza twoim obszarem kontroli, cóż, są poza twoim obszarem kontroli. Dotyczy to zarówno NuGet, jak i Npm. Co więcej, twoja idea „lustra” jest dokładnie tym, co tutaj proponuję, ale w twoim świecie „lustro” nie jest poparte żadnym rodzajem schematu kontrolowanego przez wersje. Znowu nie rozwiązałeś problemu, który sobie postawiłeś.
Casper Leon Nielsen
5

Odkąd zadałem pytanie, zastosowałem następujące podejście, aby nie musieć sprawdzać katalogu toplovel Packages .

W pliku build.msbuild najwyższego poziomu:

<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>

W każdym pliku project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; 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 &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>
Scott Weinstein
źródło
2
To działa, ale w dzisiejszych czasach najlepiej jest po prostu użyć wbudowanego włączania przywracania pakietów
Scott Weinstein
4

Zdaję sobie sprawę, że rzeczywistość była inna, gdy pierwotnie opublikowano to pytanie i na nie udzielono odpowiedzi, ale na szczęście odpowiedź nieco się zmieniła. Teraz można używać narzędzia NuGet do pobierania zależności za pośrednictwem programu MSBuild przy użyciu zdarzenia przed kompilacją. Nie musisz umieszczać folderu pakietów w repozytorium kodu, wszystkie zależności zostaną pobrane i / lub zaktualizowane podczas kompilacji. Może to obejście, ale wygląda wystarczająco przyzwoicie. Szczegółowe informacje można znaleźć w następującym poście na blogu: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

Paweł Krakowiak
źródło
4
Byłem podekscytowany, dopóki nie przypomniałem sobie, że wymaga to serwera kompilacji, aby uzyskać dostęp do repozytorium NuGet, a nie jest to jedyne miejsce, w którym pracowałem, w którym serwery kompilacji nie widzą Internetu. Wrócę tylko do sprawdzania drzewa paczek w ...
piers7
3

Ten post stał się bardzo nieaktualny. Odpowiedź nadal brzmi NIE, ale rozwiązanie się zmieniło. Począwszy od NuGet 2.7+ możesz włączyć automatyczne przywracanie pakietów bez dołączania pliku NuGet.exe do źródła (jest to co najmniej niepożądane), a jeśli używasz dowolnego nowoczesnego DVCS, możesz zignorować folder pakietów. Jeśli potrzebujesz specjalnych dostosowań, możesz utworzyć plik nuget.config w katalogu głównym rozwiązania.

http://docs.nuget.org/docs/reference/package-restore

Ponadto dzięki nowemu formatowi csproj można również uniknąć dodatkowych plików nuget.config, ponieważ jest on teraz zintegrowany. Sprawdź ten post, który wyjaśnia to lepiej:

Czy folder .nuget powinien zostać dodany do kontroli wersji?

Jeremy
źródło