MsBuild .props i .targets w pakiecie

Oprócz bardziej tradycyjnych zestawów pakiety NuGet mogą czasami dodawać niestandardowe obiekty docelowe kompilacji lub właściwości do projektów korzystających z tego pakietu. Można to osiągnąć, dodając prawidłowy plik MSBuild w formularzu <package_id>.targets lub <package_id>.props (na przykład Contoso.Utility.UsefulStuff.targets) w folderach kompilacji projektu.

Foldery kompilacji

W miarę rozwoju narzędzia NuGet różne foldery kompilacji .props i .targets zostały dodane.

Folder Wersja narzędzia NuGet Używanie
build 2.5+ Tworzenie logiki dla każdej struktury projektu.
buildMultiTargeting 4.0+ Logika kompilacji outer build dla projektów przeznaczonych dla wielu platform. Tylko funkcja PackageReference.
buildTransitive 5.0+ Tworzenie logiki dla zasobów, które przepływają przechodnio do dowolnego projektu zużywanego. Zobacz stronę funkcji. Tylko funkcja PackageReference.

Folder kompilacji specyficzny dla platformy

Wszystkie 3 foldery kompilacji są zgodne z tym samym wzorcem, aby decydować o najbardziej odpowiednim pliku na podstawie struktury docelowej projektu.

Pliki w głównym folderze build/<package_id>.targets kompilacji i build/<package_id>.props są uważane za odpowiednie dla wszystkich platform docelowych.

Aby udostępnić pliki specyficzne dla platformy, najpierw umieść je w odpowiednich podfolderach, takich jak:

    \build
        \netstandard1.4
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets
        \net462
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets

Preferuj używanie folderów kompilacji specyficznych dla platformy zawsze, gdy jest to odpowiednie, aby uniknąć fałszywie dodatnich instalacji w projektach, które mogą nie być obsługiwane przez pakiet.

Należy pamiętać, że jeśli pakiet nie ma żadnych plików w lib folderze lub ref i tylko pliki w ramach określonego folderu kompilacji platformy, ten pakiet zostanie uznany za zgodny ze wszystkimi projektami. Aktualne wersje narzędzi pakietu zgłaszają ostrzeżenie NU5127 podczas tworzenia takich pakietów.

Projekty korzystające z pakietów z plikami kompilacji

Projekty PackageReference

.props i .targets nie są dodawane do pliku projektu, ale zamiast tego są udostępniane za pomocą poleceń {projectName}.nuget.g.targets i {projectName}.nuget.g.props. Te pliki są generowane automatycznie po uruchomieniu przywracania.

Gdy projekt jest przeznaczony dla więcej niż jednej platformy, importy do tych plików są warunkowe w nazwie platformy docelowej.

Program MSBuild .props i .targets pliki przeznaczone dla wielu platform docelowych można umieścić w folderze \buildMultiTargeting . Po wygenerowaniu importu ustawiono warunek, że właściwość $(TargetFramework) MSBuild jest pusta.

packages.config projects (projekty packages.config)

Gdy program NuGet instaluje pakiet z plikami \build , dodaje elementy MSBuild <Import> w pliku projektu wskazującym pliki .targets i .props . (.props jest dodawany w górnej części pliku projektu; .targets jest dodawany u dołu). Dla każdej platformy docelowej jest dodawany oddzielny warunkowy element MSBuild <Import> .

Tworzenie pakietów za pomocą rekwizytów i elementów docelowych programu MSBuild

Do uwzględnienia programu MSBuild .props i .targets pakietu można użyć dowolnego z poniższych narzędzi.

Wskazówki dotyczące zawartości rekwizytów i elementów docelowych programu MSBuild

Narzędzie NuGet nie ogranicza sposobu tworzenia .props i .targets ponieważ będzie się różnić w zależności od potrzeb autora pakietu i samych projektów docelowych.

Istnieje kilka rzeczy, które nie mogą być wykonywane w pakietach i .props.targets, takich jak nie określanie właściwości i elementów, które mają wpływ na przywracanie, ponieważ zostaną one automatycznie wykluczone.

  • Niektóre przykłady właściwości, których nie można dodać ani zaktualizować: TargetFramework, TargetFrameworkMoniker, TargetPlatformMoniker, AssetTargetFallback itp.

  • Niektóre przykłady elementów, których nie można dodać ani zaktualizować: PackageReference, PackageVersion, PackageDownload itp.