2011-02-07 10 views
20

En el archivo de proyecto que importar mi propio archivo de destinocómo desactivar el almacenamiento en caché de definiciones de compilación en Visual Studio

<Import Project="Build\CopyDependencies.target" /> 

y después me llaman destino de ese archivo de destino

<CallTarget Targets="CopyDependencies" UseResultsCache="false" /> 

Si edito CopyDependencies .target file Tengo que volver a cargar toda la solución y solo luego cambia a CopyDependencies.target surta efecto. Creo que es un tipo de almacenamiento en caché de definiciones de compilación en Visual Studio? Si es así, ¿quizás se puede desactivar?

Respuesta

13

Gracias @KazR

Aquí es una solución más pequeña que se puede insertar en el archivo de .csproj

<Target Name="AfterBuild"> 
    <PropertyGroup> 
    <TempProjectFile>Build.$([System.Guid]::NewGuid()).proj</TempProjectFile> 
    </PropertyGroup> 
    <Copy SourceFiles="Build.proj" DestinationFiles="$(TempProjectFile)" /> 
    <MSBuild Projects="$(TempProjectFile)" /> 
    <ItemGroup> 
    <TempProjectFiles Include="Build.????????-????-????-????-????????????.proj"/> 
    </ItemGroup> 
    <Delete Files="@(TempProjectFiles)" /> 
</Target> 

Problema resuelto

+1

¡Gran solución! Trabajó para [me] (http://stackoverflow.com/q/9227641/684399) – CitizenInsane

+2

Parece una solución razonable. Para su información de MSBuild 4 puede usar PropertyGroup dentro del objetivo en lugar de CreateProperty. –

+0

Gracias por la sugerencia, lo cambié ... se ve mucho mejor – Martin

8

No sé cómo podría deshabilitar el caché de VS, sin embargo, es posible que tenga una solución que le permita editar el objetivo de compilación sin tener que volver a cargar la solución.

Puede usar la tarea MSBuild en su archivo de proyecto para llamar a un destino de contenedor que copia su archivo CopyDependencies.target a CopyDependencies. [RandomNumber] .target, luego invoca su destino CopyDependencies en el archivo recién creado y finalmente lo elimina .

Esto obligaría a VS a volver a cargar el destino en cada invocación ya que el nombre de archivo es diferente.

He aquí un ejemplo:

myProject.proj

añadir esto a la meta AfterBuild:

<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/> 

Wrapper.target

Aquí tenemos el objetivo que quiere - en construcción time: copie el archivo de destino real e invoque el destino de construcción deseado dentro de él (he utilizado una tarea C# en línea que solo está disponible en MSBuild 4.0):

<UsingTask TaskName="RandomNumber" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <Number ParameterType="System.Int32" Output="true"/> 
    </ParameterGroup> 
    <Task> 
     <Code Type="Fragment" Language="cs"> 
     <!-- CDATA --> 
     Random rndGenerator = new Random(); 
     Number = rndGenerator.Next(Int32.MaxValue); 
     <!-- CDATA --> 
     </Code> 
    </Task> 
</UsingTask> 

<Target Name="MyWrappedTarget"> 
    <Message Text="MyWrappedTarget target called"/> 


    <RandomNumber> 
     <Output TaskParameter="Number" PropertyName="FileNumber"/> 
    </RandomNumber> 

    <PropertyGroup> 
     <CopiedTarget>inner.test.$(FileNumber).target</CopiedTarget> 
    </PropertyGroup> 

    <Copy SourceFiles="inner.test.target" DestinationFiles="$(CopiedTarget)"/> 

    <MSBuild Projects="$(CopiedTarget)" Targets="_innerTestTarget"/> 

    <Delete Files="$(CopiedTarget)"/> 
</Target> 

inner.test.target

Este contiene el destino de generación de bienes que desea ejecutar, en este ejemplo es una copia simple de archivos.

<Target Name="_innerTestTarget"> 

    <Message Text="This is a inner test text message"/> 
    <Copy SourceFiles="x.txt" DestinationFiles="x1.txt"/> 
</Target> 

Esto no está listo para producción, pero con suerte ilustra mi punto.

Con este proceso (un poco intrincado), puede cambiar el archivo inner.test.target sin tener que volver a cargar la solución en VS.

+0

Lo que en solución loco! Usted, señor, es un genio malvado. –

3

tengo una solución diferente, que no impliquen archivos temporales:

Incluir.presentar objetivos:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="Foobar"> 
     <Copy SourceFiles="test.source" DestinationFiles="testFoobar.dest" /> 
    </Target> 

</Project> 

Archivo de proyecto:

.... 
<Target Name="BeforeBuild"> 
    <Exec Command="$(MSBuildToolsPath)\MSBuild.exe Include.targets /t:Foobar" ContinueOnError="false" /> 
</Target> 
.... 

en este caso VS no reconoce el comando de MSBuild, y no almacena en caché el archivo.

happy coding!

+2

Necesitaba comillas también: '' – Cel

3

Aquí hay una solución que no requiere ningún script de MSBuild.

Me di cuenta de que descargar y volver a cargar un proyecto no soluciona el problema, pero cerrar y volver a abrir la solución sí lo hace. Además, Visual Studio le pedirá que vuelva a cargar la solución si nota que el archivo .sln ha cambiado. Y finalmente, this superuser question explica cómo tocar un archivo en Windows.

Poniéndolos juntos, agregué una herramienta externa de Visual Studio para tocar el archivo de solución actual. He aquí cómo:

  1. seleccione Herramientas> Herramientas externas ...
  2. Haga clic en el botón Añadir para añadir una nueva herramienta.
  3. Definición de las propiedades de la siguiente manera:
    • Título: Actualizar Solución
    • Comando: cmd.exe
    • Argumentos:/c copia "$ (solutionFileName)" +> nul
    • directorio inicial: $ (SolutionDir)
    • y encienda uso ventana de salida
  4. Haga clic en Aceptar para cerrar la ventana de herramientas externas

Ahora, si ha realizado cambios en sus archivos de MSBuild, simplemente seleccione HERRAMIENTAS> Volver a cargar la solución y se volverán a cargar todos sus archivos de compilación.

Estoy usando Windows 7 de 64 bits y Visual Studio 2012 Express para escritorio de Windows.

0

Antes de ejecutar MSBuild que ejecutar este para borrar la caché de descarga:

call "%VS120COMNTOOLS%vsvars32.bat" 
echo Clear download cache 
gacutil -cdl 
+0

El GAC y descarga los ensamblados de la memoria caché pero no los archivos de MSBuild, hasta donde yo sé. – weir

Cuestiones relacionadas