Niskobudżetowe repozytorium NuGet

Dziś krótki artykuł z cyklu „małe a cieszy” :)

Chyba każdy programista w trakcie swojego życia zbiera jakieś przydatne kawałki kodu. Niektórzy tworzą z nich drobne biblioteki, inni całe frameworki. To czy jest to praktyka zła, czy dobra nie jest tematem tej rozprawki. Wszystkim nam gdzieś tam jednak przyświeca idea DRY (Do not Repeat Yourself). Jak ją sobie zrealizujemy, to już zależy od nas. Przynajmniej w naszych prywatnych projektach. Z owymi „przydasiami” wiąże się pewien problem. Gdy już stworzymy sobie szereg bibliotek, chcielibyśmy je wykorzystać w różnych projektach.

Osobiście przeszedłem przez etap repozytorium binarek trzymanych w SVN, sciąganych do wyznaczonego katalogu; ręcznego dodawania do nich referencji; czy tworzenia instalatorów WiX, które pakowały binarki do GAC oraz do katalogu z „referencyjnymi bibliotekami”. Miało to tyle wad co zalet, a rozwiązanie z WiXem było dodatkowo pracochłonne.

Na szczęście na horyzoncie pojawił się NuGet.

O tym, czym NuGet jest, chyba nikomu ze światka około .NETowego mówić nie muszę. Gdyby jednak ktoś nie kojarzył, odsyłam na oficjalną stronę projektu, gdzie możecie w szczegółach zaznajomić się z projektem.

W wielkim skrócie to narzędzie, które korzystając ze zdefiniowanych repozytoriów, potrafi dodać do projektu niezbędne referencje, uprzednio ściągając wszystkie potrzebne pliki. Potrafi także wprowadzić zmiany w konfiguracji i wiele, wiele innych fajnych rzeczy. A to wszystko możemy zrobić z poziomu menu kontekstowego w Visual Studio. Bajka!

Myśl, która automatycznie przychodzi do głowy to: „ja chcę takie repozytorium; będę mógł publikować paczuszki, z których będę później korzysał w różnych projektach, a nawet będe mógł się nimi podzielić ze współpracownikami.”.

Istnieje publiczne repozytorium NuGet, ale z pewnością nie chcemy tam umieszczać prywatnych rzeczy (przynajmniej do czasu kiedy zdecydujemy się opublikować wyniki naszej ciężkiej pracy).

Dostępne rozwiązania hostujące repozytoria działają tylko na platformie Windows, a hosting Windowsowy do najtańszych nie należy. Własnego rozwiązania w np. PHP pisać nam sie nie chce. Jak więc sobie z tym poradzić? Dzięki temu, że ktoś wykonał kawałek dobrej roboty i pomyślał, repozytorium NuGet możemy mieć w postaci katalogu z paczkami .nupkg.

Takie repozytorium możemy synchronizować za pomocą Git dla przykładu.

Zanim przystąpimy do pracy musimy zaopatrzyć się w potrzebne narzędzia. Poza instalacja rozszerzenia NuGet do Visual Studio 2010, które począwszy od dodatku Service Pack 1 zainstalowane jest domyślnie, musimy zaopatrzyć się w narzędzie linii poleceń dostepne na stronie projektu, które przyda się do tworzenia paczek.

Zatem do dzieła – stwórzmy i skonfigurujmy repozytorium. Zakładam, że nasze repozytiurm będzie współdzielone pomiędzy kilka osób, zatem gdzieś na dedykowanym serwerze tworzymy puste, współdzielone repozytorium (ja posiłkuję się po stronie serwerowej technologią okołopingwinową, więc takiej będę się tu trzymał). Dla ustalenia uwagi przyjmijmy, że lokalnie repozytorium będzie znajdować się w katalogu D:\Packages. Na serwerze, gdzie hostujemy repozytoria, tworzymy nowe, a następnie klonujemy do wspomnianego katalogu. Katalog ten następnie dodajemy w Visual Studio:

Dodajemy nowe repozytorium wprowadzając nazwę oraz lokalizację na dysku lokalnym:

