Udostępnij za pośrednictwem


NuGet pakowanie i przywracanie jako MSBuild miejsca docelowe

NuGet 4.0+

W formacie NuGet PackageReference 4.0 lub nowszym można przechowywać wszystkie metadane manifestu bezpośrednio w pliku projektu, zamiast używać oddzielnego .nuspec pliku.

Z MSBuild 15.1+ NuGet jest również obywatelem pierwszej klasy MSBuild z celami i restore zgodnie z pack poniższym opisem. Te obiekty docelowe umożliwiają pracę z NuGet innymi zadaniami lub obiektami MSBuild docelowymi. Aby uzyskać instrukcje dotyczące tworzenia NuGet pakietu przy użyciu programu MSBuild, zobacz Tworzenie NuGet pakietu przy użyciu polecenia MSBuild. (Dla NuGet W wersji 3.x i starszej używasz poleceń pakietu i przywracania za pośrednictwem interfejsu NuGet wiersza polecenia.

Kolejność kompilowania obiektów docelowych

Ponieważ pack i restore są obiektami MSBuild docelowymi, możesz uzyskać do nich dostęp, aby ulepszyć przepływ pracy. Załóżmy na przykład, że chcesz skopiować pakiet do udziału sieciowego po jego spakowaniu. Możesz to zrobić, dodając następujące polecenie w pliku projektu:

<Target Name="CopyPackage" AfterTargets="Pack">
  <Copy
    SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
    DestinationFolder="\\myshare\packageshare\"
    />
</Target>

Podobnie możesz napisać MSBuild zadanie, napisać własny element docelowy i korzystać z NuGet właściwości w zadaniu MSBuild .

Uwaga

$(OutputPath) parametr jest względny i oczekuje, że uruchamiasz polecenie z poziomu katalogu głównego projektu.

element docelowy pakietu

W przypadku projektów platformy .NET, które używają formatu, przy użyciu PackageReference polecenia msbuild -t:pack pobiera dane wejściowe z pliku projektu do użycia podczas tworzenia NuGet pakietu.

W poniższej tabeli opisano MSBuild właściwości, które można dodać do pliku projektu w pierwszym <PropertyGroup> węźle. Te zmiany można łatwo wprowadzić w programie Visual Studio 2017 lub nowszym, klikając projekt prawym przyciskiem myszy i wybierając polecenie Edytuj {project_name} w menu kontekstowym. Dla wygody tabela jest zorganizowana według równoważnej właściwości w .nuspec pliku.

Uwaga

Owners właściwości i Summary z .nuspec programu nie są obsługiwane za pomocą polecenia MSBuild.

Atrybut/nuspec wartość MSBuild Własność Wartość domyślna Uwagi
Id PackageId $(AssemblyName) $(AssemblyName) z MSBuild
Version PackageVersion Wersja Jest to zgodne ze standardem semver, na przykład 1.0.0, 1.0.0-betalub 1.0.0-beta-00345. Wartość domyślna to Version , jeśli nie jest ustawiona.
VersionPrefix VersionPrefix empty Zastępowanie ustawień PackageVersionVersionPrefix
VersionSuffix VersionSuffix empty Zastępowanie ustawień PackageVersionVersionSuffix
Authors Authors Nazwa użytkownika bieżącego użytkownika Rozdzielana średnikami lista autorów pakietów zgodna z nazwami profilów w witrynie nuget.org. Są one wyświetlane w galerii w nugetwitrynie NuGet .org i są używane do odsyłania pakietów przez tych samych autorów.
Owners Nie dotyczy Nie ma w nuspec
Title Title $(PackageId) Przyjazny dla człowieka tytuł pakietu, zwykle używany w interfejsie użytkownika jest wyświetlany jako w witrynie nuget.org i Menedżer pakietów w programie Visual Studio.
Description Description "Opis pakietu" Długi opis zestawu. Jeśli PackageDescription nie zostanie określona, ta właściwość jest również używana jako opis pakietu.
Copyright Copyright empty Szczegóły praw autorskich dla pakietu.
RequireLicenseAcceptance PackageRequireLicenseAcceptance false Wartość logiczna określająca, czy klient musi monitować użytkownika o zaakceptowanie licencji pakietu przed zainstalowaniem pakietu.
license PackageLicenseExpression empty Odpowiada .<license type="expression"> Zobacz Pakowanie wyrażenia licencji lub pliku licencji.
license PackageLicenseFile empty Ścieżka do pliku licencji w pakiecie, jeśli używasz licencji niestandardowej lub licencji, która nie ma przypisanego identyfikatora SPDX. Należy jawnie spakować plik licencji, do którego się odwołujesz. Odpowiada .<license type="file"> Zobacz Pakowanie wyrażenia licencji lub pliku licencji.
LicenseUrl PackageLicenseUrl empty PackageLicenseUrl jest przestarzały. Użyj polecenia PackageLicenseExpression lub PackageLicenseFile zamiast tego.
ProjectUrl PackageProjectUrl empty
Icon PackageIcon empty Ścieżka do obrazu w pakiecie do użycia jako ikona pakietu. Należy jawnie spakować plik obrazu ikony, do której się odwołujesz. Aby uzyskać więcej informacji, zobacz Pakowanie pliku obrazu ikony i icon metadanych.
IconUrl PackageIconUrl empty PackageIconUrljest przestarzały na rzecz .PackageIcon Jednak w celu uzyskania najlepszego środowiska obniżania poziomu należy określić PackageIconUrl oprócz PackageIconelementu .
Readme PackageReadmeFile empty Należy jawnie spakować przywołyany plik readme.
Tags PackageTags empty Rozdzielana średnikami lista tagów, która wyznacza pakiet.
ReleaseNotes PackageReleaseNotes empty Informacje o wersji pakietu.
Repository/Url RepositoryUrl empty Adres URL repozytorium używany do klonowania lub pobierania kodu źródłowego. Przykład: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
Repository/Type RepositoryType empty Typ repozytorium. Przykłady: git (ustawienie domyślne), tfs.
Repository/Branch RepositoryBranch empty Informacje o gałęzi repozytorium opcjonalne. RepositoryUrl należy również określić, aby ta właściwość została uwzględniona. Przykład: master (NuGet 4.7.0+).
Repository/Commit RepositoryCommit empty Opcjonalne zatwierdzenie repozytorium lub zestaw zmian wskazujące źródło, względem którego utworzono pakiet. RepositoryUrl należy również określić, aby ta właściwość została uwzględniona. Przykład: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
PackageType <PackageType>CustomType1, 1.0.0.0;CustomType2</PackageType> Wskazuje zamierzone użycie pakietu. Typy pakietów używają tego samego formatu co identyfikatory pakietów i są rozdzielane przez ;element . Typy pakietów mogą być wersjonowane przez dołączenie ciągu , i Version . Zobacz Ustawianie NuGet typu pakietu (NuGet 3.5.0+).
Summary Nieobsługiwane

pakuj docelowe dane wejściowe

Właściwości opis
IsPackable Wartość logiczna określająca, czy projekt można spakować. Domyślna wartość to true.
SuppressDependenciesWhenPacking Ustaw wartość na , aby true pominąć zależności pakietów z wygenerowanego NuGet pakietu.
PackageVersion Określa wersję, którą będzie miał wynikowy pakiet. Akceptuje wszystkie formy NuGet ciągu wersji. Wartość domyślna to , $(Version)czyli właściwość Version w projekcie.
PackageId Określa nazwę wynikowego pakietu. Jeśli nie zostanie określony, pack operacja będzie domyślnie używać AssemblyName nazwy katalogu lub jako nazwy pakietu.
PackageDescription Długi opis pakietu dla wyświetlania interfejsu użytkownika.
Authors Rozdzielana średnikami lista autorów pakietów zgodna z nazwami profilów w witrynie nuget.org. Są one wyświetlane w galerii w nugetwitrynie NuGet .org i są używane do odsyłania pakietów przez tych samych autorów.
Description Długi opis zestawu. Jeśli PackageDescription nie zostanie określona, ta właściwość jest również używana jako opis pakietu.
Copyright Szczegóły praw autorskich dla pakietu.
PackageRequireLicenseAcceptance Wartość logiczna określająca, czy klient musi monitować użytkownika o zaakceptowanie licencji pakietu przed zainstalowaniem pakietu. Wartość domyślna to false.
DevelopmentDependency Wartość logiczna określająca, czy pakiet jest oznaczony jako zależność tylko do programowania, która uniemożliwia dołączanie pakietu jako zależność w innych pakietach. W przypadku PackageReference elementu (NuGet 4.8 lub nowszego) ta flaga oznacza również, że zasoby czasu kompilacji są wykluczone z kompilacji. Aby uzyskać więcej informacji, zobacz DevelopmentDependency support for PackageReference (Obsługa współzależności dla elementu PackageReference).
PackageLicenseExpression Identyfikator lub wyrażenie licencji SPDX, na przykład Apache-2.0. Aby uzyskać więcej informacji, zobacz Pakowanie wyrażenia licencji lub pliku licencji.
PackageLicenseFile Ścieżka do pliku licencji w pakiecie, jeśli używasz licencji niestandardowej lub licencji, która nie ma przypisanego identyfikatora SPDX.
PackageLicenseUrl PackageLicenseUrl jest przestarzały. Użyj polecenia PackageLicenseExpression lub PackageLicenseFile zamiast tego.
PackageProjectUrl
PackageIcon Określa ścieżkę ikony pakietu względem katalogu głównego pakietu. Aby uzyskać więcej informacji, zobacz Pakowanie pliku obrazu ikony.
PackageReleaseNotes Informacje o wersji pakietu.
PackageReadmeFile Plik Readme dla pakietu.
PackageTags Rozdzielana średnikami lista tagów, która wyznacza pakiet.
PackageOutputPath Określa ścieżkę wyjściową, w której spakowany pakiet zostanie porzucony. Wartość domyślna to $(OutputPath).
IncludeSymbols Ta wartość logiczna wskazuje, czy pakiet powinien utworzyć dodatkowy pakiet symboli podczas pakowania projektu. Format pakietu symboli jest kontrolowany przez SymbolPackageFormat właściwość . Aby uzyskać więcej informacji, zobacz IncludeSymbols.
IncludeSource Ta wartość logiczna wskazuje, czy proces pakietu powinien utworzyć pakiet źródłowy. Pakiet źródłowy zawiera kod źródłowy biblioteki, a także pliki PDB. Pliki źródłowe są umieszczane src/ProjectName w katalogu w wynikowym pliku pakietu. Aby uzyskać więcej informacji, zobacz IncludeSource.
PackageType
IsTool Określa, czy wszystkie pliki wyjściowe są kopiowane do folderu tools zamiast folderu lib . Aby uzyskać więcej informacji, zobacz IsTool.
RepositoryUrl Adres URL repozytorium używany do klonowania lub pobierania kodu źródłowego. Przykład: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
RepositoryType Typ repozytorium. Przykłady: git (ustawienie domyślne), tfs.
RepositoryBranch Informacje o gałęzi repozytorium opcjonalne. RepositoryUrl należy również określić, aby ta właściwość została uwzględniona. Przykład: master (NuGet 4.7.0+).
RepositoryCommit Opcjonalne zatwierdzenie repozytorium lub zestaw zmian wskazujące źródło, względem którego utworzono pakiet. RepositoryUrl należy również określić, aby ta właściwość została uwzględniona. Przykład: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
SymbolPackageFormat Określa format pakietu symboli. Jeśli "symbols.nupkg" zostanie utworzony starszy pakiet symboli z rozszerzeniem .symbols.nupkg zawierającym pliki PDB, BIBLIOTEKi DLL i inne pliki wyjściowe. Jeśli "snupkg", zostanie utworzony pakiet symboli snupkg zawierający przenośne pliki PDB. Wartość domyślna to "symbols.nupkg".
NoPackageAnalysis Określa, że pack nie należy uruchamiać analizy pakietów po utworzeniu pakietu.
MinClientVersion Określa minimalną wersję NuGet klienta, który może zainstalować ten pakiet, wymuszany przez nuget.exe i program Visual Studio Menedżer pakietów.
IncludeBuildOutput Ta wartość logiczna określa, czy zestawy wyjściowe kompilacji powinny być pakowane do pliku nupkg , czy nie.
IncludeContentInPack Ta wartość logiczna określa, czy wszystkie elementy, które mają typ Content , są automatycznie uwzględniane w wynikowym pakiecie. Wartość domyślna to true.
BuildOutputTargetFolder Określa folder, w którym mają być umieszczane zestawy wyjściowe. Zestawy wyjściowe (i inne pliki wyjściowe) są kopiowane do odpowiednich folderów struktury. Aby uzyskać więcej informacji, zobacz Zestawy wyjściowe.
ContentTargetFolders Określa domyślną lokalizację miejsca, w którym mają być używane wszystkie pliki zawartości, jeśli PackagePath nie są dla nich określone. Wartość domyślna to "content; contentFiles". Aby uzyskać więcej informacji, zobacz Dołączanie zawartości w pakiecie.
NuspecFile Względna lub bezwzględna ścieżka do pliku używanego .nuspec do pakowania. Jeśli zostanie określony, jest używany wyłącznie do tworzenia informacji o opakowaniu, a żadne informacje w projektach nie są używane. Aby uzyskać więcej informacji, zobacz Pakowanie przy użyciu elementu .nuspec.
NuspecBasePath Ścieżka podstawowa .nuspec pliku. Aby uzyskać więcej informacji, zobacz Pakowanie przy użyciu elementu .nuspec.
NuspecProperties Rozdzielona średnikami lista par key=value. Aby uzyskać więcej informacji, zobacz Pakowanie przy użyciu elementu .nuspec.

scenariusze pakietów

Pomijanie zależności

Aby pominąć zależności pakietów z wygenerowanego NuGet pakietu, ustaw wartość SuppressDependenciesWhenPacking , na true którą będzie zezwalać pomijanie wszystkich zależności z wygenerowanego pliku nupkg.

PackageIconUrl

PackageIconUrl jest przestarzały na rzecz PackageIcon właściwości . NuGet Począwszy od wersji 5.3 i Visual Studio 2019 w wersji 16.3, zgłasza ostrzeżenie NU5048, pack jeśli metadane pakietu określają PackageIconUrltylko wartość .

PackageIcon

Napiwek

Aby zachować zgodność z poprzednimi wersjami z klientami i źródłami, które jeszcze nie obsługują PackageIconprogramu , określ wartości i PackageIcon PackageIconUrl. Program Visual Studio obsługuje PackageIcon pakiety pochodzące ze źródła opartego na folderach.

Pakowanie pliku obrazu ikony

Podczas pakowania pliku obrazu ikony użyj PackageIcon właściwości , aby określić ścieżkę pliku ikony względem katalogu głównego pakietu. Ponadto upewnij się, że plik jest uwzględniony w pakiecie. Rozmiar pliku obrazu jest ograniczony do 1 MB. Obsługiwane formaty plików obejmują pliki JPEG i PNG. Zalecamy rozdzielczość obrazu 128x128.

Na przykład:

<PropertyGroup>
    ...
    <PackageIcon>icon.png</PackageIcon>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="images\icon.png" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

Przykład ikona pakietu.

Aby zapoznać się z nuspec odpowiednikiem, zapoznaj nuspec się z odwołaniem do ikony.

PackageReadmeFile

Obsługiwane w NuGet wersji 5.10.0 (wersja zapoznawcza 2.NET / SDK 5.0.300 i nowsze)

Podczas pakowania pliku readme należy użyć PackageReadmeFile właściwości , aby określić ścieżkę pakietu względem katalogu głównego pakietu. Oprócz tego należy się upewnić, że plik znajduje się w pakiecie. Obsługiwane formaty plików obejmują tylko język Markdown (md).

Na przykład:

<PropertyGroup>
    ...
    <PackageReadmeFile>readme.md</PackageReadmeFile>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="docs\readme.md" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

Aby zapoznać się z odpowiednikiem nuspec , zapoznaj nuspec się z odwołaniem do pliku readme.

Zestawy wyjściowe

nuget packkopiuje pliki wyjściowe z rozszerzeniami .exe, , .xml.dll, .winmd, .json, i .pri. Skopiowane pliki wyjściowe zależą od tego, co MSBuild zapewnia element docelowy BuiltOutputProjectGroup .

Istnieją dwie MSBuild właściwości, których można użyć w pliku projektu lub wierszu polecenia, aby kontrolować miejsce, w którym przechodzą zestawy wyjściowe:

  • IncludeBuildOutput: wartość logiczna określająca, czy zestawy wyjściowe kompilacji powinny być uwzględnione w pakiecie.
  • BuildOutputTargetFolder: określa folder, w którym powinny zostać umieszczone zestawy wyjściowe. Zestawy wyjściowe (i inne pliki wyjściowe) są kopiowane do odpowiednich folderów struktury.

Odwołania do pakietu

Zobacz Odwołania do pakietów w plikach projektu.

Odwołania projektu do projektu

Odwołania projektu do projektu są domyślnie traktowane jako NuGet odwołania do pakietów. Na przykład:

<ProjectReference Include="..\UwpLibrary2\UwpLibrary2.csproj"/>

Do dokumentacji projektu można również dodać następujące metadane:

<IncludeAssets>
<ExcludeAssets>
<PrivateAssets>

Dołączanie zawartości do pakietu

Aby dołączyć zawartość, dodaj dodatkowe metadane do istniejącego <Content> elementu. Domyślnie wszystkie elementy typu "Zawartość" są dołączane do pakietu, chyba że zastąpisz wpisy podobne do następujących:

<Content Include="..\win7-x64\libuv.txt">
 <Pack>false</Pack>
</Content>

Domyślnie wszystko jest dodawane do katalogu głównego content folderu i contentFiles\any\<target_framework> w pakiecie i zachowuje względną strukturę folderów, chyba że określisz ścieżkę pakietu:

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles\</PackagePath>
</Content>

Jeśli chcesz skopiować całą zawartość tylko do określonych folderów głównych (zamiast content i contentFiles obu), możesz użyć MSBuild właściwości ContentTargetFolders, która domyślnie ma wartość "content; contentFiles", ale można ustawić na inne nazwy folderów. Należy pamiętać, że po prostu określenie wartości "contentFiles" w ContentTargetFolders pliku umieszcza pliki w obszarze contentFiles\any\<target_framework> lub contentFiles\<language>\<target_framework> na podstawie elementu buildAction.

PackagePath może być rozdzielonym średnikami zestawem ścieżek docelowych. Określenie pustej ścieżki pakietu spowoduje dodanie pliku do katalogu głównego pakietu. Na przykład następujące polecenie dodaje libuv.txt element do content\myfileselementu , content\samplesi katalog główny pakietu:

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles;content\sample;;</PackagePath>
</Content>

Istnieje również MSBuild właściwość , która domyślnie ma wartość $(IncludeContentInPack)true. Jeśli ta wartość jest ustawiona false na dowolny projekt, zawartość z tego projektu nie jest uwzględniona w pakiecie nuget .

Inne metadane specyficzne dla pakietu, które można ustawić dla dowolnego z powyższych elementów, obejmują <PackageCopyToOutput> zestawy <PackageFlatten> CopyToOutput i Flatten wartości we contentFiles wpisie w danych wyjściowych nuspec.

Uwaga

Oprócz elementów <Pack> zawartości można również ustawić metadane i <PackagePath> na plikach za pomocą akcji kompilacji Compile, EmbeddedResource, ApplicationDefinition, Page, Resource, SplashScreen, DesignData, DesignDataWithDesignTimeCreateableTypes, CodeAnalysisDictionary, AndroidAsset, AndroidResource, BundleResource lub None.

Aby pakiet dołączał nazwę pliku do ścieżki pakietu podczas używania wzorców symboli globbingowych, ścieżka pakietu musi kończyć się znakiem separatora folderu, w przeciwnym razie ścieżka pakietu jest traktowana jako pełna ścieżka wraz z nazwą pliku.

IncludeSymbols

W przypadku korzystania z programu MSBuild -t:pack -p:IncludeSymbols=trueodpowiednie pliki są kopiowane wraz z innymi plikami wyjściowymi (.dll, .exe, , .winmd.xml, , ). .pri.json.pdb Należy pamiętać, że ustawienie IncludeSymbols=true tworzy zwykły pakiet i pakiet symboli.

IncludeSource

Jest to takie samo jak IncludeSymbols, z tą różnicą, że kopiuje pliki źródłowe wraz z plikami .pdb . Wszystkie pliki typu Compile są kopiowane w celu src\<ProjectName>\ zachowania struktury folderów ścieżki względnej w wynikowym pakiecie. Dzieje się tak samo również w przypadku plików źródłowych, ProjectReference które mają TreatAsPackageReference ustawioną wartość false.

Jeśli plik typu Kompiluj, znajduje się poza folderem projektu, to właśnie został dodany do src\<ProjectName>\elementu .

Pakowanie wyrażenia licencji lub pliku licencji

W przypadku korzystania z wyrażenia licencji użyj PackageLicenseExpression właściwości . Aby zapoznać się z przykładem, zobacz przykładowe wyrażenie licencji.

<PropertyGroup>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>

Aby dowiedzieć się więcej na temat wyrażeń licencji i licencji akceptowanych przez NuGetfirmę .org, zobacz metadane licencji.

Podczas pakowania pliku licencji użyj PackageLicenseFile właściwości , aby określić ścieżkę pakietu względem katalogu głównego pakietu. Ponadto upewnij się, że plik jest uwzględniony w pakiecie. Na przykład:

<PropertyGroup>
    <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
</PropertyGroup>

<ItemGroup>
    <None Include="licenses\LICENSE.txt" Pack="true" PackagePath=""/>
</ItemGroup>

Aby zapoznać się z przykładem, zobacz Przykładowy plik licencji.

Uwaga

Jednocześnie można określić tylko jedną z PackageLicenseExpressionwartości , PackageLicenseFilei PackageLicenseUrl .

Pakowanie pliku bez rozszerzenia

W niektórych scenariuszach, takich jak podczas pakowania pliku licencji, możesz chcieć dołączyć plik bez rozszerzenia. Ze względów NuGet historycznych i MSBuild traktuj ścieżki bez rozszerzenia jako katalogi.

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
    <PackageLicenseFile>LICENSE</PackageLicenseFile>
  </PropertyGroup>

  <ItemGroup>
    <None Include="LICENSE" Pack="true" PackagePath=""/>
  </ItemGroup>  

Plik bez przykładu rozszerzenia.

IsTool

W przypadku korzystania z programu MSBuild -t:pack -p:IsTool=truewszystkie pliki wyjściowe określone w scenariuszu Zestawy wyjściowe są kopiowane do tools folderu zamiast lib folderu. Należy pamiętać, że różni się to od parametru określonego DotNetCliTool przez ustawienie w PackageType pliku ..csproj

Pakowanie przy użyciu .nuspec pliku

Mimo że zaleca się dołączenie wszystkich właściwości , które zazwyczaj znajdują się w .nuspec pliku w pliku projektu, można zamiast tego użyć .nuspec pliku do spakowania projektu. W przypadku projektu w stylu innego niż ZESTAW SDK, który używa PackageReferenceprogramu , należy go zaimportować NuGet.Build.Tasks.Pack.targets , aby można było wykonać zadanie pakietu. Aby można było spakować nuspec plik, nadal trzeba przywrócić projekt. (Projekt w stylu zestawu SDK domyślnie zawiera elementy docelowe pakietu).

Struktura docelowa pliku projektu jest nieistotna i nie jest używana podczas pakowania pliku nuspec. Następujące trzy MSBuild właściwości mają zastosowanie do pakowania przy użyciu elementu .nuspec:

  1. NuspecFile: względna lub bezwzględna ścieżka do pliku używanego .nuspec do pakowania.
  2. NuspecProperties: rozdzielana średnikami lista par key=value. Ze względu na sposób MSBuild działania analizowania wiersza polecenia należy określić wiele właściwości w następujący sposób: -p:NuspecProperties="key1=value1;key2=value2".
  3. NuspecBasePath: ścieżka podstawowa .nuspec pliku.

Jeśli używasz dotnet.exe polecenia , aby spakować projekt, użyj polecenia podobnego do następującego:

dotnet pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

Jeśli używasz MSBuild polecenia , aby spakować projekt, użyj polecenia podobnego do następującego:

msbuild -t:pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

Należy pamiętać, że pakowanie nuspec obiektu przy użyciu dotnet.exe lub msbuild domyślnie prowadzi do kompilowania projektu. Można tego uniknąć, przekazując --no-build właściwość do dotnet.exe, która jest odpowiednikiem ustawienia w pliku projektu, wraz z ustawieniem <NoBuild>true</NoBuild> <IncludeBuildOutput>false</IncludeBuildOutput> w pliku projektu.

Przykładem pliku csproj do spakowania nuspec pliku jest:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NoBuild>true</NoBuild>
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <NuspecFile>PATH_TO_NUSPEC_FILE</NuspecFile>
    <NuspecProperties>add nuspec properties here</NuspecProperties>
    <NuspecBasePath>optional to provide</NuspecBasePath>
  </PropertyGroup>
</Project>

Zaawansowane punkty rozszerzenia do tworzenia dostosowanego pakietu

Obiekt docelowy pack udostępnia dwa punkty rozszerzenia, które działają w wewnętrznej, docelowej strukturze określonej kompilacji. Punkty rozszerzenia obsługują m.in. zawartość specyficzną dla platformy docelowej i zestawy do pakietu:

  • TargetsForTfmSpecificBuildOutput target: użyj polecenia dla plików wewnątrz lib folderu lub folderu określonego przy użyciu polecenia BuildOutputTargetFolder.
  • TargetsForTfmSpecificContentInPackage target: użyj polecenia dla plików spoza programu BuildOutputTargetFolder.

TargetsForTfmSpecificBuildOutput

Napisz obiekt docelowy niestandardowy i określ go jako wartość $(TargetsForTfmSpecificBuildOutput) właściwości. W przypadku wszystkich plików, które muszą przejść do biblioteki BuildOutputTargetFolder (domyślnie lib), obiekt docelowy powinien zapisać te pliki w grupie ItemGroup BuildOutputInPackage i ustawić następujące dwie wartości metadanych:

  • FinalOutputPath: ścieżka bezwzględna pliku; Jeśli nie zostanie podana, tożsamość zostanie użyta do oceny ścieżki źródłowej.
  • TargetPath: (Opcjonalnie) Ustaw, kiedy plik musi przejść do podfolderu w programie lib\<TargetFramework> , na przykład zestawy satelitarne, które przechodzą pod odpowiednie foldery kultury. Wartość domyślna to nazwa pliku.

Przykład:

<PropertyGroup>
  <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

<Target Name="GetMyPackageFiles">
  <ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)cs\$(AssemblyName).resources.dll">
        <TargetPath>cs</TargetPath>
    </BuildOutputInPackage>
  </ItemGroup>
