我有一个包含约30个项目的.NET Core解决方案,我不明白其中的一个问题 - 每个项目编译后的Bin输出都非常巨大。基本上它包含了整个Microsoft.AspNetcore.*和System.*程序集,这使得输出大约为15-30MB(即使对于非常小的项目)。
该解决方案被划分为较小的项目,以使其耦合度降低,但现在它带来的麻烦比帮助还要多 - 所有已编译项目的总大小约为700MB。
我同意这对于"启动"/"组合根"项目来说是可以接受的,因为所有东西都应该在一个地方,但现在看起来每个项目都像是"发布",或者像是"独立"编译而不使用安装的框架。
这不是什么问题,但它使解决方案在CI/CD、发布构件等方面变得不那么稳健。有什么想法可能出了什么问题吗?这真的是按设计来的吗?
一个可能的原因是,由于某些历史原因,我的解决方案针对net461(也称为"完整" .NET Framework)。然而,我正在考虑将所有内容移植到netcoreapp1.x/netstandard。我尝试过一些项目 - 看起来对于"库"项目它只复制了几个程序集,但对于其他一些项目(例如使用xUnit编写的测试) - 仍然有很多"基于框架"的DLL,可以从全局缓存或其他地方使用..即使在net461中,当前情况仍然有点奇怪。
我还尝试将所有构建的构件放入CI服务器上的一个文件夹中,但还存在其他问题 - 比如当不同的项目使用不同版本的第三方库时会出现第三方库冲突。对于第三方库来说这是可以理解的,但"框架"库应该可以更加"智能"。
仅供参考,以下是被复制到Bin输出的程序集的完整列表:
我同意这对于"启动"/"组合根"项目来说是可以接受的,因为所有东西都应该在一个地方,但现在看起来每个项目都像是"发布",或者像是"独立"编译而不使用安装的框架。
这不是什么问题,但它使解决方案在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
netcoreapp
为目标可能仍然是最好的选择。以net461
和其他版本为目标似乎需要很多变通方法,这也解释了为什么他们想在.NET Core 2.0中完全停止支持它。 - Aleksanderis