Rozdział z książki Visual Studio Tworzenie aplikacji Windows w języku C# Helion 2018

Podobne dokumenty
Zaawansowane aplikacje internetowe - laboratorium

Instrukcja instalacji oprogramowania dla środowiska Windows

Użytkowanie PortableGit w systemie Windows. 1. Najważniejsze informacje

Załącznik 1 instrukcje instalacji

Informatyka I : Tworzenie projektu

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Przewodnik instalacji i rozpoczynania pracy. dla DataPage+ 2012

Instrukcja użytkownika

Przewodnik instalacji i rozpoczynania pracy. Dla DataPage+ 2013

MATERIAŁY - udostępnianie materiałów dydaktycznych w sieci SGH

Programowanie niskopoziomowe

LINUX. Instalacja oprogramowania

Zmiana logo. Dziękujemy za wybór naszych rozwiązań. apjoo od Apláuz. Wspólnie przebrniemy przez proces konfiguracji strony www i wstawiania treści.

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

Załącznik 1 instrukcje instalacji

Wprowadzenie do biblioteki klas C++

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Tworzenie pliku źródłowego w aplikacji POLTAX2B.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

5.2. Pierwsze kroki z bazami danych

Gra-zabawka dla niemowląt przygotowana z użyciem w Unity 3D

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

Instalacja i konfiguracja SAS PC Files Server

MS Word Długi dokument. Praca z długim dokumentem. Kinga Sorkowska

Instrukcja obsługi certyfikatów w programie pocztowym MS Outlook Express 5.x/6.x

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Instrukcja użytkownika

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

Currenda EPO Instrukcja Konfiguracji. Wersja dokumentu: 1.3

Instalowanie VHOPE i plików biblioteki VHOPE

1. Od czego zacząć? - Instalacja środowiska pracy

Nowe notowania epromak Professional

Wczytywanie cenników z poziomu programu Norma EXPERT Tworzenie własnych cenników w programie Norma EXPERT... 4

Instalacja i konfiguracja IIS-a na potrzeby dostępu WEB do aplikacji Wonderware InTouch Machine Edition

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

APLIKACJA SHAREPOINT

1. Instalacja platformy.net Framework.

Generatory pomocy multimedialnych

Scenariusz lekcji. Scenariusz lekcji 1 TEMAT LEKCJI: 2 CELE LEKCJI: 2.1 Wiadomości: 2.2 Umiejętności: 3 METODY NAUCZANIA: 4 ŚRODKI DYDAKTYCZNE:

Instrukcja dotycząca konwersji dokumentów LaTeX do plików w formacie RTF

ApSIC Xbench: Szybki start wydanie Mariusz Stępień

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

[1/15] Chmury w Internecie. Wady i zalety przechowywania plików w chmurze

Procedura wczytania danych sprawozdawczych za I kw 2006 z systemu BudzetST II do systemu

Tworzenie szablonów użytkownika

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Procedura aktualizacji systemu TelkomBud. dla serwera DBfC w wersji 4.x

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Windows

Instrukcja dostępu do usługi Google Scholar

Instalacja NOD32 Remote Administrator

Pobieranie edytora CodeLite

Wysyłka wniosko w ZUS - EKS. Instrukcja użytkownika aplikacji Wysyłka wniosków ZUS EKS

Narzędzia podnoszące jakość procesu wytwarzania i wdrażania

Podstawy technologii WWW

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED

Wstęp. Skąd pobrać program do obsługi FTP? Logowanie

Podręcznik instalacji i konfiguracji aplikacji 7 Office Ship Control dla Microsoft Office 2007 i Siódemka S.A. Warszawa, dnia r.

4. Certyfikaty dla pracy w systemie WOW w miejscu z siecią Internet UWAGA

DOKUMENTY I GRAFIKI. Zarządzanie zawartością Tworzenie folderu Dodawanie dokumentu / grafiki Wersje plików... 7

Edytor materiału nauczania

jest dostępne na różne systemy operacyjne. Niniejsza instrukcja opisuje podstawowe operacje i opcje niezbędne do rozpoczęcia pracy w tym programie.

Aplikacje WWW - laboratorium

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Nagrywamy podcasty program Audacity

