¿Por qué se publica Microsoft.CodeAnalysis con el sitio web ASP.NET Core?

13

Estoy publicando un sitio web ASP.NET Core MVC 3.0 y la carpeta de salida contiene muchas referencias en muchos idiomas a Microsoft.CodeAnalysisbibliotecas, ¿alguien sabe por qué?

Por supuesto, el FxCopAnalyzerspaquete Nuget está instalado en el proyecto, pero no se publicó en una versión anterior del proyecto, por lo que no entiendo por qué es ahora, ya que debería ser útil solo en el momento del desarrollo, no en un entorno de producción.

Jonathan
fuente
Parece estar relacionado de alguna manera con las vistas de compilación de .net core 3 en la publicación, pero no estoy seguro
Jonathan

Respuestas:

5

contiene muchas referencias en muchos idiomas a las bibliotecas de Microsoft CodeAnalysis

Encontré el mismo problema cuando utilicé la versión 3.0. Pero no creo que sea causado por .net core 3 compilando vistas en la publicación porque también hay View ViewCompilation en la release/2.1rama.


debería ser útil solo en el momento del desarrollo, no en un entorno de producción.

  1. Creo que tienes razón. Estos análisis deben usarse solo en tiempo de desarrollo.

  2. Pero cuando desinstalo el SDK (3.0) manualmente e instalo el último SDK nuevamente , no puedo reproducir más. No sé por qué sucede, tal vez ya se ha solucionado. Es más probable que sea causado por otra razón: agregué una referencia adicional en otros paquetes que depende de Microsoft.CodeAnalysis por accidente). De todos modos, primero actualice su SDK a la última versión.

  3. Otra cosa importante es que, cuando use Visual Studio para agregar un controlador, agregará una referencia Microsoft.VisualStudio.Web.CodeGeneration.Designautomáticamente. Tenga en cuenta que este paquete depende Microsoft.CodeAnalysis.Commonindirectamente del paquete. Aquí Microsoft.CodeAnalysis.Commonhay un paquete compartido utilizado por la plataforma compiladora de Microsoft .NET ("Roslyn"). Si descarga este paquete y descomprime esta lib manualmente, encontrará que hay un Microsoft.CodeAnalysis.dll:

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

    Este paquete solo es necesario en Dev-Time. Si no elimina esta dependencia, obtendrá bastantes dlls relacionados Microsoft.CodeAnalysisen su carpeta de publicación.

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

    Elimine los paquetes que dependen Microsoft.CodeAnalysis, y luego no debería obtener Microsoft.CodeAnalysisdlls relacionados:

    ingrese la descripción de la imagen aquí

itminus
fuente
¿Cómo puedo ver qué paquete tiene dependencia directa o indirecta a Microsoft.CodeAnalysis?
Jonathan
ok, es como dijiste el paquete Microsoft.VisualStudio.Web.CodeGeneration.Design que depende de él. Al establecer la propiedad PrivateAssets en todos, los archivos Microsoft.CodeAnalysis ya no están en el proyecto publicado. Simplemente no estoy seguro de si la generación de código seguirá funcionando bien porque ahora hay un triángulo amarillo sobre el paquete en la lista de dependencias del proyecto.
Jonathan
@ Jonathan Solo necesita este paquete durante el tiempo de desarrollo. En realidad, si no necesita la función de andamiaje, por ejemplo, usando VSCode, no agregará dicha dependencia en absoluto.
itminus
@ Jonathan Si necesita andamios, cuando use VS, el paquete se instalará nuevamente. Si está usando VSCode / CLI, debe agregar dicho paquete antes de invocarlodotnet aspnet-codegenerator controlller ...
itminus
10

Para mí, esta línea dentro del *.csprojarchivo resolvió el problema de alguna manera. Todavía implementa el Microsoft.CodeAnalysis, pero solo para en:

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

Vea el comentario (por Jonathon Marolf) sobre el tema de Github.

mrmowji
fuente
Esto funcionó para mí en ASP.Net Core 3.0 y evitó las carpetas de país. ¿Es posible evitar las subcarpetas de la carpeta "runtimes" que no necesito (unix, etc.)?
Gen1-1
@ Gen1-1 Consulte esta pregunta sobre .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji
Gracias. Por lo tanto, es posible al publicar, pero supongo que no puede evitar las carpetas desperdiciadas cuando simplemente compila / compila.
Gen1-1
3

Aquí está mi opinión al tratar de hacer que la solución sea más fácil de ver.

El problema, más que probable es el uso de AddRazorRuntimeCompilation(). Más específicamente, en el startup.cs es probable que agregue la compilación de tiempo de ejecución de la maquinilla de afeitar de esta manera:

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

y para respaldar eso, su proyecto web probablemente tenga una referencia a Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Ese paquete nuget depende de Microsoft.CodeAnalysisque esté produciendo toda esa salida no deseada en la carpeta de publicación.

La solución es editar el archivo del proyecto y hacer que la dependencia sea condicional en el modo de depuración de la siguiente manera:

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

y luego en el archivo startup.cs condicionalmente llame AddRazorRuntimeCompilation()así:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Esto hará que todas esas Microsoft.CodeAnalysisbibliotecas solo estén fuera cuando se compile en modo de depuración. Entonces, cuando publique usando el modo Release, no serán parte de la salida.

Ron C
fuente
1
IWebHostEnvironment (Env en el ejemplo anterior) no está fácilmente disponible en ConfigureServices (), sin embargo, puede revelarlo con bastante facilidad. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken
@AntonioNicolaasTeyken Excelente adición, ese es un detalle importante que no me di cuenta que pasé por alto.
Ron C
0

Tal vez esto pueda ayudar a alguien, en mi caso el problema fue "Microsoft.VisualStudio.Web.CodeGeneration.Desig", necesitaba cambiar la referencia del paquete en el archivo ".csproj" para incluir ExcludeAssets = "all":

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