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

时间:2018-03-30 18:50:00

标签: c# razor asp.net-core asp.net-core-mvc asp.net-core-2.0

我根据此article设置了我的解决方案。我遗漏了一些东西,因为根据this,ASP.NET Core 2.0默认预编译视图。最后,我将它发布到一个文件夹,该文件夹成功结束,但我的precompiledviews.dll丢失了。我尝试在.csproj中明确设置它,但没有运气。

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

2 个答案:

答案 0 :(得分:6)

我打赌你使用Self-contained deployment,即用

这样的命令发布
  

dotnet publish --conflease Release --runtime win-x64

导致可执行文件包含所有依赖项,包括.NET Core二进制文件。

Razor view compilation and precompilation文章包含以下警告:

  

执行a时,Razor视图预编译当前不可用   ASP.NET Core 2.0中的自包含部署(SCD)。该功能将   2.1发布时可用于SCD。

因此,如果您想使用预编译的Razor视图,则应使用Framework-dependent deployment,即使用以下命令发布:

  

dotnet publish --configuration Release

在这种情况下,Razor视图是预编译的(默认情况下),您会在其他应用程序二进制文件中找到YourAppName.PrecompiledViews.dll

更新(对于库项目中的预编译视图)

我的原始答案与通常的ASP.NET Core MVC应用程序有关,但问题是特定于项目库保存预编译视图(又称自包含UI)。

ASP.NET Core在发布期间默认预编译视图,但是对于存储在库项目中的视图不是这种情况。有github issue专门讨论这个问题。这个讨论相当长,但它ends up得出的结论是,目前我们仍然需要使用具有Razor Views预编译的自定义目标的解决方案。它基本上与问题引用的article中描述的方法相同。

我已使用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>

<{3}}中的Dean North添加了对预编译视图的程序集的直接引用。

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

这种方法并不完美,因为它使用了使用特定配置构建的程序集(Debug)。在上面的项目文件中,我使用了在构建和发布期间复制ChildApplication.PrecompiledViews.dll的单独目标。

以下是包含父项目和子项目的his original article

答案 1 :(得分:1)

我通常将这些添加到我的//Instantiate Appium Driver AndroidDriver<MobileElement> driver; try { driver = new AndroidDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), caps); } catch (MalformedURLException e) { System.out.println(e.getMessage()); } 中,对我来说就足够了。无需复制文件或任何混乱。

.csproj