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
我正在做一个教育项目,很难组织这个项目。 在过去的三天里,我一直在努力寻找解决方案,但还没有找到。 我正在努力使构建输出尽可能干净和有条理。
问题 我已经加载了两个 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