</Target>

TargetsForTfmSpecificContentInPackage

Napisz obiekt docelowy niestandardowy i określ go jako wartość $(TargetsForTfmSpecificContentInPackage) właściwości. W przypadku wszystkich plików do uwzględnienia w pakiecie element docelowy powinien zapisać te pliki w grupie ItemGroup TfmSpecificPackageFile i ustawić następujące opcjonalne metadane:

  • PackagePath: ścieżka, w której plik powinien być wyjściowy w pakiecie. NuGet wyświetla ostrzeżenie, jeśli do tej samej ścieżki pakietu zostanie dodany więcej niż jeden plik.
  • BuildAction: Akcja kompilacji do przypisania do pliku jest wymagana tylko wtedy, gdy ścieżka pakietu znajduje się w folderze contentFiles . Wartość domyślna to "Brak".

Przykład:

<PropertyGroup>
  <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CustomContentTarget</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<Target Name="CustomContentTarget">
  <ItemGroup>
    <TfmSpecificPackageFile Include="abc.txt">
      <PackagePath>mycontent/$(TargetFramework)</PackagePath>
    </TfmSpecificPackageFile>
    <TfmSpecificPackageFile Include="Extensions/ext.txt" Condition="'$(TargetFramework)' == 'net46'">
      <PackagePath>net46content</PackagePath>
    </TfmSpecificPackageFile>  
  </ItemGroup>
