عنوان:

‫روشی برای افزایش سرعت Build پروژه‌های بزرگ Blazor در دات‌نت 9


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۰۹/۱۰ ۲۰:۵۵
آدرس: www.dntips.ir
اگر پروژه‌ی Blazor شما از تعداد زیادی فایل Razor تشکیل شود، کوچکترین تغییری در آن‌ها، سبب محاسبه‌ی مجدد خروجی Source generator تمام آن‌ها خواهد شد که بسیار وقت‌گیر است. به همین جهت تیم مربوطه در حال توسعه‌ی بسته‌ای است به نام Microsoft.Net.Compilers.Razor.Toolset که امکان کش کردن خودکار خروجی این Source generator کامپایلر جدید Razor را میسر می‌کند. با فعالسازی این بسته و کش کردن خروجی source generator، سرعت Build برنامه به‌شدت افزیش پیدا می‌کند که در ادامه روش انجام این‌کار را بررسی می‌کنیم.


افزودن فید Nuget مخصوص بسته‌ی Microsoft.Net.Compilers.Razor.Toolset

این بسته‌ی جدید، هرچند در سایت رسمی NuGet هم مدخلی دارد، اما بسیار قدیمی است و نگارش‌های جدید و شبانه‌ی آن، در فید azure.com منتشر می‌شوند. به همین جهت نیاز است فایل جدید nuget.config را به ریشه‌ی solution خود با این محتوا اضافه کنید تا در حین restore، نگارش‌های مخصوص دات‌نت 9 آن هم به سادگی یافت شوند:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
   <clear />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="dotnet-tools" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" />
  </packageSources>
  <packageSourceMapping>
    <packageSource key="nuget.org">
      <package pattern="*" />
    </packageSource>
    <packageSource key="dotnet-tools">
      <package pattern="Microsoft.Net.Compilers.Razor.*" />      
    </packageSource>
  </packageSourceMapping>
</configuration>


تغییرات مورد نیاز فایل csproj. برنامه برای فعالسازی کش کردن خروجی Source generator کامپایلر Razor

اگر می‌خواهید فقط یک فایل csproj. را تغییر دهید، نحوه‌ی تعریف ویژگی جدید enable-generator-cache و بسته‌ی Microsoft.Net.Compilers.Razor.Toolset به صورت زیر است:
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <Features>enable-generator-cache</Features>
  </PropertyGroup>
  <ItemGroup>
        <PackageReference Include="Microsoft.Net.Compilers.Razor.Toolset" 
                          Version="9.0.0-preview.24554.8"
                          Condition=" '$(UsingMicrosoftNETSdkRazor)' == 'true' ">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
  </ItemGroup>
</Project>

و اگر از central package management استفاده می‌کنید:
ابتدا به فایل Directory.Packages.props، مدخل زیر را اضافه کنید:
<Project>
  <ItemGroup>
    <PackageVersion Include="Microsoft.Net.Compilers.Razor.Toolset" Version="9.0.0-preview.24554.8" />
  </ItemGroup>
</Project>

سپس به فایل Directory.Build.props دو تغییر زیر را اعمال کنید:
<Project>
    <PropertyGroup>
       <Features>enable-generator-cache</Features>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.Net.Compilers.Razor.Toolset" 
                          Condition=" '$(UsingMicrosoftNETSdkRazor)' == 'true' ">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
    </ItemGroup>
</Project>