为什么在ASP.NET Core网站上发布Microsoft.CodeAnalysis?


13

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

当然,FxCopAnalyzersNuget软件包已安装在项目上,但未在项目的早期版本中发布,所以我不明白现在为什么这样做,因为它仅在开发时才有用,而不在生产环境中有用。


它似乎与.net core 3在发布时的编译视图有某种联系,但我不确定
Jonathan

Answers:


5

包含许多以多种语言引用的Microsoft.CodeAnalysis库

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


它仅在开发时有用,而不在生产环境中有用。

  1. 我相信你是对的。这些分析只能在devtime上使用。

  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
    │└───...
    ├───包装/
    │└────...
    └───_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),则根本不会添加此类依赖项。
itminus

@Jonathan如果需要脚手架,则在使用VS时,将再次安装该软件包。如果您使用的是VSCode / CLI,则必须在调用之前添加这样的程序包dotnet aspnet-codegenerator controlller ...
减了

10

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

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

请参阅有关Github问题的评论(乔纳森·马洛夫(Jonathon Marolf))。


这对我在ASP.Net Core 3.0上有效,并且阻止了国家(地区)文件夹。是否可以防止不需要的“运行时”文件夹的子文件夹(unix等)?
Gen1-1

@ Gen1-1请参阅此问题对于.NET 2.1的核心:stackoverflow.com/questions/53507229/...
mrmowji

谢谢。因此有可能在发布时使用,但我想您仅在构建/编译时就无法防止浪费的文件夹。
1

3

这是我的尝试,以使解决方案更易于查看。

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

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

为了支持这一点,您的Web项目可能参考了 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

那个nuget包依赖Microsoft.CodeAnalysis于在publish文件夹中产生所有不需要的输出。

解决方法是编辑项目文件,并使依赖项在Debug模式下成为条件,如下所示:

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


1
IWebHostEnvironment(在上面的示例中为Env)在ConfigureServices()中不可用,但是您可以很容易地将其显示出来。stackoverflow.com/questions/37660043/...
安东尼奥·尼古拉斯Teyken

@AntonioNicolaasTeyken出色的补充,这是我没意识到的一个重要细节。
罗恩C

0

也许这可以对某人有所帮助,就我而言,问题是“ Microsoft.VisualStudio.Web.CodeGeneration.Desig”,我需要更改“ .csproj”文件中的包引用以包括ExcludeAssets =“ all”:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.