</Target>  

element docelowy przywracania

MSBuild -t:restore (które nuget restore i dotnet restore używane z projektami platformy .NET Core) przywraca pakiety, do których odwołuje się plik projektu w następujący sposób:

  1. Odczytywanie wszystkich odwołań do projektu
  2. Odczytywanie właściwości projektu w celu znalezienia pośredniego folderu i platform docelowych
  3. Przekaż MSBuild dane do NuGet. Build.Tasks.dll
  4. Uruchamianie przywracania
  5. Pobieranie pakietów
  6. Zapisywanie plików, elementów docelowych i rekwizytów zasobów

Element docelowy restore działa dla projektów przy użyciu formatu PackageReference. MSBuild 16.5+ ma również możliwość zgody na packages.config format.

Uwaga

Element docelowy restore nie powinien być uruchamiany w połączeniu z obiektem build docelowym.

Przywracanie właściwości

Dodatkowe ustawienia przywracania mogą pochodzić z MSBuild właściwości w pliku projektu. Wartości można również ustawić z poziomu wiersza polecenia przy użyciu przełącznika -p: (zobacz przykłady poniżej).

Właściwości opis
RestoreSources Rozdzielana średnikami lista źródeł pakietów.
RestorePackagesPath Ścieżka folderu pakietów użytkowników.
RestoreDisableParallel Ogranicz pobieranie do jednego naraz.
RestoreConfigFile Ścieżka do Nuget.Config pliku do zastosowania.
RestoreNoHttpCache Jeśli wartość true, unika używania pakietów z pamięci podręcznej HTTP. Zobacz Zarządzanie pakietami globalnymi i folderami pamięci podręcznej.
RestoreIgnoreFailedSources Jeśli wartość true, ignoruje błędy lub brakujące źródła pakietów.
RestoreFallbackFolders Foldery rezerwowe używane w taki sam sposób, w jaki jest używany folder pakietów użytkownika.
RestoreAdditionalProjectSources Dodatkowe źródła do użycia podczas przywracania.
RestoreAdditionalProjectFallbackFolders Dodatkowe foldery rezerwowe do użycia podczas przywracania.
RestoreAdditionalProjectFallbackFoldersExcludes Wyklucza foldery rezerwowe określone w RestoreAdditionalProjectFallbackFolders
RestoreTaskAssemblyFile Ścieżka do NuGet.Build.Tasks.dll.
RestoreGraphProjectInput Rozdzielana średnikami lista projektów do przywrócenia, która powinna zawierać ścieżki bezwzględne.
RestoreUseSkipNonexistentTargets Gdy projekty są zbierane za pośrednictwem MSBuild niego, określają, czy są zbierane przy użyciu SkipNonexistentTargets optymalizacji. Jeśli nie zostanie ustawiona, wartość domyślna to true. Konsekwencją jest szybkie zachowanie, gdy nie można zaimportować elementów docelowych projektu.
MSBuildProjectExtensionsPath Folder wyjściowy, wartość domyślna BaseIntermediateOutputPath obj i folder.
RestoreForce W projektach opartych na elemencie PackageReference wymusza rozwiązanie wszystkich zależności, nawet jeśli ostatnie przywracanie zakończyło się pomyślnie. Określenie tej flagi jest podobne do usuwania project.assets.json pliku. Nie pomija to pamięci podręcznej http.
RestorePackagesWithLockFile Wyraża zgodę na użycie pliku blokady.
RestoreLockedMode Uruchom przywracanie w trybie zablokowanym. Oznacza to, że przywracanie nie będzie ponownie oceniane zależności.
NuGetLockFilePath Lokalizacja niestandardowa pliku blokady. Domyślna lokalizacja znajduje się obok projektu i nosi nazwę packages.lock.json.
RestoreForceEvaluate Wymusza przywrócenie, aby ponownie skompilować zależności i zaktualizować plik blokady bez żadnego ostrzeżenia.
RestorePackagesConfig Przełącznik z wyrażeniem zgody, który przywraca projekty przy użyciu pliku packages.config. Obsługa MSBuild -t:restore tylko.
RestoreRepositoryPath tylko packages.config. Określa katalog pakietów, do którego mają zostać przywrócone pakiety. SolutionDirectory będzie używany, jeśli nie zostanie określony.
RestoreUseStaticGraphEvaluation Przełącznik umożliwiający korzystanie z oceny wykresu MSBuild statycznego zamiast standardowej oceny. Ocena wykresu statycznego to funkcja eksperymentalna, która jest znacznie szybsza w przypadku dużych repozytoriów i rozwiązań.
RestoreUseLegacyDependencyResolver Rezygnacja z używania starszego narzędzia do rozpoznawania zależności. NuGetImplementacja rozpoznawania zależności została przepisana w wersji 6.12. Ten przełącznik wymusza zastosowanie poprzedniego algorytmu.

