我已经为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)时,就不再使用编译回调。
虽然这对我来说很合理(经过一番努力之后,但我不知道如何/在何处配置预编译任务。
我终于找到了解决方法...
在.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>
不太容易(至少到目前为止我什么都没找到)。但是,您可以使用类似的方法在生成剃刀(创建* .g.cs-文件)和对其进行编译之间获取代码。
<Target Name="_DoSomethingSpecial" AfterTargets="PrepareForRazorCompile" BeforeTargets="RazorCoreCompile">
<!-- ... -->
</Target>
此时,您可以使用自定义msbuild任务来检查或修改生成的代码(和/或源代码)。源文件存储在@(RazorCompile)
中,相关性存储在@(RazorReferencePath)
....