ZSBD ćwiczenie 4. Obiektowe systemy zarządzania bazą danych. Przygotowanie środowiska pracy. Wymagania: ZSBD ćwiczenie 4

Włączanie/wyłączanie paska menu

OMNITRACKER Wersja testowa. Szybki przewodnik instalacji

Dokumentacja Administratora portalu. aplikacji. Wirtualna szkoła

Przewodnik instalacji i rejestracji ASN RadioOS

Klient poczty elektronicznej - Thunderbird

Problemy techniczne SQL Server

Instrukcja programu ESKUP

Wprowadzenie do narzędzia MAVEN

Opis instalacji programu Scratch

Continuous Integration z ClickOnce

Archiwizacja baz MSSQL /BKP_SQL/ opis oprogramowania

CMS- kontakty (mapa)

Wikispaces materiały szkoleniowe

Instalacja i opis podstawowych funkcji programu Dev-C++

Instrukcja użytkownika aplikacji npodpis r.

Kadry Optivum, Płace Optivum

finiownia loginów. W zależności od ustawionej opcji użytkownik login:

Przewodnik... Tworzenie Landing Page

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Wprowadzenie do Doctrine ORM

Program współpracuje z : Windows XP, Powerdraft 2004, v8, XM, Microstation 2004, v8, XM.

HELIOS pomoc społeczna

ZPKSoft WDoradca. 1. Wstęp 2. Architektura 3. Instalacja 4. Konfiguracja 5. Jak to działa 6. Licencja

Zadanie1: Odszukaj w serwisie internetowym Wikipedii informacje na temat protokołu http.

Issuu publikowanie dokumentów w sieci

16) Wprowadzenie do raportowania Rave

elektroniczna Platforma Usług Administracji Publicznej

Wprowadzanie danych organizacyjnych szkoły

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

W kolejnym etapie wypełniamy wszystkie pola formularza (rys. 3) potrzebne do utworzenia konta pocztowego

Rozkłady zajęć- notatki

Platformy Programowania

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Instrukcja instalacji systemu. CardioScan 10, 11 i 12

Transkrypt:

Pakiety NuGet Rozdział z książki Visual Studio 2017. Tworzenie aplikacji Windows w języku C# Helion 2018 1 Pakiety NuGet pozwalają na łatwe dzielenie się kodem z innymi programistami. Mechanizm ten nie przewiduje opłat, ale możliwe jest ustalenie warunków licencji. Witryna głównego repozytorium znajduje się pod adresem http://nuget.org 2. Umożliwia przeglądanie i pobieranie pakietów, choć te czynności łatwiej wykonać korzystając z klienta wbudowanego w Visual Studio (w tej książce wykorzystywaliśmy go już wielokrotnie). Tylko poprzez stronę można natomiast wysyłać do serwisu utworzone przez siebie pakiety. Pakiety NuGet, czyli pliki z rozszerzeniem.nupkg to tak naprawdę archiwa ZIP zawierające opis pakietu oraz pliki binarne np. biblioteki DLL. Te ostatnie umieszczone są w podkatalogu lib. Rysunek B.1. pokazuje zawartość przykładowego pakietu, którą łatwo można obejrzeć w Windows, jeżeli zmienimy rozszerzenie pliku pakietu na.zip. Rysunek B.1. Zawartość pakietu NuGet Samo tworzenie pakietów NuGet zostało doskonale rozwiązane w Visual Studio 2017, ale tylko dla projektów przeznaczonych dla platformy.net Standard. Wystarczy w ustawieniach takiego projektu, na zakładce Package zaznaczyć pole opcji Generate NuGet package on build, aby pakiet został utworzony w momencie kompilacji projektu. Nie wymaga to żadnych dodatkowych narzędzi. Ten pakiet można następnie uploadować na stronie nuget.org. W przypadku innych platform, w tym UWP i.net, już nie jest to tak wygodne 3. Instalacja nuget.exe Aby stworzyć pakiet dla platformy.net, należy zainstalować NuGet Command-Line Interpreter (w skrócie NuGet CLI) 4, który można pobrać ze strony https://www.nuget.org/downloads. Visual Studio już od wersji 2012 1 Dziękuję studentom Krystianowi Jabłońskiemu oraz Marcinowi Burakowi za zebranie informacji dotyczących tworzenia pakietów NuGet. 2 Możliwe jest też lokalne przechowywanie pakietów NuGet (lokalne repozytorium Visual Studio), a nawet własny hosting pakietów. 3 Strona MSDN zawierająca informacje o tworzeniu pakietów NuGet to https://docs.microsoft.com/en-us/nuget/createpackages/creating-a-package 4 Istnieją dwa narzędzia: NuGet CLI i.net Core 2.0 CLI. Nas interesuje to pierwsze. Drugie przeznaczone jest dla.net Core.