Właściwość ExcludeRestorePackageImports jest właściwością wewnętrzną używaną przez NuGetelement . Nie należy go modyfikować ani ustawiać w żadnych MSBuild plikach.

Przykłady

Wiersz polecenia:

msbuild -t:restore -p:RestoreConfigFile=<path>

Plik projektu:

<PropertyGroup>
    <RestoreIgnoreFailedSources>true</RestoreIgnoreFailedSources>
</PropertyGroup>

Przywracanie danych wyjściowych

Przywracanie tworzy następujące pliki w folderze kompilacji obj :

Plik opis
project.assets.json Zawiera wykres zależności wszystkich odwołań do pakietu.
{projectName}.projectFileExtension.nuget.g.props Odwołania do MSBuild props zawartych w pakietach
{projectName}.projectFileExtension.nuget.g.targets Odwołania do MSBuild obiektów docelowych zawartych w pakietach

Przywracanie i kompilowanie za pomocą jednego MSBuild polecenia

Ze względu na fakt, że NuGet można przywrócić pakiety, które obniżają MSBuild cele i rekwizyty, przywracanie i oceny kompilacji są uruchamiane z różnymi właściwościami globalnymi. Oznacza to, że następujące zachowanie będzie nieprzewidywalne i często niepoprawne.

msbuild -t:restore,build

