es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se pudo ejecutar “sgen.exe” en VSBuild en Azure Pipelines.

Ejecutar la compilación localmente es bueno, no hay problemas en absoluto. Sin embargo, cuando ejecuté esto en un canalización de Azure, genera errores.

El mensaje de error detallado es:

La línea de comandos para la tarea “SGen” es demasiado larga. Es probable que las líneas de comandos que superen los 32000 caracteres fallen. Intenta reducir la longitud de la línea de comandos dividiendo la llamada a “SGen” en múltiples llamadas con menos parámetros por llamada. [D:\a\1\s\eFetch.Web.Core\eFetch.Web.Core.csproj]

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(3645,5): Error MSB6003: No se pudo ejecutar el ejecutable de tarea especificado “sgen.exe”. System.ComponentModel.Win32Exception (0x80004005): El nombre de archivo o la extensión es demasiado largo.

Imagen

VSBuild en Canalización de Azure

- task: VSBuild@1
  inputs:
    solution: '$(agent.builddirectory)\s$(Project1-Folder)$(Project1-Name).csproj'
    msbuildArgs: '/p:OutputPath="$(build.binariesDirectory)$(Project1-Folder)\bin" /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:SkipInvalidConfigurations=true /p:publishUrl="$(build.artifactStagingDirectory)$(Project1-Name)TempFolder"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

Hicimos una investigación. Lo que suele aparecer es configurar GenerateSerializationAssemblies en Auto o Off. Nuestro proyecto ya estaba en Auto, así que lo configuramos en Off, pero el error persiste.

¿Hay alguna forma de evitar las rutas largas de algunas referencias de DLL, como las siguientes?

  • referencia: “C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2\System.Xml.Linq.dll”
  • /reference: “C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2\Facades\System.Xml.ReaderWriter.dll”

Otro escenario sería realizar múltiples llamadas a sgen.exe, sin embargo, no estamos seguros de cómo hacerlo ya que sgen.exe se llama dentro de VSBuild / msbuild.exe.

Idealmente, preferiríamos no tener que desactivar GenerateXmlSerialization y simplemente hacer que funcione como debería.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para el error “La línea de comandos para la tarea “SGen” es demasiado larga” en Azure Pipeline

    Si encuentras el error “La línea de comandos para la tarea “SGen” es demasiado larga” al ejecutar tu compilación en una Azure Pipeline, es probable que se deba a que la línea de comandos para la tarea SGen es demasiado larga. Aquí tienes algunas posibles soluciones:

    1. Establece GenerateSerializationAssemblies en Off

    Si tu proyecto está actualmente configurado en GenerateSerializationAssemblies = Auto, intenta cambiarlo a Off. Para hacer esto, abre el archivo de tu proyecto en un editor de texto y agrega la siguiente línea:

      <propertygroup>
        <generateserializationassemblies>Off</generateserializationassemblies>
      </propertygroup>
    

    2. Acorta las rutas de algunas referencias DLL

    Otra posible solución es acortar las rutas de algunas de las referencias DLL. Por ejemplo:

      <itemgroup>
        <reference include="System.Xml.Linq">
          <hintpath>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xml.Linq.dll</hintpath>
        </reference>
        <reference include="System.Xml.ReaderWriter">
          <hintpath>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Facades\System.Xml.ReaderWriter.dll</hintpath>
        </reference>
      </itemgroup>
    

    3. Utiliza múltiples llamadas a SGen

    Por último, puedes intentar realizar múltiples llamadas a SGen.exe. Para hacer esto, agrega la siguiente línea a tu archivo de proyecto:

      <target name="AfterBuild">
        <exec command=""$(SdkToolsPath)sgen.exe" "$(TargetPath)""></exec>
      </target>
    

    Ten en cuenta que $(SdkToolsPath) es la ruta al directorio que contiene SGen.exe.

    Prueba estas soluciones y verifica si se resuelve el error.

Comments are closed.