Szybki server NuGet w lokalnej sieci

26 Października 2021

Kiedy pracujemy nad nieco bardziej złożonymi bibliotekami, które będziemy rozprowadzać w postaci paczek NuGet to warto je również w tej postaci konsumować lokalnie. W przypadku pojedyńczej maszyny wystarczy wyznaczyć pewien folder i zarejestrować go jako źródło w pliku nuget.config. W moim przypadku mam projekt, który muszę kompilować na Windowsie i chcę konsumować na maszynie z Linuxem, ale nie chcę kopiować paczek przez SMB. Wobec tego można pokusić się o lokalny server NuGet.

Tworzenie serwera

Przejdziemy po prędce przez instrukcje z dokumentacji NuGet.Server:

  1. Utwórz nowy pusty projekt klasycznego ASP.NET na .NET Framework 4.6
  2. Dodaj paczkę NuGet.Server
  3. Uruchom (IIS Express), zobacz powitalną stronę
  4. Skopiuj swoje paczki NuGet do folderu Packages w projekcie

Możesz się teraz lokalnie podłączyć do tego źródła i konsumować paczki. Zobaczysz, że pliku .nupkg zostały przeniesione do folderów wewnątrz Packages, a metadane zostały z nich wyciągnięte do szybkiej konsumpcji.

Dostęp w sieci lokalnej

Nie jestem pewien czy to konieczny krok, ale ja zezwoliłem na połączenia przychodzące po porcie http dla IIS Express w Firewallu (Inbound Rules > New Rule > Port).

No i teraz łącząc się z maszyny z Linuxem zobaczyłem błąd 400 The request hostname is invalid. Dzieje się tak, ponieważ domyślnie IIS Express jest skonfigurowany by tylko przyjmować połączenia lokalne. Wobec tego musimy znaleźć jego plik applicationhost.config, który znajduje się w .vs\<projekt>\config\ i w sekcji sites > bindings zastąpić:

<binding protocol="http" bindingInformation="*:<port>:localhost" />
<binding protocol="http" bindingInformation="*:<port>:*" />

Voila, można dodać nowe źródło do nuget.config na maszynie w sieci lokalnej i zrobić dotnet restore żeby pociągnąć paczki. Jeśli chcemy paczki zmienić, to należy usunąć foldery w Packages naszego serwera, skopiować tam nowe paczki, a na maszynie docelowej wyczyścić cache dotnet nuget locals http-cache -c oraz usunąć z ~/.nuget/packages, żeby kolejny Restore ponownie je pobrał.

Jeśli VisualStudio marudzi z IISExpress, to można uruchomić go ręcznie:

& "C:\Program Files (x86)\IIS Express\iisexpress.exe" /config:path\to\applicationhost.config /siteid:2

Tutaj siteid to id z pliku konfiguracyjnego <site id="X"> który zmodyfikowaliśmy.