Zamiast tego zalecane jest następujące podejście:

msbuild -t:build -restore

Ta sama logika ma zastosowanie do innych obiektów docelowych podobnych do build.

Przywracanie projektów PackageReference i packages.config za pomocą polecenia MSBuild

W wersji MSBuild 16.5 lub nowszej pliki packages.config są również obsługiwane dla programu msbuild -t:restore.

msbuild -t:restore -p:RestorePackagesConfig=true

Uwaga

packages.configPrzywracanie jest dostępne tylko w programie , a nie w przypadku MSBuild 16.5+dotnet.exe

Przywracanie przy użyciu MSBuild oceny wykresu statycznego

Uwaga

W wersji MSBuild 16.6 lub nowszej NuGet dodano funkcję eksperymentalną do używania statycznej oceny grafu z wiersza polecenia, która znacznie poprawia czas przywracania dla dużych repozytoriów.

msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true

Alternatywnie można ją włączyć, ustawiając właściwość w pliku Directory.Build.Props.

<Project>
  <PropertyGroup>
    <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>
  </PropertyGroup>
</Project>

Uwaga

Od wersji Visual Studio 2019.x i NuGet 5.x ta funkcja jest uznawana za eksperymentalną i opt-in. Aby uzyskać szczegółowe informacje na temat tego, kiedy ta funkcja zostanie domyślnie włączona, postępuj zgodnie z instrukcjami NuGet/Home#9803 .

