Publicera .NET-appar med .NET CLI
Den här artikeln visar hur du kan publicera .NET-programmet från kommandoraden. .NET tillhandahåller tre sätt att publicera dina program. En ramverksberoende distribution skapar en plattformsoberoende .dll fil som använder den lokalt installerade .NET-körningen. Ramverksberoende körbar fil skapar en plattformsspecifik körbar fil som använder den lokalt installerade .NET-körningen. Fristående körbar fil skapar en plattformsspecifik körbar fil och innehåller en lokal kopia av .NET-körningen.
En översikt över dessa publiceringslägen finns i .NET-programdistribution.
Vill du ha snabb hjälp med att använda CLI? I följande tabell visas några exempel på hur du publicerar din app. Du kan ange målramverket med parametern -f <TFM>
eller genom att redigera projektfilen. Mer information finns i Grunderna för publicering.
Publiceringsläge | Command |
---|---|
Ramverksberoende distribution | dotnet publish -c Release -p:UseAppHost=false |
Ramverksberoende körbar fil | dotnet publish -c Release -r <RID> --self-contained false dotnet publish -c Release |
Fristående distribution | dotnet publish -c Release -r <RID> --self-contained true |
Kommentar
- Parametern
-c Release
krävs inte. Det tillhandahålls som en påminnelse om att publicera versionen av din app. - I .NET SDK 3.1 eller senare är den ramverksberoende körbara filen standardpubliceringsläget när du kör det grundläggande
dotnet publish
kommandot.
Grunderna för publicering
Inställningen <TargetFramework>
för projektfilen anger standardmålramverket när du publicerar din app. Du kan ändra målramverket till valfri giltig Target Framework Moniker (TFM). Om ditt projekt till exempel använder <TargetFramework>net8.0</TargetFramework>
skapas en binär fil som riktar sig mot .NET 8. TFM som anges i den här inställningen är standardmålet som används av dotnet publish
kommandot.
Om du vill rikta in dig på fler än ett ramverk kan du ange <TargetFrameworks>
inställningen till flera TFM-värden, avgränsade med ett semikolon. När du skapar din app skapas en version för varje målramverk. Men när du publicerar din app måste du ange målramverket med dotnet publish -f <TFM>
kommandot .
Standardläget BUILD-CONFIGURATION är Felsökning om det inte har ändrats med parametern -c
.
Standardutdatakatalogen för dotnet publish
kommandot är ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/
. Till exempel dotnet publish -c Release -f net8.0
publicerar till ./bin/Release/net8.0/publish/
. Du kan dock välja en förenklad utdatasökväg och mappstruktur för alla build-utdata. Mer information finns i Artefaktutdatalayout.
Inbyggda beroenden
Om din app har inbyggda beroenden kanske den inte körs på ett annat operativsystem. Om din app till exempel använder det interna Windows-API:et körs den inte på macOS eller Linux. Du skulle behöva tillhandahålla plattformsspecifik kod och kompilera en körbar fil för varje plattform.
Tänk också på att om ett bibliotek som du refererade till har ett inbyggt beroende kanske din app inte körs på alla plattformar. Det är dock möjligt att ett NuGet-paket som du refererar till har inkluderat plattformsspecifika versioner för att hantera nödvändiga interna beroenden åt dig.
När du distribuerar en app med inbyggda beroenden kan du behöva använda växeln dotnet publish -r <RID>
för att ange den målplattform som du vill publicera för. En lista över körningsidentifierare finns i RID-katalogen (Runtime Identifier).
Mer information om plattformsspecifika binärfiler finns i avsnitten Framework-beroende körbar och fristående distribution .
Exempelapp
Du kan använda följande app för att utforska publiceringskommandona. Appen skapas genom att köra följande kommandon i terminalen:
mkdir apptest1
cd apptest1
dotnet new console
dotnet add package Figgle
Filen Program.cs
eller Program.vb
som genereras av konsolmallen måste ändras till följande:
using System;
namespace apptest1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
}
}
}
Module Program
Sub Main(args As String())
Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
End Sub
End Module
När du kör appen (dotnet run
) visas följande utdata:
_ _ _ _ __ __ _ _ _
| | | | ___| | | ___ \ \ / /__ _ __| | __| | |
| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
|/
Ramverksberoende distribution
När du publicerar din app som en FDD skapas en <PROJECT-NAME>.dll
fil i ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/
mappen. Om du vill köra appen går du till utdatamappen och använder dotnet <PROJECT-NAME>.dll
kommandot .
Appen är konfigurerad för att rikta in sig på en specifik version av .NET. Den riktade .NET-körningen måste finnas på alla datorer där appen körs. Om din app till exempel riktar in sig på .NET Core 8 måste alla datorer som appen körs på ha .NET Core 8-körningen installerad. Som du ser i avsnittet Grunderna för publicering kan du redigera din projektfil för att ändra standardmålramverket eller för att rikta in dig på mer än ett ramverk.
När du publicerar en FDD skapas en app som automatiskt överförs till den senaste .NET-säkerhetskorrigeringen som är tillgänglig i systemet som kör appen. Mer information om versionsbindning vid kompilering finns i Välj den .NET-version som ska användas.
Publiceringsläge | Command |
---|---|
Ramverksberoende distribution | dotnet publish -c Release -p:UseAppHost=false |
Ramverksberoende körbar fil
Ramverksberoende körbar fil (FDE) är standardläget för det grundläggande dotnet publish
kommandot. Du behöver inte ange några andra parametrar så länge du vill rikta in dig på det aktuella operativsystemet.
I det här läget skapas en plattformsspecifik körbar värd som värd för din plattformsoberoende app. Det här läget liknar FDD eftersom FDD kräver en värd i form av dotnet
kommandot . Värdfilens körbara filnamn varierar per plattform och heter något som liknar <PROJECT-FILE>.exe
. Du kan köra den här körbara filen direkt i stället för att anropa dotnet <PROJECT-FILE>.dll
, vilket fortfarande är ett acceptabelt sätt att köra appen.
Appen är konfigurerad för att rikta in sig på en specifik version av .NET. Den riktade .NET-körningen måste finnas på alla datorer där appen körs. Om din app till exempel riktar in sig på .NET 8 måste alla datorer som appen körs på ha .NET 8-körningen installerad. Som du ser i avsnittet Grunderna för publicering kan du redigera din projektfil för att ändra standardmålramverket eller för att rikta in dig på mer än ett ramverk.
När du publicerar en FDE skapas en app som automatiskt överförs till den senaste .NET-säkerhetskorrigeringen som är tillgänglig i systemet som kör appen. Mer information om versionsbindning vid kompilering finns i Välj den .NET-version som ska användas.
Publiceringsläge | Command |
---|---|
Ramverksberoende körbar fil | dotnet publish -c Release -r <RID> --self-contained false dotnet publish -c Release |
När du använder växeln -r
ändras sökvägen till utdatamappen till: ./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/
Om du använder exempelappen kör du dotnet publish -f net6.0 -r win-x64 --self-contained false
. Det här kommandot skapar följande körbara fil: ./bin/Debug/net6.0/win-x64/publish/apptest1.exe
Kommentar
Du kan minska den totala storleken på distributionen genom att aktivera globalisering i variant läge. Det här läget är användbart för program som inte är globalt medvetna och som kan använda formateringskonventioner, höljekonventioner och strängjämförelse och sorteringsordning för den invarianta kulturen. Mer information om globalisering ivariant läge och hur du aktiverar det finns i .NET Globalization Invariant Mode(.NET Globalization Invariant Mode).
Konfigurera beteende för .NET-installationssökning
I .NET 9 och senare versioner kan du konfigurera sökvägarna för .NET-installationssökningen för den publicerade körbara filen via AppHostDotNetSearch
egenskaperna och AppHostRelativeDotNet
.
AppHostDotNetSearch
tillåter att du anger en eller flera platser där den körbara filen letar efter en .NET-installation:
AppLocal
: mappen för den körbara appenAppRelative
: sökväg i förhållande till den körbara appenEnvironmentVariables
: värdet förDOTNET_ROOT[_<arch>]
miljövariablerGlobal
: registrerade och standard globala installationsplatser
AppHostRelativeDotNet
anger sökvägen i förhållande till den körbara fil som ska sökas efter när AppHostDotNetSearch
innehåller AppRelative
.
Mer information finns i AppHostDotNetSearch
, AppHostRelativeDotNet
och installera platsalternativ i apphost.
Fristående distribution
När du publicerar en fristående distribution (SCD) skapar .NET SDK en plattformsspecifik körbar fil. Publicering av en SCD innehåller alla nödvändiga .NET-filer för att köra din app, men den innehåller inte de interna beroendena för .NET (till exempel för .NET 6 i Linux eller .NET 8 på Linux). Dessa beroenden måste finnas i systemet innan appen körs.
När du publicerar en SCD skapas en app som inte vidarekopplas till den senaste tillgängliga .NET-säkerhetskorrigeringen. Mer information om versionsbindning vid kompilering finns i Välj den .NET-version som ska användas.
Du måste använda följande växlar med dotnet publish
kommandot för att publicera en SCD:
-r <RID>
Den här växeln använder en identifierare (RID) för att ange målplattformen. En lista över körningsidentifierare finns i RID-katalogen (Runtime Identifier).
--self-contained true
Den här växeln instruerar .NET SDK att skapa en körbar fil som en SCD.
Publiceringsläge | Command |
---|---|
Fristående distribution | dotnet publish -c Release -r <RID> --self-contained true |
Dricks
- I .NET 6 och senare versioner kan du minska den totala storleken på kompatibla fristående appar genom att publicera trimmade. Detta gör det möjligt för trimmern att ta bort delar av ramverket och refererade sammansättningar som inte finns på någon kodsökväg eller som potentiellt refereras i körningsreflektion. Se trimning av inkompatibiliteter för att avgöra om trimning är meningsfullt för ditt program.
- Du kan minska den totala storleken på distributionen genom att aktivera globalisering i variant läge. Det här läget är användbart för program som inte är globalt medvetna och som kan använda formateringskonventioner, höljekonventioner och strängjämförelse och sorteringsordning för den invarianta kulturen. Mer information om globalisering ivariant läge och hur du aktiverar det finns i .NET Core Globalization Invariant Mode(.NET Core Globalization Invariant Mode).