توزیع پروژه‌های ASP.NET Core 1.1 بدون ارائه فایل‌های View آن
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

پیشتر مطلب «توزیع پروژه‌های ASP.NET MVC بدون ارائه فایل‌های View آن» را در مورد ASP.NET MVC 5.x مطالعه کرده بودید. این روش پشتیبانی رسمی و توکاری نداشته و توسط افزونه‌های ثالث انجام می‌شود؛ به همراه تنظیمات و نکات خاص خودش. در ASP.NET Core 1.1، یک چنین امکانی به صورت توکار و صرفا با چند تنظیم ساده، در دسترس می‌باشد که در ادامه نحوه‌ی فعال سازی آن‌را بررسی خواهیم کرد.


فعال سازی پیش کامپایل Viewهای Razor در ASP.NET Core 1.1

در ادامه تغییرات فایل project.json و بسته‌های مورد نیاز جهت فعال سازی پیش کامپایل Viewهای Razor را در برنامه‌های ASP.NET Core 1.1 ملاحظه می‌کنید:
{
    "dependencies": {
        "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design": {
            "version": "1.1.0-preview4-final",
            "type": "build"
        }
    },
 
    "tools": {
        "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools": {
            "version": "1.1.0-preview4-final"
        }
    },

 
    "scripts": {
        "postpublish": [
            "dotnet razor-precompile --configuration %publish:Configuration% --framework %publish:TargetFramework% --output-path %publish:OutputPath% %publish:ProjectPath%",
            "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
        ]
    }
}
در اینجا کار فراخوانی عملیات پیش کامپایل، توسط فرمان dotnet razor-precompile در زمان publish پروژه انجام می‌شود.


بررسی ساختار خروجی نهایی پروژه پس از publish

پس از publish پروژه، اگر به خروجی آن دقت کنیم، فایل اسمبلی جدیدی، به نام xyz.PrecompiledViews.dll در آن اضافه شده‌است (که در اینجا xyz نام فضای نام اصلی برنامه است) و حاوی تمام Viewهای برنامه، به صورت کامپایل شده‌است:



اصلاح تنظیمات publishOptions فایل project.json

