¿Cómo puedo evitar que los archivos de MSBuild externos de ser cacheada (por Visual Studio) durante una generación de proyecto?

StackOverflow https://stackoverflow.com/questions/2903803

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo un proyecto en mi solución, que comenzó su vida como un proyecto de biblioteca de C #. No tiene nada de cualquier interés en ella en términos de código, se utiliza simplemente como una dependencia de los otros proyectos en la solución con el fin de asegurarse de que está construido. Uno de los efectos secundarios de la construcción de este proyecto es que un AssemblyInfo.cs compartidos se crea que contiene el número de versión en uso por los otros proyectos.

he hecho esto mediante la adición del siguiente al archivo .csproj:

<ItemGroup>
  <None Include="Properties\AssemblyInfo.Shared.cs.in" />
  <Compile Include="Properties\AssemblyInfo.Shared.cs" />
  <None Include="VersionInfo.targets" />
</ItemGroup>
<Import Project="$(ProjectDir)VersionInfo.targets" />
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" />

El archivo de referencia, VersionInfo.targets, contiene lo siguiente:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--
      Some properties defining tool locations and the name of the
      AssemblyInfo.Shared.cs.in file etc.
    -->
  </PropertyGroup>
  <Target Name="UpdateSharedAssemblyInfo">
    <!--
      Uses the Exec task to run one of the tools to generate
      AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in
      and some of the other properties.
    -->
  </Target>
</Project>

El contenido del archivo VersionInfo.targets podría simplemente ser embebido dentro del archivo .csproj pero es externa porque estoy tratando de convertir todo esto en una plantilla de proyecto. Quiero que los usuarios de la plantilla para poder añadir el nuevo proyecto a la solución, editar el archivo VersionInfo.targets, y ejecutar la construcción.

El problema es que modificar y guardar el archivo VersionInfo.targets y la reconstrucción de la solución no tiene ningún efecto - el archivo de proyecto utiliza los valores del archivo .targets como lo eran cuando se abre el proyecto. Incluso descargar y cargar el proyecto no tiene ningún efecto. Con el fin de obtener los nuevos valores, necesito cerrar Visual Studio y volver a abrirlo (o recargar la solución).

¿Cómo puedo configurar esto por lo que la configuración es externo al archivo .csproj y no en caché entre construye?

¿Fue útil?

Solución

He acaba de responder lo que parece ser una pregunta similar en este sentido.

Cómo dar vuelta almacenamiento en caché fuera de definiciones de compilación en Visual Studio

Es de esperar que sea relevante su problema también.

Otros consejos

Por lo que yo sé, no se puede. Visual Studio no está utilizando 'real' MSBuild, que utiliza un motor de generación interna que se comporta muy similares a MSBuild.exe, pero todavía tienen algunas diferencias sutiles. Este motor de generación almacena en caché los objetivos, por lo que es necesario reiniciar VS una vez que cambie algo. Creo, incluso está documentado en alguna parte, y no hay ninguna solución alternativa se conoce (Busqué que hace un año y no encontró nada).

posiblemente podría obligar a los SV para recargar los objetivos a través de la API VS - así, usted tiene que crear (o encontrar) una costumbre complemento para hacer esto

.

Otra opción es utilizar algo distinto de archivo .targets para almacenar su configuración. Por ejemplo, se puede utilizar un archivo de texto plano y analizar con MSBuild (no es que elegante, pero debería funcionar).

UPD.

Eso es lo que hice hace algún tiempo. MSBuild llama a una herramienta externa a través Exec con WorkingDirectory = "$ (SolutionDir)", la función "conoce" todas las convenciones sobre nombres de archivo, ubicaciones, etc., por lo que un directorio de trabajo es suficiente para hacer el trabajo. datos de configuración Varios se almacena en config de la herramienta externa, por lo que no hay problemas con el almacenamiento en caché.

Además, echar un vistazo a esta pregunta acerca de los elementos de lectura desde un archivo. Supongo, que los mejores habitaciones sus necesidades.

he tenido cierto éxito intermitente modificando el archivo de proyecto que incluye el archivo msbuild costumbre y lo que es inválido, a continuación, volver a cargar el proyecto, dejar que se quede sin carga, a continuación, fijar el archivo de proyecto y volver a cargar.

A veces funciona, a veces no lo hace, pero es mejor que reiniciar Visual Studio.

Si usted necesita una manera rápida y sucia para solucionarlo, es posible que vuelva a cargar la solución (a través de https://stackoverflow.com / a / 6877056/182371 ).

Puede hacerlo ya sea por la apertura de cerrar el archivo de solución o pulsando Guardar en un editor externo (entonces cuando vuelva a VS se ASKO si desea volver a cargar).

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