Pregunta

Tengo un archivo de proyecto msbuild que se utiliza para crear varios proyectos de C ++ (* .vcproj). Aquí hay una parte de un archivo de proyecto típico, en el que las variables de entorno global para la compilación se anulan como propiedades:

<PropertyGroup>
  <MYBINDIR>d:\buildsysroot\bin</MYBINDIR>
  <MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR>
  ...
</PrpertyGroup>

<ItemGroup>
  <MyItems Include="d:\buildsysroot\myproject\myproject.vcproj"/>
</ItemGroup>

<Target Name="Release_x64">
  <VCBuild Projects="@(MyItems)" Configuration="Release_dll|x64"/>
</Target>

Estas variables de entorno son utilizadas por todos los archivos vcproj, a través de hojas de propiedades. Aquí hay un extracto de un vcproj:

<Configuration
  Name="Release_dll|x64"
  ConfigurationType="1"
  InheritedPropertySheets="$(BUILDPROPSDIR)\defaults.vsprops;$(BUILDPROPSDIR)\build_dll.vsprops"
>

Y así es como se ven las hojas de propiedades:

<VisualStudioPropertySheet
  Name="defaults"
  OutputDirectory="$(MYBINDIR)\_$(ConfigurationName)_$(PlatformName)"
  IntermediateDirectory="$(MYBUILDDIR)_$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
  >
  <Tool
    Name="VCLinkerTool"
    AdditionalLibraryDirectories="&quot;$(MYLIBDIR)&quot;"
  />
<VisualStudioPropertySheet/>

El problema es: al generar, el valor de las variables de entorno declaradas en el archivo msbuild (MYBINDIR, MYLIBDIR) no se incluye en las hojas de propiedades, sino que parece ser local solo para el archivo msbuild: dentro del proyecto msbuild MYBINDIR se expande a " d: \ buildsysroot \ bin " ;, pero dentro del proyecto vc MYBINDIR se expande a " d: \ projects \ bin " ;, que es el valor que configuré globalmente (por ejemplo, a través de MyComputer- > Advanced- > EnvironmentVariables) y que deben permanecer allí porque es así como se configura mi entorno de desarrollo principal.

¿Cómo paso el entorno establecido en el archivo msbuild a la tarea VCBuild?

Sé que este problema podría resolverse utilizando un archivo de proceso por lotes y declarando el entorno utilizando "set", y no en el archivo msbuild; así es como solía hacerlo, pero prefiero el método anterior, ya que es solo una llamada a msbuild con un argumento y eso es todo.

EDIT

Necesitaba una solución rápidamente y se me ocurrió una tarea personalizada que establece el entorno de la misma manera que lo haría un archivo por lotes, pero con la ventaja de hacerlo dentro de msbuild .. El método Execute () de las tareas simplemente hace el entorno. SetEnvironmentVariable (var, val). Esto aún requiere configurar el entorno del proceso, ¡me alegraría saber si hay otra manera!

¿Fue útil?

Solución

como nadie más respondió / comentó, voy con mi propia respuesta: una tarea personalizada que establece el entorno del proceso usando Environment.SetEnvironmentVariable (var, val)

Otros consejos

No sé si esto va a lo que estás tratando de hacer. ¿Pero has probado el " Anular " atributo en la tarea VCBuild? No es demasiado obvio cómo usarlo. Pero hice que VS creara un .vsprops para mí con los atributos que me importaban (OutputDirectory e IntermediateDirectory). Luego edité el archivo .vcproj para eliminar el atributo InheritedPropertySheets que había agregado. Luego agregué un atributo de Anulación a la tarea VCBuild en mi archivo MSBuild. Eso parece haberme dado el comportamiento que estaba buscando. Sin embargo, podría ser un problema diferente ...

Donnie

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top