如何在ASP.NET Core 2.0中预编译视图?

12
我按照这篇文章设置了我的解决方案。我省略了一些内容,因为根据这里,ASP.NET Core 2.0默认预编译视图。最后,我将它发布到一个文件夹,发布成功,但我的precompiledviews.dll丢失了。我尝试在.csproj中显式设置它,但没有成功。

编辑:解决方案中的两个项目都只是默认的MVC模板。


你的 TargetFramework 是什么?并且你尝试过将 MvcRazorCompileOnPublish 隐式设置为 true 吗? - Set
@Set,这是Core 2.0版本,并且我确实尝试将MvcRazorCompileOnPublish设置为true。 - Orvel
2个回答

10
我打赌你使用自包含部署,即使用以下命令发布:
dotnet publish --configuration Release --runtime win-x64
这将生成一个包括所有依赖项(包括.NET Core二进制文件)的可执行文件。 Razor视图编译和预编译文章中包含以下警告:
当在ASP.NET Core 2.0中进行自包含部署(SCD)时,Razor视图预编译当前不可用。该功能将在2.1版本中提供给SCD。
因此,如果要使用预编译的Razor视图,您应该使用框架相关部署,即使用以下命令发布:
dotnet publish --configuration Release 在这种情况下,Razor视图是预编译的(默认情况下),您将在其他应用程序二进制文件中找到YourAppName.PrecompiledViews.dll。
更新(有关库项目中的预编译视图)
我的原始答案与通常的ASP.NET Core MVC应用程序相关,但问题特定于持有预编译视图(即自包含UI)的项目库。
ASP.NET Core在发布期间默认预编译视图,但是库项目中存储的视图不是这种情况。有一个github问题专门讨论这个问题。那个讨论非常长,但最终得出结论:目前我们仍然需要使用自定义目标解决Razor视图预编译的问题。它基本上与文章中描述的方法相同,该文章由问题引用。
我已经设置了测试解决方案,其中包括ChildApplication和主MvcApplication,并使预编译视图在构建和发布中均可正常工作。
这是ChildApplication的csproj(跳过默认ASP.NET Core MVC项目的部分):

<PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
</PropertyGroup>

<!-- ... -->

<Target Name="SetMvcRazorOutputPath">
    <PropertyGroup>
        <MvcRazorOutputPath>$(OutputPath)</MvcRazorOutputPath>
    </PropertyGroup>
</Target>
<Target Name="_MvcRazorPrecompileOnBuild" DependsOnTargets="SetMvcRazorOutputPath;MvcRazorPrecompile" AfterTargets="Build" Condition=" '$(IsCrossTargetingBuild)' != 'true' " />
<Target Name="IncludePrecompiledViewsInPublishOutput" DependsOnTargets="_MvcRazorPrecompileOnBuild" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
    <ItemGroup>
        <_PrecompiledViewsOutput Include="$(MvcRazorOutputPath)$(MSBuildProjectName).PrecompiledViews.dll" />
        <_PrecompiledViewsOutput Include="$(MvcRazorOutputPath)$(MSBuildProjectName).PrecompiledViews.pdb" />
        <ContentWithTargetPath Include="@(_PrecompiledViewsOutput->'%(FullPath)')" RelativePath="%(_PrecompiledViewsOutput.Identity)" TargetPath="%(_PrecompiledViewsOutput.Filename)%(_PrecompiledViewsOutput.Extension)" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
</Target>

这是用于父级 MvcApplication 的 csproj 文件:

<!-- ... -->

<ItemGroup>
    <ProjectReference Include="..\ChildApplication\ChildApplication.csproj" />
</ItemGroup>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="xcopy &quot;$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll&quot; &quot;$(TargetDir)&quot; /Y /I" />
</Target>

<Target Name="AddPayloadsFolder" AfterTargets="Publish">
    <Exec Command="xcopy &quot;$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll&quot; &quot;$(PublishDir)&quot; /Y /I" />
</Target>

Dean North在他的原始文章中直接提到了使用预编译视图的程序集。

<ItemGroup>
    <Reference Include="DashboardExample.PrecompiledViews">
        <HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
    </Reference>
</ItemGroup>

这种方法并不完美,因为它使用使用特定配置(这里是Debug)构建的程序集。在我上面的项目文件中,我使用了单独的目标来在构建和发布过程中复制ChildApplication.PrecompiledViews.dll
这里有一个GitHub上的示例解决方案,包括父项目和子项目。

实际上,我确实使用了那个命令进行发布。它成功结束了,但是仍然没有预编译视图。 - Orvel
哇,感谢提供示例解决方案。我已经下载并尝试发布它。但是我收到了错误消息,指出无法复制ChildApplication.PrecompiledViews.dll文件,因为它不存在。确实如此,它不存在。我是否遗漏了什么? - Orvel
你是否在MvcApplication目录下运行了dotnet publish -c Release命令?对我来说,它完美地运行了。这是一个发布执行的截图,请与你的运行输出进行比较。 - CodeFuller
它正在工作,但奇怪的是precompiledviews.dll仍然无处可寻。它不应该在那里吗? - Orvel
他们不在那里。我甚至使用了Windows搜索功能(以防我眼瞎)。 - Orvel
显示剩余6条评论

2
我通常只需将它们添加到.csproj中即可,无需复制文件或任何混乱的操作。翻译后:我一般会把它们添加到.csproj文件中,不需要复制文件或其他麻烦的操作。
    <PropertyGroup>
       <TargetFramework>netcoreapp2.2</...
       ...
       <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
       <PreserveCompilationContext>true</PreserveCompilationContext>
    </PropertyGroup>

    <ItemGroup>
        ...
       <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0" />    
    </ItemGroup>

我在以下文章中看到:https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-2.2,将此值设置为true会禁用Razor SDK。如果我想迁移到Razor SDK,是否可以在不将MvcRazorCompileOnPublish设置为true的情况下自动进行视图预编译? - Jagjit Singh

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