zawiera NuGet Package Manager, ale bez pliku nuget.exe, który jest wymagany do tworzenia własnych pakietów. Po wejściu na powyższą stronę, należy pobrać najnowszą rekomendowaną wersję pliku nuget.exe. W kwietniu 2018 roku była to wersja 4.6.2. Co ciekawe, pobiera się bezpośrednio plik wykonywalny, który nie jest instalatorem zamiast uruchamiać, należy go wobec tego zapisać, a katalog, w którym go zapisaliśmy dodać do ścieżki przeszukiwania. Dzięki temu będzie można go uruchamiać z linii poleceń bez specjalnych zabiegów. Ja zapisałem go do katalogu c:\exe\nuget CLI. Następnie dodałem ten katalog do zmiennej środowiskowej PATH (rysunek B.2). Rysunek B.2. Modyfikowanie zmiennej środowiskowej PATH Tworzenie pakietu z projektu biblioteki klas Uruchommy Visual Studio i wczytajmy dowolny projekt biblioteki DLL klas dla platformy.net. Ja użyłem projektu biblioteki JacekMatulewski.WpfUtils, która zawiera różne fragmenty kodu opisane w tej książce, w tym klasę Font, klasę okien dialogowych, RelayCommand itp. 5. Warto zmniejszyć wersję platformy.net, dla której przeznaczona jest biblioteka, żeby jak najbardziej poszerzyć krąg odbiorców. W moim przypadku jest to.net Framework 4.5. Należy również uzupełnić opis projektu (pozwala na to przycisk Assembly Information... w ustawieniach projektu) te dane posłużą do stworzenia opisu paczki. Następnie zadbajmy o to, żeby przebudować projekt w trybie Release tak, żebyśmy na pewno udostępniali najnowszą wersję kodu. Kolejną czynnością jest utworzenie pliku.nuspec z opisem paczki, który również jej zawartość. Aby go utworzyć należy przejść do katalogu projektu (katalog, w którym jest plik.csproj) i uruchomić w nim wiersz poleceń (rysunek B.3). Następnie wpisujemy polecenie nuget spec JacekMatulewski.WpfUtils.csproj (nazwa projektu może być oczywiście inna) 6. W efekcie utworzony zostanie plik JacekMatulewski.WpfUtils.nuspec. Następnie możemy spróbować wykonać polecenie nuget pack JacekMatulewski.WpfUtils.csproj, ale w moim przypadku zakończyło się to błędem (rysunek B.3). Do utworzenia paczki wymagane jest bowiem określenie autora i opisu projektu. Jeżeli zajrzymy do pliku.nuspec (to plik w formacie XML), zobaczymy, że dane te powinny być pobierane z projektu. Jeżeli to się nie udało, a jest to błąd, który na forach jest często przywoływany, otrzymujemy właśnie taki błąd. 5 Kod źródłowy tej biblioteki dołączony jest do kodów źródłowych tej książki. 6 Warta wspomnienia jest możliwość wykonania tej czynności również na skompilowanym pliku DLL.

