【问题标题】:C# Nuget package output location adviseC# Nuget 包输出位置建议
【发布时间】:2021-05-19 07:23:36
【问题描述】:

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

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

**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

【问题讨论】:

  • 执行程序所需的所有引用都必须在同一目录中。如果出于某种原因,您可以在编译时将它们放在不同的位置,但程序将无法运行。
  • @MartinCostello 有没有减少 DLL 的数量?因为现在我有 18 个 DLL,只有 3 个引用
  • 它们被放在那里是因为在你的依赖树的某个地方需要它们才能让你的应用程序工作。除了“它更整洁”之外,您还有什么理由希望应用程序目录中的文件更少?
  • @MartinCostello 你好,原因是项目的大小。
  • 也许你应该研究一下装配修剪:docs.microsoft.com/en-us/dotnet/core/deploying/…

标签: c# visual-studio nuget


【解决方案1】:

将这些写在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 不在根文件夹中。这是我发现的最好的功能。

【讨论】:

  • 您好@Perry,感谢您的回复。我尝试了您的代码,但这并没有解决我的问题。项目参考 (Core.ddl) 已复制到自定义文件夹,但原件仍在根文件夹中。如果我删除了原件,我将无法启动应用程序。而且 Nuget 引用根本没有被复制。
  • core.dll 是您的参考项目 dll 还是参考项目中的 dll?
  • 您好 Perry,core.dll 是同一解决方案中的第二个项目。用作参考。
  • 我找到了更好的解决方法,请查看我更新的答案。
  • 这成功了!非常非常非常感谢!
【解决方案2】:

您可以将其打包为 .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

【讨论】:

  • 你好@Nullforce,好主意!我也想过这个。不幸的是,这不是我正在寻找的解决方案。编辑:我的项目也不再作为单个文件项目运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2012-04-09
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多