Dela via


Skapa ett NuGet-paket med MSBuild

När du skapar ett NuGet-paket från koden paketeras funktionen till en komponent som kan delas med och användas av valfritt antal andra utvecklare. I den här artikeln beskrivs hur du skapar ett paket med HJÄLP av MSBuild. MSBuild är förinstallerat med varje Visual Studio-arbetsbelastning som innehåller NuGet. Dessutom kan du använda MSBuild via dotnet CLI med dotnet msbuild.

För .NET Core- och .NET Standard-projekt som använder SDK-format och andra SDK-projekt använder NuGet information direkt i projektfilen för att skapa ett paket. För ett icke-SDK-liknande projekt som använder <PackageReference>använder NuGet även projektfilen för att skapa ett paket.

SDK-liknande projekt har paketfunktionerna tillgängliga som standard. För PackageReference-projekt i icke-SDK-format är det också tillgängligt som standard från och med Visual Studio 2026. I tidigare versioner av Visual Studio måste du lägga till NuGet.Build.Tasks.Pack-paketet i projektberoendena och vi rekommenderar att du tar bort den här paketreferensen när du uppgraderar till Visual Studio 2026. Detaljerad information om MSBuild-paketmål finns i NuGet-paket och återställning som MSBuild-mål.

För SDK-liknande projekt msbuild -t:pack är det funktionellt likvärdigt med dotnet pack.

Viktigt!

Det här avsnittet gäller för SDK-liknande projekt, vanligtvis .NET Core- och .NET Standard-projekt, och för icke-SDK-liknande projekt som använder PackageReference.

Ange egenskaper

Följande egenskaper krävs för att skapa ett paket.

  • PackageId, paketidentifieraren, som måste vara unik i galleriet som är värd för paketet. Om det inte anges är AssemblyNamestandardvärdet .
  • Version, ett specifikt versionsnummer i formatet Major.Minor.Patch[-Suffix] där -Suffix identifierar förhandsversioner. Om det inte anges är standardvärdet 1.0.0.
  • Paketrubriken som den ska visas på webbplatsen (till exempel nuget.org)
  • Authors, information om författare och ägare. Om det inte anges är AssemblyNamestandardvärdet .
  • Company, företagets namn. Om det inte anges är AssemblyNamestandardvärdet .

Om du packar icke-SDK-liknande projekt som använder PackageReference krävs följande:

  • PackageOutputPath, utdatamappen för paketet som genererades när paketet anropades.

I Visual Studio kan du ange dessa värden i projektegenskaperna (högerklicka på projektet i Solution Explorer, välj Egenskaper och välj fliken Paket ). Du kan också ange dessa egenskaper direkt i projektfilerna (.csproj).

<PropertyGroup>
  <PackageId>ClassLibDotNetStandard</PackageId>
  <Version>1.0.0</Version>
  <Authors>your_name</Authors>
  <Company>your_company</Company>
</PropertyGroup>

Viktigt!

Ge paketet en identifierare som är unik för nuget.org eller vilken paketkälla du använder.

I följande exempel visas en enkel, fullständig projektfil med de här egenskaperna inkluderade.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <PackageId>ClassLibDotNetStandard</PackageId>
    <Version>1.0.0</Version>
    <Authors>your_name</Authors>
    <Company>your_company</Company>
  </PropertyGroup>
</Project>

Du kan också ange de valfria egenskaperna, till exempel Title, PackageDescriptionoch PackageTags, enligt beskrivningen i MSBuild-paketmål, Kontrollera beroendetillgångar och NuGet-metadataegenskaper.

Anmärkning

För paket som skapats för offentlig förbrukning bör du vara särskilt uppmärksam på egenskapen PackageTags , eftersom taggar hjälper andra att hitta ditt paket och förstå vad det gör.

Mer information om hur du deklarerar beroenden och anger versionsnummer finns i Paketreferenser i projektfiler och Paketversionshantering. Det är också möjligt att visa tillgångar från beroenden direkt i paketet med hjälp av attributen <IncludeAssets> och <ExcludeAssets> . Mer information finns i Kontrollera beroendetillgångar.

Lägg till ett valfritt beskrivningsfält

Paketets valfria beskrivning visas på fliken README på paketets nuget.org sida. Beskrivningen hämtas från <Description> i projektfilen eller $description i .nuspec-filen.

I följande exempel visas en Description i .csproj-filen för ett .NET-paket:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>Azure.Storage.Blobs</PackageId>
    <Version>12.4.0</Version>
    <PackageTags>Microsoft Azure Storage Blobs;Microsoft;Azure;Blobs;Blob;Storage;StorageScalable</PackageTags>
    <Description>
      This client library enables working with the Microsoft Azure Storage Blob service for storing binary and text data.
      For this release see notes - https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/README.md and https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/CHANGELOG.md
      in addition to the breaking changes https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/BreakingChanges.txt
      Microsoft Azure Storage quickstarts and tutorials - https://free.blessedness.top/azure/storage/
      Microsoft Azure Storage REST API Reference - https://free.blessedness.top/rest/api/storageservices/
      REST API Reference for Blob Service - https://free.blessedness.top/rest/api/storageservices/blob-service-rest-api
    </Description>
  </PropertyGroup>
</Project>

Välj en unik paketidentifierare och ange versionsnumret

Paketidentifieraren och versionsnumret identifierar unikt den exakta kod som finns i paketet.