Repozytorium skonfigurowane. Pozostaje tylko je czymś wypełnić.

Zanim przystąpimy do tworzenia biblioteki musimy wykonać dwa kroki wstępne:

  • Do zmiennej systemowej PATH dodać scieżkę do sciągniętego uprzednio pliku NuGet.exe
  • Zdefiniować zmienna systemowa PACKAGESDIR (dla przykładu), która będzie wskazywać katalog docelowy na tworzone paczki.
Zmienną PACKAGESDIR wprowadzamy, aby uniknąć kodowania na sztywno w opcjach projektu lokalizacji docelowej. Dzięki temu prostemu zabiegowi uzyskujemy elastyczność, a każdy członek zespołu może mieć repozytorium gdzie chce.
W Visual Studio tworzymy nowy projekt – dla przykładu bibliotekę. W opcjach projektu dodajemy następujący kod jako Post Build Event:

cd $(ProjectDir)

NuGet.exe pack $(ProjectFileName) -OutputDirectory $(PACKAGESDIR) -Properties Configuration=Release

W pliku AssemblyInfo.cs dodajemy co najmniej takie atrybuty:

[assembly: AssemblyTitle("SampleLibrary")]
[assembly: AssemblyDescription("SampleLibrary")]
[assembly: AssemblyCompany("ACME")]
[assembly: AssemblyProduct("SampleLibrary")]
[assembly: AssemblyCopyright("Copyright © ACME 2011")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Po zapisaniu zmian i przekompilowaniu projektu, w katalogu D:\Packages pojawi się nowa paczka. W powyższym przykładzie opis paczki oraz podstawowe informacje o niej pobierane są z pliku projektu. Jeżeli zależy nam na większej kontroli, możemy utworzyć dla projektu plik .nuspec z dokładną specyfikacją paczki. Szczegóły formatu znajdziecie w dokumentacji projektu NuGet.

Po poprawnej kompilacji możemy zweryfikować, czy paczka jest dostępna. Z menu kontekstowego gałęzi References wybieramy opcję umożliwiającą dodanie referencji do paczki:

Jak widać na załączonym obrazku, nowo utworzona paczka jest gotowa do instalacji:

Pamiętajmy, aby po utworzeniu paczek zsynchronizować repozytorium Git. Inni niech też coś z tego mają :)

Jeżeli paczki w repozytorium odświeżają się częściej niż ich numery wersji, istnieje konieczność ich ponownego pobrania. Z pudełka nie dostajemy obecnie nic, co by mogło nam w tym pomóc. Po chwili googlania możemy jednak znaleźć potrzebne narzędzie.

Przedstawione rozwiązanie to najprostszy przypadek jaki można sobie wyobrazić. NuGet posiada wiele opcji, z których można skorzystać, aby utworzyć paczki dostosowane do własnych potrzeb. Zachęcam do zagłębienia się w szczegóły. Naprawdę warto!

Proste pogaduchy między procesami, czyli coś lekkiego o .NET Remoting i WCF

Przyznam szczerze, że dotychczas z komunikacją między różnymi aplikacjami lub ich warstwami spotykałem się głownie w aspekcie usługowo-webowym. Taki scenariusz sprowadza się do takiego a nie innego wykorzystania webservice lub pochodnego ustrojstwa. Co jednak można zastosować jeżeli chcemy aby dwie nasze aplikacje miały możliwość pogadania ze sobą na lokalnej maszynie?

Continue reading

Templated Controls a pomroczność jasna

Dzisiejszego pięknego i powtórnie zimowego dnia zaszła potrzeba stworzenia kontrolki, która miałaby dwa wzorce zawartości: nagłowek i ciało. Wszystko szło pięknie. Stworzyłem sobie kontenery do wzorców, odpowiednią kontrolke i wszystkie inne potrzebne rzeczy. Gdy jednak przyszło do wykorzystania okazało się, że kontrolki umieszczone wewnątrz wzorców nie mają odwołać w pliku designera, ani nie są dostępne „globalnie” na stronie. Jakby nie patrzeć całkiem normalne zachwoanie tego typu zwierza, do jakiego mogliśmy przyzyczaić się korzystając z DataGrid, Repeater i innych tego typu ustrojstw.