در این‌حالت دیگر نیازی به ذکر پوشه‌ی Views یا الحاق تمام فایل‌های cshtml در حین publish نیست و می‌توان این قسمت را حذف کرد:
  "publishOptions": {
    "include": [
      "wwwroot",
       //"**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },
  • #
    ‫۷ سال و ۹ ماه قبل، پنجشنبه ۱۸ آذر ۱۳۹۵، ساعت ۰۲:۱۷
    با تنظیمات project.json :
    {
      "dependencies": {
        "CoreCompat.System.Drawing": "1.0.0-beta006",
        "StructureMap.Microsoft.DependencyInjection": "1.2.0",
        "CacheManager.Core": "0.9.1",
        "CacheManager.Microsoft.Extensions.Caching.Memory": "0.9.1",
        "CacheManager.Serialization.Json": "0.9.1",
        "Newtonsoft.Json": "9.0.2-beta1",
        "Microsoft.AspNetCore.SpaServices": "1.0.0-beta-000019",
        "AutoMapper": "5.1.1",
        "EFSecondLevelCache.Core": "1.0.1",
        "Microsoft.AspNetCore.Diagnostics.Elm": "0.2.0",
        "Microsoft.AspNetCore.ResponseCompression": "1.0.0",
        "Microsoft.AspNetCore.Mvc": "1.1.0",
        "Microsoft.AspNetCore.Mvc.Localization": "1.1.0",
        "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
        "Microsoft.AspNetCore.Session": "1.1.0",
        "Microsoft.AspNetCore.Hosting": "1.1.0",
        "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.1.0",
        "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
        "Microsoft.AspNetCore.StaticFiles": "1.1.0",
        "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
        "Microsoft.Extensions.Configuration.Json": "1.1.0",
        "Microsoft.Extensions.FileProviders.Embedded": "1.1.0",
        "Microsoft.Extensions.Logging.Console": "1.1.0",
        "Microsoft.Extensions.Logging.Debug": "1.1.0",
        "Microsoft.Net.Http.Headers": "1.1.0",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.1.0",
        "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.1.0-preview4-final",
        "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design": {
          "version": "1.1.0-preview4-final",
          "type": "build"
        },
        "System.Globalization": "4.3.0",
        "System.IO": "4.3.0",
        "System.Linq": "4.3.0",
        "System.Reflection": "4.3.0",
        "System.Runtime": "4.3.0",
        "System.Runtime.Extensions": "4.3.0",
        "System.Runtime.WindowsRuntime": "4.3.0",
        "System.Text.RegularExpressions": "4.3.0",
        "System.Threading.Tasks": "4.3.0",
        "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
          "version": "1.1.0-preview4-final",
          "type": "build"
        },
        "Elmah.Io.AspNetCore": "1.0.1-pre-24",
        "Elmah.Io.Extensions.Logging": "1.0.17-pre",
        "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
          "version": "1.1.0-preview4-final",
          "type": "build"
        }
      },
      "tools": {
        "Microsoft.EntityFrameworkCore.Tools.DotNet": {
          "version": "1.1.0-preview4-final",
          "imports": [
            "portable-net45+win8"
          ]
        },
        "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools": {
          "version": "1.1.0-preview4-final"
        },
        "Microsoft.Extensions.SecretManager.Tools": "1.1.0-preview4-final",
        "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
          "version": "1.1.0-preview4-final",
          "imports": [
            "portable-net45+win8"
          ]
        },
        "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final"
      },
      "frameworks": {
        "netcoreapp1.1": {
          "dependencies": {
            "Microsoft.NETCore.App": {
              "type": "platform",
              "version": "1.1.0"
            }
          },
          "imports": [
            "dnxcore50",
            "portable-net45+win8"
          ]
        }
      },
      "buildOptions": {
        "emitEntryPoint": true,
        "preserveCompilationContext": true
        //"embed": "Views/**/*.cshtml,Areas/**/Views/**/*.cshtml",
        //"define": [ "DEBUG" ]
      },
      "runtimeOptions": {
        "configProperties": {
          "System.GC.Server": true
        }
      },
      "publishOptions": {
        "include": [
          "wwwroot",
          //"Views",
          //"Areas/**/Views",
          "appsettings.json",
          "web.config"
        ]
      },
      "configurations": {
        "Release": {
          "buildOptions": {
            "optimize": true,
            "platform": "anycpu"
          }
        }
      },
      "scripts": {
        "precompile": [
          //"dotnet bundle"
        ],
        "prepublish": [
          //"bower install"
        ],
        "postpublish": [
          "dotnet razor-precompile --configuration %publish:Configuration% --framework %publish:TargetFramework% --output-path %publish:OutputPath% %publish:ProjectPath%",
          "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
        ]
      }
    }

    پس از publish ، به نظر میرسد فایل ProjectName.PrecompiledViews.dll  به درستی تولید نمی‌شود (حجم برابر 0 کیلوبایت)

    • #
      ‫۷ سال و ۹ ماه قبل، پنجشنبه ۱۸ آذر ۱۳۹۵، ساعت ۰۴:۲۶
      تمام خطاها را در پنجره‌ی View->Output می‌توانید مشاهده کنید (با انتخاب show output from: build در آن).
  • #
    ‫۷ سال و ۵ ماه قبل، پنجشنبه ۱۰ فروردین ۱۳۹۶، ساعت ۱۵:۵۵
    به روز رسانی
    با حذف فایل project.json در VS 2017، اکنون با کلیک راست بر روی گروه نام پروژه (فایل csproj)، گزینه‌ی Edit آن ظاهر شده و مداخل ذکر شده‌ی در مطلب فوق، چنین تعاریفی را پیدا می‌کنند: 
    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
        <PreserveCompilationContext>true</PreserveCompilationContext>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="1.1.0">
          <PrivateAssets>All</PrivateAssets>
        </PackageReference>
      </ItemGroup>
    </Project>
  • #
    ‫۷ سال و ۱ ماه قبل، شنبه ۲۸ مرداد ۱۳۹۶، ساعت ۱۶:۴۶
    ارتقاء به ASP.NET Core 2.0

    pre-compilation در حین Publish پروژه‌های ASP.NET Core 2.0 به صورت پیش فرض فعال است و نیازی به هیچگونه تنظیم اضافه‌تری ندارد.
  • #
    ‫۶ سال و ۶ ماه قبل، جمعه ۱۱ اسفند ۱۳۹۶، ساعت ۱۲:۴۰
    ارتقاء به ASP.NET Core 2.1: امکان کامپایل فایل‌های Razor در پروژه‌های Class library (یا پشتیبانی از طراحی افزونه‌پذیر به صورت توکار)


    در نگارش 2.1 می‌توان فایل‌های razor (هم صفحات Razor و هم Viewهای Razor) را به همراه کنترلرها و مدل‌های آن‌ها داخل class libraries مجزا قرار داد و استفاده کرد. استفاده کننده فقط کافی است ارجاعی را به این کتابخانه‌ها اضافه کند تا امکانات آن‌ها قابل استفاده شوند.
    فعالسازی این قابلیت در یک class library نیاز به تغییرات ذیل را در یک فایل csproj دارد (مشخص کردن sdk، تعیین کامپایل شدن viewها و صفحاتی که باید الحاق شوند):
    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <ResolvedRazorCompileToolset>RazorSdk</ResolvedRazorCompileToolset>
        <RazorCompileOnBuild>true</RazorCompileOnBuild>
        <IncludeContentInPack>false</IncludeContentInPack>
      </PropertyGroup>
    <ItemGroup>
        <Content Include="Pages\**\*.cshtml" />
      </ItemGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.0-preview1-final" />
      </ItemGroup>
    </Project>

    یک نکته‌ی تکمیلی
    اگر برنامه‌های هاست کننده‌ی این پلاگین‌ها، دقیقا در مسیرهای متناظری صفحات و یا Viewهای Razor را قرار دهد، می‌تواند این صفحات را بازنویسی کند.
  • #
    ‫۶ سال قبل، پنجشنبه ۱ شهریور ۱۳۹۷، ساعت ۱۳:۰۰
    ارتقاء به ASP.NET Core 3.0
    در نگارش 3 دیگر از بسته‌ی Microsoft.AspNetCore.Mvc.Razor.ViewCompilation پشتیبانی نمی‌شود. در اینجا برای برخورداری از مزایای پیش‌کامپایل فایل‌های razor، پروژه‌های وب باید از SDK زیر
    <Project SDK="Microsoft.NET.Sdk.Web">
      ...
    </Project>
    و پروژه‌های class library از SDK زیر استفاده کنند (و نیازی به تنظیم بیشتری نخواهند داشت):
    <Project SDK="Microsoft.NET.Sdk.Razor">
      ...
    </Project>
    • #
      ‫۵ سال و ۷ ماه قبل، شنبه ۲۷ بهمن ۱۳۹۷، ساعت ۱۲:۵۲
      در نگارش 3، تنظیم دیگر آن به صورت زیر تغییر کرده‌است:
      services.AddMvc()
          .AddMvcRazorRuntimeCompilation();
    • #
      ‫۴ سال و ۶ ماه قبل، دوشنبه ۱۲ اسفند ۱۳۹۸، ساعت ۱۷:۳۸
      برای کامپایل مجدد فایل‌های ویو (cshtml) در هنگام اجرای برنامه (runtime compilationو مشاهده تغییرات اعمال شده بر روی آن‌ها به صورت زیر عمل می‌کنیم:

      • ASP.NET Core 2.2
      services.AddMvc()
          .AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = true);

      • ASP.NET Core 3.0 , 3.1
      ابتدا بسته  Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation به پروژه اضافه کرده و سپس از کد زیر استفاده می‌کنیم:
      public void ConfigureServices(IServiceCollection services)
      {
          services.AddControllersWithViews()
              .AddRazorRuntimeCompilation();
          //...
      }