我根据这个article设置我的解决方案。我省略了一些内容,因为根据this,默认情况下,asp.net core 2.0预编译视图。最后,我将其发布到一个文件夹中,该文件夹将成功结束,但缺少precompiledviews.dll。我试着在csproj中显式地设置它,但是没有运气。
编辑:解决方案中的两个项目都只是默认的mvc模板。
最佳答案
我敢打赌您使用Self-contained deployment,即使用类似命令的publish
dotnet发布--配置发布--运行时win-x64
这将生成包含.NET核心二进制文件在内的所有依赖项的可执行文件。
Razor view compilation and precompilation文章包含以下警告:
在执行
ASP.NET Core 2.0中的自包含部署(SCD)。功能将
2.1版本时可用于SCD。
因此,如果要使用预编译的razor视图,则应使用Framework-dependent deployment,即使用以下命令发布:
dotnet发布--配置发布
在本例中,razor视图是预编译的(默认情况下),您将在其他应用程序二进制文件中找到YourAppName.PrecompiledViews.dll
。
更新(用于库项目中的预编译视图)
我最初的答案与通常的asp.net核心mvc应用程序有关,但是这个问题是特定于保存预编译视图(也称为自包含ui)的项目库的。
默认情况下,在发布期间,ASP.NET Core会预编译视图,但对于存储在库项目中的视图,情况并非如此。有一个github issue专门讨论这个问题。这个讨论相当长,但是它ends up的结论是,目前我们仍然需要使用带有定制目标的解决方案来预编译razor视图。它基本上与问题引用的article中描述的方法相同。
我已经用ChildApplication
和mainMvcApplication
设置了测试解决方案,并使预编译的视图对构建和发布都有效。
以下是ChildApplication
的csproj(跳过默认asp.net核心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>
这是家长的CSPROJ:
<!-- ... -->
<ItemGroup>
<ProjectReference Include="..\ChildApplication\ChildApplication.csproj" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy "$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll" "$(TargetDir)" /Y /I" />
</Target>
<Target Name="AddPayloadsFolder" AfterTargets="Publish">
<Exec Command="xcopy "$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll" "$(PublishDir)" /Y /I" />
</Target>
dean north inhis original article使用预编译视图添加对程序集的直接引用。
<ItemGroup>
<Reference Include="DashboardExample.PrecompiledViews">
<HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
</Reference>
</ItemGroup>
这种方法并不完美,因为它使用的是用特定配置构建的程序集(
MvcApplication
)。在上面的项目文件中,我使用在构建和发布期间复制Debug
的单独目标。这里有Sample Solution on GitHub的父项目和子项目。