Continue reading

Google eBooks wystartowało

No to się doczekaliśmy… Google odpaliło własną książkową machinę. Na dobry początek dostępne jest – bagatela – 3 mln tytułów. Dostępne niestety w US. Poza krainą Wuja Sama dostępne są publikacje z domeny publicznej. Jak pisze Google, negocjują z wydawcami.

Kolejny gracz na rynku, ciekawe czy w rzeczywistości taki otwarty jak mówi :)

Zachęcam do zapoznania się z notką na oficjalnym blogu Googla, oraz do odwiedzenia samej księgarni.

Konferencja DevDay Łódź 2010

W imieniu swoim i Łódzkiej Grupy Profesjonalistów IT & .NET oraz sponsorów mam zaszczyt zaprosić Was na konferencję DevDay, która odbędzie się 4. grudnia 2010 w Arterionie przy ul. Rewolucji 1905r. 82.

Przygotowaliśmy dla Was kilka interesujących sesji oraz konkurs, w którym można wygrać nowiutkiego Xbox’a z Kinectem :)

Zapraszam na stronę konferencji, gdzie możecie zapoznać się ze szczegółami oraz zarejestrować się na wydarzenie.

Dodatkowo zachęcam do odwiedzenia strony konferencji na Facebooku :)

IT na miękko

Już w najbliższy czwartek 21 października 2010 odbędzie się kolejne spotkanie Łódzkiej Grupy Profesjonalistów IT & .NET. Tym razem czeka nas spotkanie wyjątkowe, gdyż ani jedna sesja nie będzie sesją techniczną.

Zaplanowaliśmy dla Was dwie sesje z gatunku miękkich. Obie jednak skierowane są dla środowiska IT. Dzięki uprzejmości Sandry Rogalskiej pracującej w firmie Modis Polska Sp. z.o.o. jako IT Recruiter, która poprowadzi dwie sesje („Rozmowa kwalifikacyjna” oraz „Profesjonalne CV programisty/informatyka„) dowiemy się m.in:

  • Jak przygotować się do rozmowy kwalifikacyjnej.
  • Jak poprowadzić profesjonalną autoprezentację.
  • Co to jest mowa ciała i jakie ma znaczenie.
  • Jak powinno wyglądać CV, co powinno zawierać, a czego nie warto w nim umieszczać.
  • Jakie błędy najczęściej popełniane są przy tworzeniu CV i jak ich unikać.
  • Jak tworzyć CV w odpowiedzi na konkretną ofertę.

Zapraszam wszystkich serdecznie w dniu 21 października 2010 o godzinie 18:00 do Centrum Komputerowego ZETO. Przypominam, iż wymagana jest wcześniejsza rejestracja na spotkanie.

Do zobaczenia!

Wolność dla konopi?

Ostatnio trochę medialnego szumu powstało wokół Marszu Wyzwolenia Konopi jaki odbył się dziś w Warszawie. Pierwotnie pojawiła się w prasie (o ile dobrze pamiętam w Gazecie Wybiórczej) informacja, że władze Miasta Stołecznego Warszawy nie wydały zgody na organizację marszu, po czym marsz się odbył. Gdy usłyszałem o braku przyzwolenia do zorganizowania tego wydarzenia, pomyślałem – hipokryci (władze). No bo w czym taki marsz jest gorszy od Parady Równości dla przykładu? W wolnym kraju każdy ma prawo zamanifestować swoje poglądy (pomijając faszyzm, stalinizm i inne zabronione z uzasadnionych względów).

Continue reading

Kilka drobnostek które sprawią, że będziecie kodować lepiej (w C#)

Tym razem chciałbym zwrócić Waszą uwagę na serię artykułów autorstwa Jammes’a Michael’a, w których opisuje kilka cech języka C#, które sprawią, że będziecie kodować czytelniej i efektywniej. Zachęcam wszystkich do lektury.

Cykl składa się z trzech części: