预编译视图和CompilationCallback

时间:2018-01-17 20:11:31

标签: asp.net razor asp.net-core-2.0

我为我的MVC视图定义了一个编译回调,比如

var mvc = services.AddMvc();
mvc.AddRazorOptions(razorSetup => {
    razorSetup.CompilationCallback = context => {
        // context.Compilation = context.Compilation.AddReferences(...)
    };
});

这很好用 - 而且在调试时没有问题 - 但是当构建工具预编译视图(and as of asp.net core 2, precompiling is the default behavior)时,编译回调就不再使用了。

虽然这对我来说非常有意义(经过一段时间的努力),但我不知道如何/在哪里可以配置预编译任务。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法...

.net核心2

在.net core 2中,您可以向编译期间使用的重做文件添加--configure-compilation-type=-Option。该值应为实现Microsoft.AspNetCore.Mvc.IDesignTimeMvcBuilderConfiguration的完全限定类型(不确定是否必须使用此处,或是否具有此处的Configure-method足够)

添加可以通过

完成
<Target Name="_AddMvzRazorPrecompileOptions" AfterTargets="_CreateResponseFileForMvcRazorPrecompile">
    <Error Condition="!Exists($(_MvcRazorResponseFilePath))" Text="File $(_MvcRazorResponseFilePath) does not exist" />

    <ItemGroup>
        <_Option Include="--configure-compilation-type=KlugeSoftware.Web.ViewTranslator.PrecompileFactory, KlugeSoftware.Web.ViewTranslator" />
    </ItemGroup>

    <WriteLinesToFile File="$(_MvcRazorResponseFilePath)" Lines="@(_Option)" Overwrite="false" />
</Target>

.net核心3

并不是那么容易(至少到目前为止我什么都没找到)。但是,您可以使用类似的方法在生成剃刀(创建* .g.cs-文件)和对其进行编译之间获取代码。

<Target Name="_DoSomethingSpecial" AfterTargets="PrepareForRazorCompile" BeforeTargets="RazorCoreCompile">
    <!-- ... -->
</Target>

这时,您可以使用自定义msbuild任务来检查或修改生成的代码(和/或源代码)。 源文件存储在@(RazorCompile)中,依赖项存储在@(RazorReferencePath)中。...