我可以在我的 .NET Core csproj 中包含多种发布方法吗?

Can I include multiple publishing methods in my .NET Core csproj?

我有一个简单的 .NET Core .csproj 用于我想以两种方式部署的项目:

  1. 作为一个自包含的、修剪过的单文件二进制文件(一个可移植的 mytool.exe,没有其他文件)
  2. 作为未修剪的多文件 DLL(dotnet mytool.dll,文件夹中还有其他一些支持 DLL)

我想这样做是因为单文件 .NET Core 二进制文件的冷启动速度非常慢。我希望这个工具尽可能便携,所以我需要一个单文件 .NET Core 二进制文件,但我也想让用户在不需要便携性的情况下更快地调用 dotnet mytool.dll

我已经配置了我的工具来构建一个独立的、修剪过的、单一文件的二进制文件:

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
    <PublishReadyToRun>true</PublishReadyToRun>
    <PublishSingleFile>true</PublishSingleFile>
    <PublishTrimmed>true</PublishTrimmed>
  </PropertyGroup>

有没有一种简单的方法可以提供多个可以从命令行(或者在我的例子中是 ADO 管道)轻松构建的“配置”或“目标”,以便我可以支持我的其他配置?例如:

  <!-- Other configuration (multi-file), somehow -->
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

根据 Pavel 的评论,我找到了一些相关信息。

然后,在 .NET application publishing overview 之后,我设置了自定义 属性 (flavor) 来控制构建:

  <!--
    Default flavor is SINGLEBINARY
    https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2015/msbuild/how-to-build-the-same-source-files-with-different-options?view=vs-2015
  -->
  <PropertyGroup>
      <Flavor Condition="'$(Flavor)'==''">SINGLEBINARY</Flavor>
  </PropertyGroup>

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <!-- If flavor is SINGLEBINARY, output a standalone EXE -->
  <PropertyGroup Condition="'$(Flavor)'=='SINGLEBINARY'">
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
    <PublishReadyToRun>true</PublishReadyToRun>
    <PublishSingleFile>true</PublishSingleFile>
    <PublishTrimmed>true</PublishTrimmed>
  </PropertyGroup>

  <!-- If flavor is MULTIBINARY, output a more-typical dotnet DLL -->
  <PropertyGroup Condition="'$(Flavor)'=='MULTIBINARY'">
    <!-- No specific options; the default publish works. -->
  </PropertyGroup>

我现在可以基于此进行单独的构建和发布 属性:

dotnet build /p:flavor=singlebinary # single-binary; self-contained EXE for easy sharing
dotnet build /p:flavor=multibinary # multi-binary

dotnet publish --configuration Release /p:flavor=singlebinary
dotnet publish --configuration Release /p:flavor=multibinary