#.net-core #build #blazor #server-side
#.net-ядро #сборка #blazor #серверная часть
Вопрос:
Мы перенесли (после 4 месяцев работы) проект с NEt Core 2.2 на Net Core 3.1 на стороне сервера Blazor, и у нас есть большая разница во времени сборки для разработки в Visual Studio:
- Net Core 2.2 Visual Studio 2019: 15 секунд (допустимо)
- Net Core 3.1 с Blazor Server Side Visual Studio 2019: 1 минута. (Неприемлемо)
В Visual Studio Enterprise вышло последнее обновление, мы перенесли .NET Core на: 3.1.7
Конфигурация компьютера: Azure Server, SSD-накопитель премиум-класса, процессор 8, 2,7 ГГц
Есть ли какой-либо способ увеличить время сборки не только для разработки? Требуется время, чтобы изменить всего лишь небольшой код, а затем подождать 1 минуту, чтобы увидеть результат.
Мы перепробовали множество настроек, которые видели в Интернете. Код проекта является :
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>....</UserSecretsId>
<ServerGarbageCollection>false</ServerGarbageCollection>
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>true</RazorCompileOnPublish>
<RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
<BlazorLinkOnBuild Condition="'$(Configuration)'!='Release'">false</BlazorLinkOnBuild>
<RunCodeAnalysis>false</RunCodeAnalysis>
<UseRazorBuildServer>false</UseRazorBuildServer>
<DisableImplicitAspNetCoreAnalyzers>true</DisableImplicitAspNetCoreAnalyzers>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BlazorDateRangePicker" Version="2.9.0" />
<PackageReference Include="Blazored.LocalStorage" Version="3.0.0" />
<PackageReference Include="Blazored.SessionStorage" Version="1.0.12" />
<PackageReference Include="BlazorInputFile" Version="0.2.0" />
<PackageReference Include="ChartJs.Blazor" Version="1.1.0" />
<PackageReference Include="EPPlus" Version="5.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.2.0-preview3.20168.3" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.1.7" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.7"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Facebook" Version="3.1.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.7" />
<PackageReference Include="Hangfire" Version="1.7.12" />
<PackageReference Include="MailKit" Version="2.8.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0" />
</ItemGroup>
Спасибо
Журнал
1>Target Performance Summary:
1> 0 ms CoreGenerateAssemblyInfo 1 calls
1> 0 ms PrepareResources 1 calls
1> 0 ms ResolvePackageDependenciesForBuild 1 calls
1> 0 ms RazorComponentGenerateCore 1 calls
1> 0 ms RazorGenerate 1 calls
1> 0 ms PrepareProjectReferences 1 calls
1> 0 ms PrepareForRazorGenerate 1 calls
1> 0 ms ResolveSDKReferences 1 calls
1> 0 ms ExpandSDKReferences 1 calls
1> 0 ms _RemoveRazorDeclartionsFromCompile 1 calls
1> 0 ms PrepareForRazorComponentGenerate 1 calls
1> 0 ms BeforeCompile 1 calls
1> 0 ms Build 1 calls
1> 0 ms GenerateFakes 1 calls
1> 0 ms AfterResolveReferences 1 calls
1> 0 ms ResolveReferences 1 calls
1> 0 ms AddSourceRevisionToInformationalVersion 1 calls
1> 0 ms InitializeSourceControlInformation 1 calls
1> 0 ms CopyAdditionalFiles 1 calls
1> 0 ms GenerateMSBuildEditorConfigFile 1 calls
1> 0 ms GenerateMSBuildEditorConfigFileShouldRun 1 calls
1> 0 ms SplitResourcesByCulture 1 calls
1> 0 ms CreateCustomManifestResourceNames 1 calls
1> 0 ms PrepareResourceNames 1 calls
1> 0 ms BeforeResGen 1 calls
1> 0 ms GetTypeScriptOutputForPublishing 1 calls
1> 0 ms RazorComponentGenerate 1 calls
1> 0 ms GenerateCompiledExpressionsTempFile 1 calls
1> 0 ms IncludeTransitiveProjectReferences 1 calls
1> 0 ms AddTransitiveFrameworkReferences 1 calls
1> 0 ms _CheckForUnsupportedNETCoreVersion 1 calls
1> 0 ms _CheckForUnsupportedCppNETCoreVersion 1 calls
1> 0 ms AfterBuild 1 calls
1> 0 ms CoreBuild 1 calls
1> 0 ms PrepareForRun 1 calls
1> 0 ms ComputeDependencyFileCompilerOptions 1 calls
1> 0 ms _ComputeUserRuntimeAssemblies 1 calls
1> 0 ms _CopySourceItemsToOutputDirectory 1 calls
1> 0 ms ResolveReferencedProjectsStaticWebAssets 1 calls
1> 0 ms GetTargetPath 1 calls
1> 0 ms CollectPackageReferences 1 calls
1> 0 ms GetTargetPathWithTargetPlatformMoniker 1 calls
1> 0 ms DesignTimeXamlMarkupCompilation 1 calls
1> 0 ms Compile 1 calls
1> 0 ms DisableAnalyzers 1 calls
1> 0 ms _GenerateRazorAssemblyInfo 1 calls
1> 0 ms _ComputePackageReferencePublish 1 calls
1> 0 ms _DefaultMicrosoftNETPlatformLibrary 1 calls
1> 0 ms BeforeResolveReferences 1 calls
1> 0 ms AfterCompile 1 calls
1> 0 ms ComputeRunAnalyzers 1 calls
1> 0 ms _BeforeVBCSCoreCompile 1 calls
1> 0 ms GetReferenceAssemblyPaths 1 calls
1> 0 ms GetFrameworkPaths 1 calls
1> 0 ms BuildOnlySettings 1 calls
1> 0 ms BeforeBuild 1 calls
1> 0 ms AfterResGen 1 calls
1> 1 ms RazorGenerateComponentDefinition 1 calls
1> 1 ms SetWin32ManifestProperties 1 calls
1> 1 ms _DiscoverMvcApplicationParts 1 calls
1> 1 ms GenerateTargetFrameworkMonikerAttribute 1 calls
1> 1 ms CleanupEmptyRefsFolder 1 calls
1> 1 ms ValidationExtension 1 calls
1> 1 ms _CheckForCompileOutputs 1 calls
1> 1 ms ResGen 1 calls
1> 1 ms _CollectTargetFrameworkForTelemetry 1 calls
1> 1 ms _GetAppHostPaths 1 calls
1> 1 ms ResolveLockFileAnalyzers 1 calls
1> 1 ms _GenerateSatelliteAssemblyInputs 1 calls
1> 1 ms _GetProjectJsonPath 1 calls
1> 1 ms ResolveStaticWebAssetsInputs 1 calls
1> 1 ms ResolveRazorGenerateInputs 1 calls
1> 1 ms GenerateAssemblyInfo 1 calls
1> 1 ms GetAssemblyAttributes 1 calls
1> 1 ms _CheckForObsoleteDotNetCliToolReferences 1 calls
1> 1 ms RazorGetAssemblyAttributes 1 calls
1> 1 ms _GetUserSecretsAssemblyAttribute 1 calls
1> 1 ms _CoreGenerateRazorAssemblyInfo 1 calls
1> 1 ms ResolveProjectReferences 1 calls
1> 1 ms BeforeGenerateFakesAssemblies 1 calls
1> 1 ms _PopulateCommonStateForGetCopyToOutputDirectoryItems 1 calls
1> 1 ms CreateSatelliteAssemblies 1 calls
1> 1 ms _PrepareForStaticWebAssets 1 calls
1> 1 ms CleanXsdCodeGen 1 calls
1> 1 ms _CheckForLanguageAndFeatureCombinationSupport 1 calls
1> 1 ms ComputeIntermediateSatelliteAssemblies 1 calls
1> 1 ms ResolveRazorComponentInputs 1 calls
1> 1 ms _SetTargetFrameworkMonikerAttribute 1 calls
1> 1 ms _SetEmbeddedWin32ManifestProperties 1 calls
1> 1 ms CreateManifestResourceNames 1 calls
1> 1 ms ExpressionBuildExtension 1 calls
1> 1 ms GetCopyToOutputDirectoryXamlAppDefs 1 calls
1> 1 ms EnableIntermediateOutputPathMismatchWarning 1 calls
1> 1 ms _SplitProjectReferencesByFileExistence 1 calls
1> 1 ms _GenerateCompileInputs 1 calls
1> 1 ms _ComputeNETCoreBuildOutputFiles 1 calls
1> 2 ms ApplyImplicitVersions 1 calls
1> 2 ms ValidateIdentityUIFrameworkVersion 1 calls
1> 2 ms _CheckForUnsupportedAppHostUsage 1 calls
1> 2 ms ResolveCodeAnalysisRuleSet 1 calls
1> 2 ms _GetCopyToOutputDirectoryItemsFromTransitiveProjectReferences 1 calls
1> 2 ms CheckFileSystemCaseSensitive 1 calls
1> 2 ms _CheckForInvalidConfigurationAndPlatform 1 calls
1> 2 ms GetTypeScriptCopyToOutputDirectoryItems 1 calls
1> 2 ms AssignRazorGenerateTargetPaths 1 calls
1> 2 ms CheckForImplicitPackageReferenceOverrides 1 calls
1> 3 ms _CreateRazorAssemblyInfoInputsCacheFile 1 calls
1> 3 ms GenerateBuildDependencyFile 1 calls
1> 3 ms _GetProjectReferenceTargetFrameworkProperties 1 calls
1> 3 ms _GenerateRuntimeConfigurationFilesInputCache 1 calls
1> 3 ms PreXsdCodeGen 1 calls
1> 3 ms TypeScriptDeleteOutputFromOtherConfigs 1 calls
1> 3 ms ResolveRazorConfiguration 1 calls
1> 3 ms _HashRazorGenerateInputs 1 calls
1> 3 ms _CopyOutOfDateSourceItemsToOutputDirectory 1 calls
1> 3 ms CreateGeneratedAssemblyInfoInputsCacheFile 1 calls
1> 3 ms _ResolveComponentRazorGenerateInputs 1 calls
1> 4 ms _GetCopyToOutputDirectoryItemsFromThisProject 1 calls
1> 6 ms ReportTypeScriptVersion 1 calls
1> 6 ms _GetRestoreProjectStyle 1 calls
1> 7 ms AssignRazorComponentTargetPaths 1 calls
1> 8 ms GenerateBuildRuntimeConfigurationFiles 1 calls
1> 8 ms UpdateAspNetToFrameworkReference 1 calls
1> 9 ms GetAssemblyVersion 1 calls
1> 9 ms ResolveLockFileReferences 1 calls
1> 9 ms ResolveTargetingPackAssets 1 calls
1> 10 ms AssignProjectConfiguration 1 calls
1> 10 ms ResolveFrameworkReferences 1 calls
1> 11 ms GetCopyToOutputDirectoryItems 1 calls
1> 11 ms ResolveLockFileCopyLocalFiles 1 calls
1> 11 ms _ComputeReferenceAssemblies 1 calls
1> 12 ms ProcessFrameworkReferences 1 calls
1> 12 ms _ResolveMvcAssemblyAttributes 1 calls
1> 13 ms _HashRazorComponentInputs 1 calls
1> 13 ms CopyFilesToOutputDirectory 1 calls
1> 18 ms _CreateStaticWebAssetsInputsCacheFile 1 calls
1> 20 ms ResolvePackageAssets 1 calls
1> 21 ms CoreResGen 1 calls
1> 23 ms ResolveAssemblyReferenceRazorGenerateInputs 1 calls
1> 24 ms PrepareForBuild 1 calls
1> 27 ms FindConfigFiles 1 calls
1> 30 ms _GenerateCompileDependencyCache 1 calls
1> 43 ms IncrementalClean 1 calls
1> 43 ms _CleanGetCurrentAndPriorFileWrites 1 calls
1> 47 ms CheckForDuplicateItems 1 calls
1> 50 ms _CopyFilesMarkedCopyLocal 1 calls
1> 83 ms _ResolveRazorGenerateOutputs 1 calls
1> 88 ms _CopyReferenceOnlyAssembliesForBuild 1 calls
1> 101 ms _HandlePackageFileConflicts 1 calls
1> 122 ms AssignTargetPaths 1 calls
1> 126 ms FindReferenceAssembliesForReferences 1 calls
1> 136 ms _ResolveRazorComponentOutputs 1 calls
1> 156 ms _CreateAppHost 1 calls
1> 307 ms GenerateSatelliteAssemblies 2 calls
1> 879 ms ResolveAssemblyReferences 1 calls
1> 1447 ms GenerateStaticWebAssetsManifest 1 calls
1> 1527 ms ResolveTagHelperRazorGenerateInputs 1 calls
1> 2057 ms RazorGenerateComponentDeclaration 1 calls
1> 2838 ms ResolveCurrentProjectStaticWebAssetsInputs 1 calls
1> 6867 ms RazorCoreGenerate 1 calls
1> 19849 ms RazorCompileComponentDeclaration 1 calls
1> 21464 ms CoreCompile 1 calls
1>
1>Task Performance Summary:
1> 0 ms Delete 2 calls
1> 0 ms FindInList 1 calls
1> 0 ms CheckFileSystemCaseSensitive 1 calls
1> 0 ms AssignCulture 1 calls
1> 1 ms ApplyImplicitVersions 1 calls
1> 1 ms CheckForImplicitPackageReferenceOverrides 1 calls
1> 1 ms ResolveFrameworkReferences 1 calls
1> 1 ms MSBuild 1 calls
1> 1 ms Telemetry 1 calls
1> 1 ms ResolveCodeAnalysisRuleSet 1 calls
1> 1 ms CheckForDuplicateFrameworkReferences 1 calls
1> 1 ms GetFrameworkPath 1 calls
1> 1 ms CreateCSharpManifestResourceName 1 calls
1> 3 ms Touch 2 calls
1> 3 ms JoinItems 1 calls
1> 3 ms Message 4 calls
1> 3 ms ReadLinesFromFile 1 calls
1> 3 ms ResolveAppHosts 1 calls
1> 4 ms GetRestoreProjectStyleTask 1 calls
1> 4 ms ProcessFrameworkReferences 1 calls
1> 4 ms FormatLocalizedString 1 calls
1> 4 ms GetPackageDirectory 6 calls
1> 7 ms ConvertToAbsolutePath 1 calls
1> 7 ms CheckIfPackageReferenceShouldBeFrameworkReference 2 calls
1> 7 ms ResolveTargetingPackAssets 1 calls
1> 8 ms AssignProjectConfiguration 1 calls
1> 9 ms GetAssemblyVersion 1 calls
1> 10 ms WriteLinesToFile 7 calls
1> 11 ms CallTarget 3 calls
1> 14 ms FindUnderPath 5 calls
1> 15 ms RemoveDuplicates 2 calls
1> 18 ms GenerateResource 1 calls
1> 19 ms ResolvePackageAssets 1 calls
1> 24 ms FindAppConfigFile 1 calls
1> 27 ms FindConfigFiles 1 calls
1> 31 ms Hash 7 calls
1> 37 ms RemoveDir 1 calls
1> 45 ms CheckForDuplicateItems 3 calls
1> 46 ms MakeDir 53 calls
1> 87 ms ResolvePackageFileConflicts 1 calls
1> 129 ms AssignTargetPath 11 calls
1> 145 ms Copy 6 calls
1> 155 ms CreateAppHost 1 calls
1> 303 ms AL 2 calls
1> 873 ms ResolveAssemblyReference 1 calls
1> 1523 ms RazorTagHelper 1 calls
1> 8746 ms RazorGenerate 2 calls
1> 41309 ms Csc 2 calls
1>
1>Build succeeded.
1> 0 Warning(s)
1> 0 Error(s)
1>
Комментарии:
1. Вы пробовали регистрировать сборку, чтобы узнать, что занимает так много времени? Вы просто создаете или переделываете, потому что повторная сборка обходится дорого.
2. Спасибо за ответ. Когда мы что-то меняем в файле .razor, мы нажимаем сохранить и Cntrl-F5, я не знаю другого способа компиляции. Я отредактировал вопрос и добавил некоторый раздел из журнала. Честно говоря, я не знаю, где искать. Кажется, RazorCompileComponentDeclaration (19849 мс), CoreCompile (21464 мс CoreCompile), RazorGenerate (8746 мс RazorGenerate) и т.д.
3. Моим первым предложением было бы разделить ваши компоненты на библиотеки классов Razor — чем больше разделение, тем лучше (в некоторой степени), чтобы инкрементные сборки требовали меньше компиляции. Является ли это особенно масштабируемым решением? Используете ли вы быстрый SSD-накопитель? Отключено антивирусное сканирование исходных папок?
4. Если вы работаете с использованием Ctrl-F5, вы могли бы попробовать просто нажать Ctrl b после изменения вместо Ctrl-F5 — он должен просто выполнить сборку и перезапустить — и для меня это быстрее, чем Ctrl-F5, когда он уже запущен
5. В решении был только один проект со всеми файлами. Теперь я разделил больше проектов: Уровень представления (Blazor и некоторые вспомогательные средства), разделяемую библиотеку (некоторые общие вспомогательные средства), библиотеку доступа к данным (миграции и контекст БД), службы бизнес-логики (сервисы и запросы к базе данных), и теперь все завершается за 20 секунд (используя Ctrl-B, как вы сказали). Разница в 20 секунд связана с миграциями, потому что за это время было: 663 файла. Да, я использую SSD, который мы протестировали на большем количестве серверов и компьютеров. Текущий компьютер находится на сервере Azure F8s v2 16 ГБ, 8 процессоров. Антивируса нет.