Компиляция представления Razor не публикует AppName.PrecompiledViews.dll

TLDR; предварительная компиляция представления Razor на полной платформе (net471) работает только в том случае, если пакет nuget Microsoft.AspNetCore.Mvc.Razor.ViewCompilation добавлен непосредственно в проект, а не в другой пакет. Кто-нибудь знает способ обойти это?

У меня есть проект .net core 2.0 MVC, работающий на полной платформе (net471). Согласно docs, чтобы выполнить предварительную компиляцию представления в полнофункциональном приложении, необходимо включить пакет nuget Microsoft.AspNetCore.Mvc.Razor.ViewCompilation. Кажется, это работает ТОЛЬКО, если вы добавили пакет непосредственно в проект MVC. Если у вас есть этот пакет в другом пакете nuget, AppName.PrecompiledViews.dll никогда не будет опубликован.

Я развернул новый проект .net core MVC в Visual Studio, работающем на net471, со следующими пакетами. Все отлично работает, 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" />

Затем я создал библиотеку классов, добавил те же пакеты и объединил их в пакет nuget (назовем его CommonLib). Я создал второй проект .net core 2.0 MVC, работающий на net471, но вместо этого включил пакет nuget CommonLib. Все работает нормально, за исключением того, что при публикации нет AppName.PrecompiledViews.dll:

введите здесь описание изображения

Пакет CommonLib nuget для переноса всех зависимостей

Если затем я добавлю только пакет Microsoft.AspNetCore.Mvc.Razor.ViewCompilation непосредственно в проект с пакетом CommonLib, появится PrecompiledViews.dll:

введите здесь описание изображения

Я пытаюсь создать общий проект библиотеки классов, который содержит зависимости для моих проектов (включая основные компоненты .net), чтобы упростить обновление для всех распространенных микропроектов. Кому-нибудь повезло с этим?


person Kyle Dodge    schedule 29.04.2018    source источник
comment
эта ветка может помочь github.com/aspnet/Razor/issues/1809   -  person Set    schedule 29.04.2018


Ответы (1)


Для выполнения компиляции представления Razor необходимо включить специальные целевые объекты MSBuild, которые будут автоматически запускаться как часть процесса сборки вашего проекта. Эти задачи включены в пакет Microsoft.AspNetCore.Razor.ViewCompilation.

В настоящее время единственный способ предоставить дополнительные целевые объекты MSBuild с помощью NuGet — это явная ссылка на пакет. У целей сборки нет переходного свойства, поэтому вам всегда придется явно ссылаться на пакет, чтобы активировать эти цели для вашего проекта.


Я только что нашел эту проблему на GitHub, которая предполагает, что цели сборки уже транзитивно перемещаются вверх project, но на самом деле я не нашел способа вызвать такое поведение.

person poke    schedule 29.04.2018