Orv*_*vel 8 c# razor asp.net-core-mvc asp.net-core asp.net-core-2.0
我根据这篇文章设置了我的解决方案.我遗漏了一些东西,因为根据这个,ASP.NET Core 2.0默认预编译视图.最后,我将它发布到一个文件夹,该文件夹成功结束,但我的precompiledviews.dll丢失了.我尝试在.csproj中明确设置它,但没有运气.
编辑:解决方案中的两个项目都只是默认的MVC模板.
我打赌你使用自包含部署,即用命令发布
dotnet发布 - 配置发布 - 运行时win-x64
这导致可执行文件包含所有依赖项,包括.NET Core二进制文件.
Razor视图编译和预编译文章包含以下警告:
在ASP.NET Core 2.0中执行自包含部署(SCD)时,Razor视图预编译当前不可用.2.1版本发布时,该功能将适用于SCD.
因此,如果要使用预编译的Razor视图,则应使用依赖于框架的部署,即使用以下命令进行发布:
dotnet发布 - 配置发布
在这种情况下,Razor视图是预编译的(默认情况下),您将YourAppName.PrecompiledViews.dll在其他应用程序二进制文件中找到.
更新(对于库项目中的预编译视图)
我的原始答案与通常的ASP.NET Core MVC应用程序有关,但问题是特定于项目库保存预编译视图又称自包含UI.
ASP.NET Core在发布期间默认预编译视图,但是库项目中存储的视图不是这种情况.有一个专门针对这个问题的github问题.这个讨论相当长,但最终得出的结论是,目前我们仍然需要使用具有Razor Views预编译的自定义目标的解决方案.它基本上与问题引用的文章中描述的方法相同.
我已经设置了测试解决方案ChildApplication和main MvcApplication,并使预编译视图同时用于构建和发布.
这是csproj for ChildApplication(跳过默认的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>
Run Code Online (Sandbox Code Playgroud)
这是父母的csproj MvcApplication:
<!-- ... -->
<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>
Run Code Online (Sandbox Code Playgroud)
Dean North在他的原始文章中添加了对预编译视图的装配的直接引用.
<ItemGroup>
<Reference Include="DashboardExample.PrecompiledViews">
<HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
</Reference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
这种方法并不完美,因为它使用了使用特定配置构建的程序集(Debug此处).在上面的项目文件中,我使用ChildApplication.PrecompiledViews.dll在构建和发布期间复制的单独目标.
这是GitHub上的Sample Solution,包含父项目和子项目.