.NET Core构建输出包含许多DLL文件。

4
我有一个包含约30个项目的.NET Core解决方案,我不明白其中的一个问题 - 每个项目编译后的Bin输出都非常巨大。基本上它包含了整个Microsoft.AspNetcore.*和System.*程序集,这使得输出大约为15-30MB(即使对于非常小的项目)。 该解决方案被划分为较小的项目,以使其耦合度降低,但现在它带来的麻烦比帮助还要多 - 所有已编译项目的总大小约为700MB。
我同意这对于"启动"/"组合根"项目来说是可以接受的,因为所有东西都应该在一个地方,但现在看起来每个项目都像是"发布",或者像是"独立"编译而不使用安装的框架。
这不是什么问题,但它使解决方案在CI/CD、发布构件等方面变得不那么稳健。有什么想法可能出了什么问题吗?这真的是按设计来的吗?
一个可能的原因是,由于某些历史原因,我的解决方案针对net461(也称为"完整" .NET Framework)。然而,我正在考虑将所有内容移植到netcoreapp1.x/netstandard。我尝试过一些项目 - 看起来对于"库"项目它只复制了几个程序集,但对于其他一些项目(例如使用xUnit编写的测试) - 仍然有很多"基于框架"的DLL,可以从全局缓存或其他地方使用..即使在net461中,当前情况仍然有点奇怪。
我还尝试将所有构建的构件放入CI服务器上的一个文件夹中,但还存在其他问题 - 比如当不同的项目使用不同版本的第三方库时会出现第三方库冲突。对于第三方库来说这是可以理解的,但"框架"库应该可以更加"智能"。
仅供参考,以下是被复制到Bin输出的程序集的完整列表:
Autofac.dll
Autofac.Extensions.DependencyInjection.dll
AutoMapper.dll
FluentAssertions.Core.dll
FluentAssertions.dll
JetBrains.Annotations.dll
Microsoft.AspNetCore.Antiforgery.dll
Microsoft.AspNetCore.Authorization.dll
Microsoft.AspNetCore.Cors.dll
Microsoft.AspNetCore.Cryptography.Internal.dll
Microsoft.AspNetCore.DataProtection.Abstractions.dll
Microsoft.AspNetCore.DataProtection.dll
Microsoft.AspNetCore.Diagnostics.Abstractions.dll
Microsoft.AspNetCore.Diagnostics.dll
Microsoft.AspNetCore.Hosting.Abstractions.dll
Microsoft.AspNetCore.Hosting.dll
Microsoft.AspNetCore.Hosting.Server.Abstractions.dll
Microsoft.AspNetCore.Html.Abstractions.dll
Microsoft.AspNetCore.Http.Abstractions.dll
Microsoft.AspNetCore.Http.dll
Microsoft.AspNetCore.Http.Extensions.dll
Microsoft.AspNetCore.Http.Features.dll
Microsoft.AspNetCore.HttpOverrides.dll
Microsoft.AspNetCore.JsonPatch.dll
Microsoft.AspNetCore.Localization.dll
Microsoft.AspNetCore.Mvc.Abstractions.dll
Microsoft.AspNetCore.Mvc.ApiExplorer.dll
Microsoft.AspNetCore.Mvc.Core.dll
Microsoft.AspNetCore.Mvc.Cors.dll
Microsoft.AspNetCore.Mvc.DataAnnotations.dll
Microsoft.AspNetCore.Mvc.dll
Microsoft.AspNetCore.Mvc.Formatters.Json.dll
Microsoft.AspNetCore.Mvc.Localization.dll
Microsoft.AspNetCore.Mvc.Razor.dll
Microsoft.AspNetCore.Mvc.Razor.Host.dll
Microsoft.AspNetCore.Mvc.TagHelpers.dll
Microsoft.AspNetCore.Mvc.Versioning.dll
Microsoft.AspNetCore.Mvc.ViewFeatures.dll
Microsoft.AspNetCore.Razor.dll
Microsoft.AspNetCore.Razor.Runtime.dll
Microsoft.AspNetCore.ResponseCaching.Abstractions.dll
Microsoft.AspNetCore.Routing.Abstractions.dll
Microsoft.AspNetCore.Routing.dll
Microsoft.AspNetCore.Server.IISIntegration.dll
Microsoft.AspNetCore.Server.Kestrel.dll
Microsoft.AspNetCore.WebUtilities.dll
Microsoft.CodeAnalysis.CSharp.dll
Microsoft.CodeAnalysis.dll
Microsoft.DotNet.PlatformAbstractions.dll
Microsoft.Extensions.Caching.Abstractions.dll
Microsoft.Extensions.Caching.Memory.dll
Microsoft.Extensions.Configuration.Abstractions.dll
Microsoft.Extensions.Configuration.Binder.dll
Microsoft.Extensions.Configuration.dll
Microsoft.Extensions.Configuration.EnvironmentVariables.dll
Microsoft.Extensions.Configuration.FileExtensions.dll
Microsoft.Extensions.Configuration.Json.dll
Microsoft.Extensions.DependencyInjection.Abstractions.dll
Microsoft.Extensions.DependencyInjection.dll
Microsoft.Extensions.DependencyModel.dll
Microsoft.Extensions.FileProviders.Abstractions.dll
Microsoft.Extensions.FileProviders.Composite.dll
Microsoft.Extensions.FileProviders.Physical.dll
Microsoft.Extensions.FileSystemGlobbing.dll
Microsoft.Extensions.Globalization.CultureInfoCache.dll
Microsoft.Extensions.Localization.Abstractions.dll
Microsoft.Extensions.Localization.dll
Microsoft.Extensions.Logging.Abstractions.dll
Microsoft.Extensions.Logging.Console.dll
Microsoft.Extensions.Logging.dll
Microsoft.Extensions.ObjectPool.dll
Microsoft.Extensions.Options.ConfigurationExtensions.dll
Microsoft.Extensions.Options.dll
Microsoft.Extensions.PlatformAbstractions.dll
Microsoft.Extensions.Primitives.dll
Microsoft.Extensions.WebEncoders.dll
Microsoft.Net.Http.Headers.dll
Microsoft.Win32.Primitives.dll
Newtonsoft.Json.dll
NLog.dll
NLog.Extensions.Logging.dll
NLog.Web.AspNetCore.dll
System.AppContext.dll
System.Buffers.dll
System.Collections.Immutable.dll
System.ComponentModel.Annotations.dll
System.ComponentModel.Primitives.dll
System.ComponentModel.TypeConverter.dll
System.Console.dll
System.Diagnostics.DiagnosticSource.dll
System.Diagnostics.FileVersionInfo.dll
System.Diagnostics.StackTrace.dll
System.Globalization.Calendars.dll
System.IO.Compression.dll
System.IO.FileSystem.dll
System.IO.FileSystem.Primitives.dll
System.Net.Http.dll
System.Net.Sockets.dll
System.Numerics.Vectors.dll
System.Reflection.Metadata.dll
System.Runtime.CompilerServices.Unsafe.dll
System.Runtime.InteropServices.RuntimeInformation.dll
System.Security.Cryptography.Algorithms.dll
System.Security.Cryptography.Encoding.dll
System.Security.Cryptography.Primitives.dll
System.Security.Cryptography.X509Certificates.dll
System.Text.Encoding.CodePages.dll
System.Text.Encodings.Web.dll
System.Threading.Tasks.Extensions.dll
System.Threading.Thread.dll
System.ValueTuple.dll
System.Xml.ReaderWriter.dll
System.Xml.XmlDocument.dll
System.Xml.XPath.dll
System.Xml.XPath.XDocument.dll