Rysunek B.3. Częsty błąd podczas tworzenia paczki Najprostszym rozwiązaniem jest wstawienie w odpowiednich znacznikach pliku.nuspec właściwych wartości bez odwoływania do danych odczytanych z projektu (listing B.1). Przy okazji należy uzupełnić lub skasować linie dotyczące licencji, czy opisu wydania. Listing B.1. Ręcznie zmodyfikowany plik.nuspec <?xml version="1.0"?> <package > <metadata> <id>$id$</id> <version>$version$</version> <title>$title$</title> <authors>jacek Matulewski</authors> <owners>$author$</owners> <licenseurl>http://license_url_here_or_delete_this_line</licenseurl> <projecturl>http://www.fizyka.umk.pl/~jacek</projecturl> <iconurl>http://www.fizyka.umk.pl/~jacek/index.ico</iconurl> <requirelicenseacceptance>false</requirelicenseacceptance> <description>some useful code from the book by Jacek Matulewski</description> <releasenotes>summary of changes made in this release of the package.</releasenotes> <copyright>copyright Jacek Matulewski 2018</copyright> <tags>wpf Utils</tags> </metadata> </package> Po wprowadzeniu zmian, ponówmy polecenie nuget pack JacekMatulewski.WpfUtils.csproj. Tym razem utworzenie paczki powinno się udać. W efekcie powstanie plik ZIP, ale z rozszerzeniem.nupkg (druga próba pakowania widoczna na rysunku B.1), w którym w podkatalogu lib/net45/ znajduje się biblioteka DLL.

Publikacja pakietu Kolejnym krokiem jest opublikowanie pakietu. Otwórzmy w przeglądarce stronę http://nuget.org. Publikowanie pakietów wymaga zarejestrowania w serwisie można się jednak zalogować korzystając z istniejącego konta Microsoft. Po potwierdzeniu adresu e-mail, należy przejść na zakładkę Upload. Możemy plik pakietu przeciągnąć na widoczne na tej stronie pole tekstowe (działa w Chrome, ale nie działa w Edge) lub klikając przycisk Browse... wybrać plik korzystając ze standardowego okna dialogowego. Następnie warto przejrzeć wyświetlone dane dotyczących pakietu, w tym adresy stron WWW, dodać tekst dokumentacji przygotowanej w języku Markdown 7 i jeżeli wszystko jest w porządku kliknąć przycisk Submit na dole strony. Pakiet nie zostanie od razu opublikowany, a wpierw będzie poddany procesowi automatycznej walidacji oraz indeksowania. W moim przypadku walidacja zajęła tylko 3 minuty, ale pakiet został zindeksowany, co jest warunkiem umożliwiającym jego wyszukanie w serwisie, dopiero po kilkudziesięciu minutach. Zasięg odbiorców jest ogromny nawet tak nierozpoznawalny kod po jednym dniu został pobrany dwadzieścia parę razy. Rysunek B.5. Umieszczanie pakietów w serwisie nuget.org Opublikowanego pakietu nie można usunąć z serwera. Można go jednak ukryć z wyników wyszukiwania. Zawsze pozostanie jednak możliwość ręcznej instalacji z konsoli. 7 Można ją wygenerować automatycznie na podstawie komentarzy w kodzie. Pozwala na to rozszerzenie do Visual Studio o nazwie Markdown Editor.