Przywracanie wykresu statycznego zmienia msbuild część przywracania, odczyt i ocenę projektu, ale nie algorytm przywracania! Algorytm przywracania jest taki sam we wszystkich NuGet narzędziach (NuGet.exe, MSBuild.exe, dotnet.exe i Visual Studio).

W bardzo niewielu scenariuszach przywracanie statycznego grafu może zachowywać się inaczej niż w przypadku bieżącego przywracania, a niektóre zadeklarowane elementy PackageReferences lub ProjectReferences mogą brakować.

Aby złagodzić swój umysł, podczas jednorazowego sprawdzania, podczas migracji do przywracania statycznego grafu należy rozważyć uruchomienie:

msbuild.exe -t:restore -p:RestoreUseStaticGraphEvaluation=true
msbuild.exe -t:restore

NuGetnie powinien zgłaszać żadnych zmian. Jeśli widzisz rozbieżność, zgłoś problem w NuGet/Home.

Zastępowanie jednej biblioteki z grafu przywracania

Jeśli przywracanie przynosi niewłaściwy zestaw, można wykluczyć ten domyślny wybór pakietów i zastąpić go własnym wyborem. Najpierw przy użyciu najwyższego poziomu PackageReferencewyklucz wszystkie zasoby:

<PackageReference Include="Newtonsoft.Json" Version="9.0.1">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

Następnie dodaj własne odwołanie do odpowiedniej lokalnej kopii biblioteki DLL:

<Reference Include="Newtonsoft.Json.dll" />