Razor 视图编译不发布AppName.PrecompiledViews.dll

Razor view compilation does not publish AppName.PrecompiledViews.dll

TLDR; 完整框架 (net471) 上的 Razor 视图预编译似乎仅在 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation nuget 包直接添加到项目而不是另一个包中时才有效。有人知道解决这个问题的方法吗?

我在完整框架 (net471) 上有一个 .net core 2.0 MVC 项目 运行。根据 docs,为了在完整框架应用程序上执行视图预编译,您需要包含 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation nuget 包。这似乎只有在您将包直接添加到 MVC 项目时才有效。如果您在另一个 nuget 包中有此包,则 AppName.PrecompiledViews.dll 永远不会发布。

我在 net471 上的 visual studio 运行 中使用以下包启动了一个新的 .net 核心 MVC 项目。一切正常,dll 出现并且性能表明视图已正确编译:

参考包:

<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.2" />

接下来我创建了一个 class 库,添加了相同的包并将其捆绑在一个 nuget 包中(我们称之为 CommonLib)。我在 net471 上创建了第二个 .net core 2.0 MVC 项目 运行,但包含了 CommonLib nuget 包。一切正常,除了发布时没有 AppName.PrecompiledViews.dll:

如果我随后仅将 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation 包直接添加到带有 CommonLib 包的项目中,则会显示 PrecompiledViews.dll:

我正在尝试创建一个通用 class 库项目,其中包含我的项目(包括 .net 核心组件)的依赖项,以简化所有通用微型项目的升级。有没有人有幸这样做?

为了将 Razor 视图编译为 运行,您需要包含特殊的 MSBuild 目标,这些目标将自动 运行 作为项目构建过程的一部分。这些任务包含在 Microsoft.AspNetCore.Razor.ViewCompilation 包中。

目前,使用 NuGet 公开其他 MSBuild 目标的唯一方法是显式引用包。构建目标没有传递性 属性,因此您必须始终明确引用包才能为您的项目激活这些目标。


我刚刚发现 this issue on GitHub 这表明构建目标已经传递到顶级项目,但实际上我还没有找到触发此行为的方法。