Test pakietu Aby przetestować nowododany do repozytorium pakiet, stwórzmy nowy projekt aplikacji WPF, najlepiej w nowym rozwiązaniu. Jeżeli pakiet został już zindeksowany możemy uruchomić wyszukiwarkę pakietów NuGet korzystając z polecenia Manage NuGet Packages... dostępnego w menu kontekstowym projektu w oknie Solution Explorer. Jeżeli nie z menu Tools, NuGet Package Manager wybierzmy pozycję Package Manager Console i wpiszmy w niej polecenie Install-Package JacekMatulewski.WpfUtils -Version 1.0.0 (oczywiście nazwa pakietu i numer wersji odnosi się tylko do powyższego przykładu). Korzystając z konsoli zwróćmy uwagę, na rzecz którego projektu wykonywane są polecenia. Decyduje o tym pozycja w rozwijanej liście Default project w górnej części podokna konsoli. Po chwili nasz pakiet zostanie zainstalowany w bieżącym projekcie. Możemy to zweryfikować sprawdzając, czy odwołanie do biblioteki znajduje się w gałęzi References w podoknie Solution Explorer. Od tego momentu możemy korzystać z klas zdefiniowanych w bibliotece np. tworząc instancję klasy Font lub wykorzystując znaczniki okien dialogowych. Zależności między pakietami Biblioteka JacekMatulewski.WpfUtils nie zależy od żadnych bibliotek spoza platformy.net. Dlatego po umieszczeniu jej w pakiecie NuGet, nie trzeba określać żadnych zależności względem innych pakietów. Inaczej będzie w przypadku biblioteki JacekMatulewski.WpfUtils.DialogControls, która odwołuje się do klas z biblioteki JacekMatulewski.WpfUtils. Zacznijmy od stworzenia dla tego projektu pliku.nuspec. Służy do tego polecenie nuget spec JacekMatulewski.WpfUtils.DialogControls.csproj. Następnie plik ten należy uzupełnić, podobnie jak miało to miejsce w przykładzie opisanym powyżej (listing B.2). Dodatkowo, aby określić zależności między pakietami, do znacznika metadata wstawiamy znacznik dependencies, w którym w znaczniku dependency wskazujemy identyfikatory pakietów od których zależy bieżący projekt. Żadne zależności nie zostaną dopisane automatycznie, nawet jeżeli projekt odwołuje się do innych bibliotek z tego samego rozwiązania. Następnie tworzymy pakiet poleceniem nuget pack JacekMatulewski.WpfUtils.DialogControls.csproj. Listing B.2. Uzupełniony plik opisu pakietu <?xml version="1.0"?> <package > <metadata> <id>$id$</id> <version>$version$</version> <title>$title$</title> <authors>jacek Matulewski</authors> <owners>$author$</owners> <projecturl>http://www.fizyka.umk.pl/~jacek</projecturl> <iconurl>http://www.fizyka.umk.pl/~jacek/index.ico</iconurl> <requirelicenseacceptance>false</requirelicenseacceptance> <description>some useful code from the book by Jacek Matulewski</description> <copyright>copyright Jacek Matulewski 2018</copyright> <tags>wpf Utils Dialog Controls</tags> <dependencies> <dependency id="jacekmatulewski.wpfutils" version="1.0.0" /> </dependencies> </metadata> </package> Dzięki tak określonym zależnościom, podczas instalacji pakietu JacekMatulewski.WpfUtils.DialogControls, automatycznie zainstalowany zostanie także pakiet JacekMatulewski.WpfUtils (rysunek B.6).

Rysunek B.6. Informacja o instalowanych pakietach przez NuGet Package Manager Warto zwrócić uwagę na narzędzie NuGet Package Explorer, które ułatwia edycję plików.nuspec. Dostępne jest na stronie https://github.com/nugetpackageexplorer. Tworzenie pakietu z zestawem bibliotek Czy zamiast tworzyć osobną bibliotekę JacekMatulewski.WpfUtils.DialogControls zależną od JacekMatulewski.WpfUtils, nie można by tej drugiej biblioteki dołączyć do tej pierwszej i dystrybuować obie w jednym pakiecie? Oczywiście, że można, choć nie zawsze to jest dobre rozwiązanie. Pewnie nie warto tworzyć wielkich zbiorów bibliotek, ale zdecydowanie warto łączyć te, które ściśle ze sobą współpracują. Nie można niestety tworzyć pakietów dla całych rozwiązań, co byłoby wygodne, można jednak dodawać biblioteki do jednego pakietu. Aby przetestować tę możliwość, wróćmy do folderu projektu JacekMatulewski.WpfUtils i jeszcze raz zmodyfikujmy plik.nuspec. Przede wszystkim, jeżeli chcemy nowy pakiet opublikować, należy zmienić wersję pakietu. A następnie do znacznika package (nie do metadata) dodajemy znacznik files widoczny na przykładzie z listingu B.3. Po instalacji takiego pakietu, w gałęzi References zobaczymy obie biblioteki. Listing B.3. Plik.nuspec z dodatkowymi plikami bibliotek <?xml version="1.0"?> <package > <metadata> <id>$id$</id> <version>1.0.1</version> <title>$title$</title> <authors>jacek Matulewski</authors> <owners>$author$</owners> <projecturl>http://www.fizyka.umk.pl/~jacek</projecturl> <iconurl>http://www.fizyka.umk.pl/~jacek/index.ico</iconurl> <requirelicenseacceptance>false</requirelicenseacceptance> <description>some useful code from book by Jacek Matulewski</description> <copyright>copyright Jacek Matulewski 2018</copyright>

