C# Nuget 包输出位置建议

C# Nuget package output location advise

我正在做一个教育项目,很难组织这个项目。 在过去的三天里,我一直在努力寻找解决方案,但还没有找到。 我正在努力使构建输出尽可能干净和有条理。

问题 我已经加载了两个 nuget 包及其依赖项。 因此,当我构建项目时,所有 DLL 文件都在配置文件(调试或发布)的 main/root 目录中创建。

**Issue Terminal/bin/Debug/net5.0:**
/Core.dll (Project reference)
/MySql.Data.dll
/Terminal.Gui.dll
/Dependency1.dll
/Dependency2.dll
/Dependency3.dll
/Dependency...dll```

**Goal Terminal/bin/Debug/net5.0:**
/bin/server/Core.dll (project reference)
/bin/packages/MySql.Data.dll
/bin/packages/Terminal.Gui.dll
/bin/packages/Dependency1.dll
/bin/packages/Dependency2.dll
/bin/packages/Dependency4.dll
/bin/packages/Dependency....dll

将这些写在 csproj 文件中:

<Target Name="CopyToDesintation" AfterTargets="Build">
        <Copy SourceFiles="@(RuntimeCopyLocalItems)" DestinationFolder="$(TargetDir)bin\packages"></Copy>
        <Copy SourceFiles="$(TargetDir)Core.dll" DestinationFolder="$(TargetDir)bin\server"></Copy> 
</Target>

然后,重建你的项目来检查它。

更新

请覆盖_CopyFilesMarkedCopyLocal系统默认目标

1) 在项目文件夹中创建一个名为 Directory.Build.targets 的文件:

2) 在该文件中添加这些:

<Project>

    <Target Name="_CopyFilesMarkedCopyLocal">
        <Copy SourceFiles="@(RuntimeCopyLocalItems)" DestinationFolder="$(TargetDir)bin\packages"></Copy>
        <Copy SourceFiles="@(ReferenceCopyLocalPaths)" DestinationFolder="$(TargetDir)bin\server"></Copy>
        
    </Target>

</Project>

尽管 server 文件夹包含包dll,但您的需要并不重要,dll 不在根文件夹中。这是我发现的最好的功能。

您可以将其打包为 .NET 5 中的单个可执行文件。

在 .csproj 中:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

</Project>

或通过 CLI:

dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true

https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file