如何在.NET Core 2.1+ / .NET 5中禁用预编译视图以进行调试?

26

昨天我升级到了Net Core 2.1。

现在如果我进行调试,视图会被预编译,在启动期间需要很长时间...是否有可能回退到先前的行为,即只有在需要时才实时编译视图?

Output

我的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>

你好,我想知道编译后的视图存储在哪里?谢谢。 - IceCode
1
它们只是包含在 Views.dll 中的普通类。您可以使用像 dotPeek 这样的工具显示 dll 中的内容。@Örvar - Christian Gollhardt
5个回答

51

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

微软创建了一个 Nuget 包,此处有文档说明

只需在你的 .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 core >= 2.1 && < 3

可以通过在.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>

2
对于 .Net Core 3.x,您需要从 MS 安装 NuGet 扩展 https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0 - 请注意,在 Startup 构造函数中需要将 "ENV" 属性作为 DI 参数添加(如页面底部的注释所述)。 - Rob
@Christian - 我在我的ASP.NET MVC Core 3项目中添加了Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation,并在Startup中添加了services.AddRazorPages().AddRazorRuntimeCompilation();。当我发布时,我是否应该直接在服务器上看到我的.cshtml文件?我正在尝试启用一个场景,在这种情况下,HTML / CSS人员可以与我一起工作,而无需拥有Microsoft环境。 - Howiecamp
@Howiecamp 这个答案是否解决了你的问题? - Christian Gollhardt
@ChristianGollhardt 我正在使用.NET 5,在更改为core3.1后,出现了相同的问题。Pages文件夹不在bin/debug中。 - ahdung
当你有一个新问题时,请提出来。这个问题与发布@ahdung无关。 - Christian Gollhardt
显示剩余4条评论

1
你应该将 MvcRazorCompileOnPublish 设置为 false,这样就会关闭发布时启用的所有视图编译功能。
<PropertyGroup>
  <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>

1
请查看此链接:https://dev59.com/M1UL5IYBdhLWcg3wI1PC#L8sioYgBc1ULPQZF4VPk - Christian Gollhardt
2
我认为现在没有好的方法来解决这个问题,你需要在这里做一些变通。请参见https://github.com/aspnet/MvcPrecompilation/issues/39。 - Nedzad G

0

您可以使用MvcRazorFilesToCompile项目属性进行操作。

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

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

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

0

-3

我已经从2.0迁移到了2.1。也就是说,那个选项是用于发布的。我的关注点在于调试。 - Christian Gollhardt
似乎你甚至没有尝试就驳回了答案。如果你删除Conversiolt.Conmania.Views.dll并添加这个标志,它会在调试文件夹中重新创建吗? - Mark G
通常情况下,这会禁用它。如何在发布期间启用它? - Christian Gollhardt
1
请查看ASP.NET Core Razor SDK以获取一些选项。 - Mark G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接