<tags>wpf Utils</tags> </metadata> <files> <file src="..\jacekmatulewski.wpfutils.dialogcontrols\bin\release\jacekmatulewski.wpfutils.dia logcontrols.dll" target="lib\net45" /> </files> </package> Pakiet dla wielu platform W obecnej wersji pakietu, w jego podkatalogu lib znajduje się tylko jeden katalog o nazwie net45, co oznacza że pakiet zawiera skompilowane pliki przeznaczone dla platformy.net 4.5. Możemy jednak przygotować i umieścić w jednym pakiecie biblioteki dla kilku platform. Podczas instalacji pakietu w projekcie wyodrębniane są tylko te części pakietu, które są zgodne z typem projektu i tylko one trafiają do katalogu z wynikiem kompilacji. Jako przykładu użyję zbioru projektów implementujących wzorce projektowe Kompozyt (drzewo z cyklami) i Odwiedzający. Bazą dla nich jest biblioteka PCL, która przeznaczona jest dla platformy.net 4.5, ASP.NET Core 1.0, Windows 8 (i automatycznie Windows 10) oraz różnych odmian Xamarin. Oprócz tego stworzyłem osobne projekty, które przeznaczone są dla platformy.net 3.5 Client Profile,.NET Core 2.0 oraz.net Standard 2.0 (rysunek B.6), ale w nich niemal wszystkie pliki są podlinkowane do plików z projektu PCL. Wszystkie te cztery projekty dzielą wspólną przestrzeń nazw JacekMatulewski.Collections i w efekcie ich kompilacji powstają pliki o takiej samej nazwie JacekMatulewski.Collections.Composite.dll. Poza tym jest jeszcze projekt JacekMatulewski.CompositeNetXmlHelper przeznaczony dla platformy.net 4.5, który zawiera metody rozszerzające, które nie mogły być umieszczone w projekcie PCL (związane z zapisem kolekcji do pliku). Rysunek B.6. Okno rozwiązania Spróbujmy utworzyć pakiet NuGet o nazwie JacekMatulewski.Collections.Composite, który zawiera zarówno bibliotekę PCL, jak również jej wersję dla platformy.net 3.5 8. Sporym problemem jest znalezienie właściwych nazw podkatalogów katalogu lib prawidłowo identyfikujących poszczególne platformy. Problem ten szczególnie 8 Pakietów dla.net Core i.net Standard nie zbudujemy tym samym narzędziem. Pierwsza platforma ma własne narzędzie, a druga wbudowane w Visual Studio (zob. opis wyżej).

dotyczy biblioteki PCL, dlatego to dla tego projektu utworzymy początkowy plik.nuspec, dzięki czemu nazwa folderu dla tej biblioteki będzie ustalana automatycznie (właściwa nazwa to lib\portable45-net45+win8). Sposób dołączenia do pakietu różnych wersji biblioteki jest zasadniczo taki sam, jak opisany wyżej przepis na umieszczanie w pakiecie wielu bibliotek DLL, tj. należy dodać do pliku.nuspec odpowiednie znaczniki file. Tym razem różnić je będą nie tylko ścieżki do plików bibliotek DLL, ale także foldery w pakiecie podawane w atrybucie target. W przypadku opisywanego projektu zmodyfikowany plik.nuspec z dodanymi znacznikami powinien wyglądać tak, jak przykład pokazany na listingu B.4. Listing B.4. Plik opisujący pakiet z dwoma wersjami biblioteki i biblioteką pomocniczą <?xml version="1.0"?> <package > <metadata> <id>jacekmatulewski.collections.composite_</id> <version>1.0.1</version> <title>jacek</title> <authors>jacek Matulewski</authors> <owners>jacek Matulewski</owners> <projecturl>http://www.fizyka.umk.pl/download/nuget.html</projecturl> <iconurl>http://www.fizyka.umk.pl/~jacek/index.ico</iconurl> <requirelicenseacceptance>false</requirelicenseacceptance> <description>composite (with cycles) and Visitor design patters implemented together with wrapper implementing IEnumerable interface</description> <releasenotes></releasenotes> <copyright>(c) Jacek Matulewski 2018</copyright> <tags>composite Tree Cycles Collection Visitor</tags> </metadata> <files> <file src="..\compositenet\bin\release\jacekmatulewski.collections.composite.dll" target="lib\net35-client" /> <file src="..\compositenetxmlhelper\bin\release\jacekmatulewski.collections.compositexmlhelper.dll" target="lib\net45" /> </files> </package>