2
请查看运行时存储库以获取2.0版本:https://github.com/dotnet/designs/issues/8 - omajid
谢谢分享!虽然不完全能帮到我,因为我理解它主要用于发布/部署,但仍然是一个好的方向。如果你想充分享受新的.NET和工具的好处,那么以netcoreapp为目标可能仍然是最好的选择。以net461和其他版本为目标似乎需要很多变通方法,这也解释了为什么他们想在.NET Core 2.0中完全停止支持它。 - Aleksanderis
2个回答

3

看起来我自己找到了答案...对于.NET Core项目(即新风格的*.csproj文件),有CopyLocalLockFileAssembliesCopyNuGetImplementations标志。

对于.NET Core来说,它是:

<!-- dependencies coming from the package manager lock file should not be copied locally for .NET Core and .NETStandard projects -->
<CopyLocalLockFileAssemblies Condition="'$(CopyLocalLockFileAssemblies)' == ''">false</CopyLocalLockFileAssemblies>

对于.NET框架,由于某种原因它被设置为"true"。这就是为什么二进制文件的大小如此之大。
关于xUnit项目——它们也覆盖了这些标志并将它们设置为true。实际上,当你使用"dotnet xunit"或"dotnet test"时,测试是在这些标志为"false"时工作的,但如果你想使用"xUnit控制台运行器",那么应该确实将其设置为"true"。
虽然这并没有真正帮助到我,但至少它解释了为什么会发生这种情况。只有一个类的项目大小约为5kb,但二进制输出却是16MB,这确实让人沮丧。

2
我曾经遇到过类似的问题,是一个针对net461的小型.NET Core控制台应用程序(这也是我来到这里的原因)。
最终,Microsoft.Packaging.Tools.Trimming工具(现在可以在这里找到)帮我解决了大部分复制的程序集并没有被我的应用程序使用。只需安装nuget包并将以下行插入项目文件即可:
<PropertyGroup>
   <TrimUnusedDependencies>true</TrimUnusedDependencies>
</PropertyGroup>

这将检查未使用的依赖项并将其删除。也许这可以稍微减少DLL文件的数量。


你能从你发布的链接中给我们一个相关的引用吗?这样,如果链接失效,你的回答仍然保留了相关细节。谢谢! - theUtherSide
这里描述的方法现在是一个坏链接。 - ferventcoder
https://github.com/dotnet/standard/commit/bf1e5a493419a95584c50f4b2b9b1ab6636a6617 解释了事情的发展方向。 - ferventcoder
1
修剪工具已经迁移到 https://github.com/ericstj/Microsoft.Packaging.Tools.Trimming。 - ferventcoder
@ferventcoder 感谢提供信息,我已更新链接。 - alxnull
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接