Följ dessa metodtips för att skapa paketidentifieraren:

  • Identifieraren måste vara unik för nuget.org och alla andra platser som är värdar för paketet. För att undvika konflikter är ett bra mönster att använda företagets namn som den första delen av identifieraren.

  • Följ en .NET-namnområdesliknande namngivningskonvention med hjälp av punkt notation. Använd till exempel Contoso.Utility.UsefulStuff i stället Contoso-Utility-UsefulStuff för eller Contoso_Utility_UsefulStuff. Det är också användbart för konsumenter om du matchar paketidentifieraren med det namnområde som koden använder.

  • Om du skapar ett paket med exempelkod som visar hur du använder ett annat paket lägger du .Sample till i identifieraren, som i Contoso.Utility.UsefulStuff.Sample.

    Exempelpaketet har ett beroende av det ursprungliga paketet. När du skapar exempelpaketet lägger du till <IncludeAssets> med värdet contentFiles . I innehållsmappen ordnar du exempelkoden i en mapp med namnet \Samples\<identifier>, till exempel \Samples\Contoso.Utility.UsefulStuff.Sample.

Följ dessa metodtips för att ange paketversionen:

  • I allmänhet anger du paketversionen så att den matchar projektet eller sammansättningsversionen, även om detta inte är absolut nödvändigt. Det är enkelt att matcha versionen när du begränsar ett paket till en enda sammansättning. NuGet hanterar paketversioner när du löser beroenden, inte sammansättningsversioner.

  • Om du använder ett icke-standardversionsschema bör du överväga NuGet-versionsreglerna enligt beskrivningen i Paketversionshantering. NuGet är mestadels semantisk version 2.0.0-kompatibel.

Anmärkning

Mer information om beroendematchning finns i Beroendematchning med PackageReference. Information som kan hjälpa dig att förstå versionshantering finns i den här serien med blogginlägg:

Konfigurera projekt för packning

SDK-projekt kräver ingen ytterligare konfiguration.

Icke-SDK-projekt behöver antingen minst ett paket installerat (via PackageReference, inte packages.config), eller så måste projektet uttryckligen instruera NuGet att behandla projektet som ett PackageReference-projekt via RestoreProjectStyle egenskapen .

Visual Studio 2022 och tidigare har inget inbyggt paket, så du måste också installera NuGet.Build.Tasks.Pack-paketet. När du uppgraderar till Visual Studio 2026 eller senare rekommenderar vi att du avinstallerar paketet så att du kan dra nytta av nya funktioner och felkorrigeringar.

  1. Redigera projektfilen.

    Om du uttryckligen vill instruera NuGet att behandla projektet som PackageReference (projektet har inga paket installerade) letar du upp eller lägger till en <PropertyGroup> som inte har någon Condition -instruktion och lägger till:

    <PropertyGroup>
      <!-- other properties -->
      <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
      <!-- more properties are allowed -->
    </PropertyGroup>
    

    Om du använder Visual Studio 2022 eller tidigare lägger du till följande efter elementet <PropertyGroup> :

    <ItemGroup>
      <!-- ... -->
      <PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.14.0" PrivateAssets="all" />
      <!-- ... -->
    </ItemGroup>
    
  2. Öppna en kommandotolk för utvecklare ( I sökrutan skriver du Kommandotolken Utvecklare).

    Du vill vanligtvis starta Utvecklarkommandotolken för Visual Studio från Start menyn, eftersom den konfigureras med alla nödvändiga sökvägar för MSBuild.

  3. Växla till mappen som innehåller projektfilen och skriv följande kommando för att återställa NuGet.Build.Tasks.Pack-paketet.

    # Uses the project file in the current folder by default
    msbuild -t:restore
    

    Kontrollera att MSBuild-utdata anger att bygget har slutförts.

Kör kommandot msbuild -t:pack

Om du vill skapa ett NuGet-paket (en .nupkg fil) från projektet kör msbuild -t:pack du kommandot som också skapar projektet automatiskt:

I kommandotolken Utvecklare för Visual Studio skriver du följande kommando:

# Uses the project file in the current folder by default
msbuild -t:pack

Utdata visar sökvägen till .nupkg filen.

Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 8/5/2019 3:09:15 PM.
Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" on node 1 (pack target(s)).
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  ...
CopyFilesToOutputDirectory:
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.dll" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll".
  ClassLib_DotNetStandard -> C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb".
GenerateNuspec:
  Successfully created package 'C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\AppLogger.1.0.0.nupkg'.
Done Building Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" (pack target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.21

Generera paket automatiskt vid bygge

Om du vill köra msbuild -t:pack automatiskt när du skapar eller återställer projektet lägger du till följande rad i projektfilen i <PropertyGroup>:

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

När du kör msbuild -t:pack i en lösning paketerar detta alla projekt i lösningen som kan paketeras (egenskapen <IsPackable> är satt till true).

Anmärkning

När du genererar paketet automatiskt ökar tiden för att packa byggtiden för projektet.

Testpaketinstallation

Innan du publicerar ett paket vill du vanligtvis testa processen med att installera ett paket i ett projekt. Testerna ser till att filerna nödvändigtvis hamnar på rätt platser i projektet.

Du kan testa installationer manuellt i Visual Studio eller på kommandoraden med hjälp av de normala installationsstegen för paket.

Viktigt!

Paket är oföränderliga objekt. Om du korrigerar ett problem ändrar du innehållet i paketet och packar igen. När du testas igen använder du fortfarande den gamla versionen av paketet tills du rensar mappen med globala paket . Detta är särskilt relevant när du testar paket som inte använder en unik förhandsversionsetikett i varje version.

Nästa steg

När du har skapat ett paket, som är en .nupkg fil, kan du publicera det till det galleri som du väljer enligt beskrivningen i Publicera ett paket.

Du kanske också vill utöka funktionerna i ditt paket eller på annat sätt stödja andra scenarier enligt beskrivningen i följande avsnitt:

Slutligen finns det ytterligare pakettyper att känna till: