【问题标题】:Why is Microsoft.CodeAnalysis published with ASP.NET Core website?为什么 Microsoft.CodeAnalysis 与 ASP.NET Core 网站一起发布?
【发布时间】:2019-10-08 17:18:28
【问题描述】:

我正在发布一个 ASP.NET Core MVC 3.0 网站,并且输出文件夹包含大量对 Microsoft.CodeAnalysis 库的多种语言的引用,有人知道为什么吗?

当然FxCopAnalyzersNuget 包安装在项目上,但它没有在项目的早期版本中发布,所以我不明白为什么它现在,因为它应该只在开发时有用而不是在生产环境中。

【问题讨论】:

  • 这似乎与 .net core 3 编译发表意见有关,但我不确定

标签: asp.net-core fxcop microsoft.codeanalysis


【解决方案1】:

对我来说,*.csproj 文件中的这一行以某种方式解决了这个问题。它仍然部署Microsoft.CodeAnalysis,但仅用于en

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

有关 Github 问题,请参阅 the comment(作者 Jonathon Marolf)。

【讨论】:

  • 这在 ASP.Net Core 3.0 上对我有用,并阻止了国家文件夹。是否可以阻止我不需要的“运行时”文件夹的子文件夹(unix等)?
  • @Gen1-1 请参阅有关 .NET Core 2.1 的问题:stackoverflow.com/questions/53507229/…
  • 谢谢。所以发布的时候是可以的,但是我想你不能在简单的构建/编译时阻止浪费的文件夹。
【解决方案2】:

这是我试图使解决方案更容易看到的看法。

问题很可能是使用了AddRazorRuntimeCompilation()。更具体地说,在 startup.cs 中,您可能会像这样添加 razor 运行时编译:

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 库仅在调试模式下编译时才会出现。所以现在,当您使用发布模式发布时,它们不会成为输出的一部分。

【讨论】:

  • IWebHostEnvironment(上例中的环境)在 ConfigureServices() 中并不容易获得,但您可以很容易地显示它。 stackoverflow.com/questions/37660043/…
  • @AntonioNicolaasTeyken 非常棒的补充,这是一个我没有意识到我掩盖的重要细节。
【解决方案3】:

就我而言,问题是“Microsoft.VisualStudio.Web.CodeGeneration.Design”。我需要更改“.csproj”文件中的包引用以包含ExcludeAssets="all"

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />

【讨论】:

  • 像往常一样 - 最佳答案最后一个
  • 在一个 ASP.NET Core 3.1 项目中,我没有看到任何 &lt;PackageReference&gt;Microsoft.VisualStudio.Web.CodeGeneration.Design,很遗憾。
【解决方案4】:

包含大量对 Microsoft.CodeAnalysis 库的多种语言参考

我在使用 3.0 版本时确实遇到了同样的问题。但我不认为这是由 .net core 3 编译发布视图引起的,因为在 release/2.1 分支中也有 View ViewCompilation


它应该只在开发时有用,而不是在生产环境中。

  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”)使用的共享包。如果你下载这个包并手动解压这个lib,你会发现有一个Microsoft.CodeAnalysis.dll

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

    此包仅在开发时需要。如果您不删除此依赖项,您将在您的发布文件夹中获得大量与Microsoft.CodeAnalysis 相关的 dll。

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

    删除那些依赖于Microsoft.CodeAnalysis的包,然后你应该不会得到与Microsoft.CodeAnalysis相关的dll:

【讨论】:

  • 如何查看哪个包直接或间接依赖于 Microsoft.CodeAnalysis ?
  • 好的,就像你说的 Microsoft.VisualStudio.Web.CodeGeneration.Design 包依赖于它一样。通过将 PrivateAssets 属性设置为 all,Microsoft.CodeAnalysis 文件不再位于已发布的项目中。只是不确定代码生成是否仍然可以正常工作,因为现在项目的依赖项列表中的包上方有一个黄色三角形。
  • @Jonathan 你只在开发期间需要这个包。实际上,如果您不需要脚手架功能,例如使用VSCode,你根本不会添加这样的依赖。
  • @Jonathan 如果需要脚手架,在使用VS的时候会重新安装包。如果您使用的是 VSCode/CLI,则必须在调用 dotnet aspnet-codegenerator controlller ... 之前添加这样的包
【解决方案5】:

我不使用 Razor 编译,但仍然遇到同样的问题。我结合了这里的答案来解决它。对csproj,我先加了这个:

<PropertyGroup>
    <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

并将实际项目更改为:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.4" 
    Condition="'$(Configuration)' == 'Debug'" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2019-06-05
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2011-05-19
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多