如何禁用 net core 2.1+ / net 5 中的预编译视图进行调试?

Posted

技术标签:

【中文标题】如何禁用 net core 2.1+ / net 5 中的预编译视图进行调试?【英文标题】:How to disable precompiled views in net core 2.1+ / net 5 for debugging? 【发布时间】:2018-06-09 21:03:34 【问题描述】:

昨天我更新到net core 2.1。

现在,如果我正在调试,视图会被预编译,这在启动过程中当然需要很长时间......如果需要的话,是否有可能退回到以前的行为,即及时编译视图?

我的 csproj 中没有与预编译相关的参考资料。它是来自元包的东西吗?

  <ItemGroup>
    <PackageReference Include="JetBrains.Annotations" Version="11.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0" PrivateAssets="All" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="2.5.0" />
    <!--<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />-->
  </ItemGroup>

【问题讨论】:

您好,我想知道您是否知道编译后的视图存储在哪里?提前致谢。 它们只是包含在Views.dll 中的普通类。您可以使用 dotPeek @Örvar 等工具显示 dll 中的内容 【参考方案1】:

.net core >= 3(也称为 .net 5)

Microsoft 创建了一个 Nuget 包。这是documented here。

只需有条件地在您的 .csproj 文件中引用 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。不要忘记调整版本,你实际使用的。

<PackageReference
    Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
    Version="3.1.0"
    Condition="'$(Configuration)' == 'Debug'" />

同时配置您的服务

    public void ConfigureServices(IServiceCollection services)
    
        // your MVC Builder (AddRazorPages/AddControllersWithViews)
        IMvcBuilder builder = services.AddRazorPages();

#if DEBUG
            // Only use Runtime Compilation on Debug
            if (Env.IsDevelopment())
            
                builder.AddRazorRuntimeCompilation();
            
#endif
    

当然,当你想通用运行时编译时,即使发布,你也不需要所有条件。

.net 核心 >= 2.1 &&

这可以使用 .csproj 文件中的属性RazorCompileOnBuild 来完成:

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
  <RazorCompileOnBuild>false</RazorCompileOnBuild>
  <RazorCompileOnPublish>true</RazorCompileOnPublish>
</PropertyGroup>

这样,Razor 文件仅在发布期间进行预编译。

根据用例,您还想根据构建配置进行配置:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <RazorCompileOnBuild>false</RazorCompileOnBuild>
  <RazorCompileOnPublish>true</RazorCompileOnPublish>
</PropertyGroup>

【讨论】:

在调试模式下使用此设置非常酷,因为第一次渲染的时间大致相同,并且在 cshtml 更改后刷新浏览器中的 F5 更快。但是,通过这种配置方法,VS 2017 中的 F1 不再导致我链接的浏览器刷新,而是 VS 弹出一个对话框,上面写着“你想停止调试。有点奇怪。有什么想法吗? 对于 .Net Core 3.x,您需要从 MS docs.microsoft.com/en-us/aspnet/core/mvc/views/… 安装 NuGet 扩展 - 请注意,“ENV”属性需要作为 DI 参数添加到 Startup 构造函数中(根据评论在页面底部) 非常感谢,我正在使用 asp.net core 2.1 和您的 .net core >= 2.1 && @Christian - 我在我的 ASP.NET MVC Core 3 项目中添加了Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation,并在启动中添加了services.AddRazorPages().AddRazorRuntimeCompilation();。当我发布时,我应该直接在服务器上查看我的 .cshtml 文件吗?我正在尝试启用一个场景,让 html/css 的人可以与我一起工作,而无需拥有 Microsoft 环境。 @Howiecamp this 回答你的问题吗?【参考方案2】:

您应该将 MvcRazorCompileOnPublish 设置为 false,这样,它将关闭作为发布的一部分启用的视图编译的所有功能。

<PropertyGroup>
  <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>

【讨论】:

See this 我认为现在没有什么好的方法可以做到这一点,你需要在这里做一些解决方法。见github.com/aspnet/MvcPrecompilation/issues/39。【参考方案3】:

你可以玩MvcRazorFilesToCompile项目属性

MvcRazorFilesToCompile:指定要编译的视图文件的项目组。默认情况下,这包括所有标记为内容的 .cshtml 文件。

注意:不要使用空字符串,因为这与默认相同(from repo):

<ItemGroup Condition="'@(MvcRazorFilesToCompile)' == ''">
      <MvcRazorFilesToCompile Include="@(Content)" Condition="'%(Extension)'=='.cshtml'" />
</ItemGroup>

【讨论】:

【参考方案4】:

如果您在 .net core 3.1.net core 5.0 上使用 ControllersWithViews,您可以查看以下解决方案:

Disable precompiled views on development when using "AddControllersWithViews()"

【讨论】:

【参考方案5】:

根据Migrate from ASP.NET Core 1.x to 2.0 指南,您需要将MvcRazorCompileOnPublish 设置为false。

【讨论】:

我已经从 2.0 迁移到 2.1。也就是说,该选项是/曾经用于发布。我关心的是调试。 看来您甚至没有尝试就忽略了答案。如果您删除 Conversiolt.Conmania.Views.dll 并添加此标志,它会在调试文件夹中重新创建吗? 这通常禁用它。那么如何在发布时启用呢? 查看ASP.NET Core Razor SDK 的一些选项。

以上是关于如何禁用 net core 2.1+ / net 5 中的预编译视图进行调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用默认的 asp net core config change watcher?

如何在 asp.net core 2.1 中使用 net.tcp 服务

从 .NET Core 2.1 降级到 .NET 4.7.1 时如何使用 IApplicationBuilder 和 IServiceCollection?

如何在 ASP.NET core rc2 中禁用浏览器缓存?

Asp.net core 2.1 - 如何服务多个角度应用程序?

我如何在登录 asp.net core razor 之前显示加载图标或禁用按钮