Почему Microsoft.CodeAnalysis публикуется на веб-сайте ASP.NET Core?

13

Я публикую сайт ASP.NET Core MVC 3.0, и выходная папка содержит множество ссылок на Microsoft.CodeAnalysisбиблиотеки на многих языках , кто-то знает почему?

Конечно, FxCopAnalyzersпакет Nuget установлен в проекте, но он не был опубликован в более ранней версии проекта, поэтому я не понимаю, почему это так, поскольку он должен быть полезен только во время разработки, а не в производственной среде.

Джонатан
источник
Это , кажется, каким - то образом связано с .net сердечнике 3 компиляции взглядов на публикацию , но я не уверен
Джонатан

Ответы:

5

содержит множество ссылок на многих языках на библиотеки Microsoft.CodeAnalysis

Я столкнулся с той же проблемой, когда использовал версию 3.0. Но я не думаю , что это вызвано .net ядро 3 компилирования взглядов на публикацию , потому что есть также вид ViewCompilation в release/2.1отрасли.


это должно быть полезно только во время разработки, а не в производственной среде.

  1. Я верю, что ты прав. Эти Анализы должны использоваться только во время разработки.

  2. Но когда я удаляю SDK (3.0) вручную и снова устанавливаю последний SDK , я не могу больше не воспроизводить. Я не знаю, почему это происходит, может быть, это было исправлено сейчас. Скорее всего, это вызвано другой причиной: я случайно добавил дополнительную ссылку на другие пакеты, которая зависит от Microsoft.CodeAnalysis ). В любом случае, пожалуйста, сначала обновите ваш SDK до последней версии.

  3. Еще одна важная вещь: при использовании Visual Studio для добавления контроллера он автоматически добавит ссылку Microsoft.VisualStudio.Web.CodeGeneration.Design. Обратите внимание, что этот Microsoft.CodeAnalysis.Commonпакет косвенно зависит от пакета. Здесь Microsoft.CodeAnalysis.Commonэто общий пакет, используемый платформой компилятора Microsoft .NET («Roslyn»). Если вы скачаете этот пакет и разархивируете эту библиотеку вручную, вы обнаружите, что есть Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    │ └───netstandard2.0 /
    │ ├─── ...
    │ ├─── Microsoft.CodeAnalysis.dll
    │ ├─── Microsoft.CodeAnalysis.pdb
    │ ├─── Microsoft.CodeAnalysis.xml
    │ └─── ...
    ├───package /
    │ └─── ...
    └───_rels /
    

    Этот пакет необходим только в Dev-Time. Если вы не удалите эту зависимость, вы получите довольно много dll, связанных с Microsoft.CodeAnalysisвашей папкой публикации.

    <ItemGroup>
        <!-- this is not necessary when publishing -->
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
    </ItemGroup>

    Удалите те пакеты, от которых зависит Microsoft.CodeAnalysis, и тогда у вас не должно быть Microsoft.CodeAnalysisсвязанных dll:

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

itminus
источник
Как я могу увидеть, какой пакет имеет прямую или косвенную зависимость от Microsoft.CodeAnalysis?
Джонатан
хорошо, это как вы сказали, что пакет Microsoft.VisualStudio.Web.CodeGeneration.Design зависит от него. Если для свойства PrivateAssets установлено значение all, файлы Microsoft.CodeAnalysis больше не публикуются. Просто не уверен, что генерация кода все еще будет работать нормально, потому что теперь в списке зависимостей проекта есть желтый треугольник над пакетом.
Джонатан
@Jonathan Этот пакет нужен вам только во время разработки. На самом деле, если вам не нужна функция скаффолдинга, например, с использованием VSCode, вы вообще не добавите такую ​​зависимость.
itminus
@Jonathan Если вам нужны леса, при использовании VS, пакет будет установлен снова. Если вы используете VSCode / CLI, вы должны добавить такой пакет перед dotnet aspnet-codegenerator controlller ...
вызовом
10

Для меня эта строка внутри *.csprojфайла как-то решила проблему. Это все еще развертывает Microsoft.CodeAnalysis, но только для en:

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

Смотрите комментарий (Джонатон Марольф) по проблеме Github.

mrmowji
источник
Это сработало для меня на ASP.Net Core 3.0 и предотвратило папки стран. Можно ли предотвратить ненужные мне подпапки папки "runtimes" (unix и т. Д.)?
Gen1-1
@ Gen1-1 Пожалуйста, смотрите этот вопрос относительно .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji
Спасибо. Так что это возможно при публикации, но я думаю, вы не можете предотвратить потерянные папки при простой сборке / компиляции.
Gen1-1
3

Вот моя попытка сделать решение легче увидеть.

Проблема, скорее всего, заключается в использовании AddRazorRuntimeCompilation(). В частности, в файле startup.cs вы, вероятно, добавите сборку времени выполнения бритвы следующим образом:

     IMvcBuilder builder = services.AddControllersWithViews()
                          .AddRazorRuntimeCompilation(); 

и чтобы поддержать это, ваш веб-проект, вероятно, имеет ссылку на Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Этот пакет nuget зависит от Microsoft.CodeAnalysisтого, производит ли этот нежелательный вывод в папке публикации.

Исправление состоит в том, чтобы отредактировать файл проекта и сделать зависимость зависимой в режиме отладки следующим образом:

    <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" 
Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
  </ItemGroup>

а затем в файле startup.cs условно вызвать AddRazorRuntimeCompilation()так:

    IMvcBuilder builder = services.AddControllersWithViews();

     #if DEBUG
            if (Env.IsDevelopment()) {
                builder.AddRazorRuntimeCompilation();
            }
      #endif

Это приведет к тому, что все эти Microsoft.CodeAnalysisбиблиотеки будут отсутствовать только при компиляции в режиме отладки. Так что теперь, когда вы публикуете в режиме Release, они не будут частью вывода.

Рон С
источник
1
IWebHostEnvironment (Env в приведенном выше примере) не всегда доступен в ConfigureServices (), хотя вы можете раскрыть его довольно легко. stackoverflow.com/questions/37660043/…
Антонио Николаас Тейкен
@AntonioNicolaasTeyken Отличное дополнение, это важная деталь, о которой я даже не догадывался.
Рон С
0

Может быть, это может кому-то помочь, в моем случае проблема была "Microsoft.VisualStudio.Web.CodeGeneration.Desig", мне нужно было изменить ссылку на пакет в файле ".csproj", чтобы включить ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Эдуардо Тейшейра
источник