2009-10-08 14 views
8

Actualmente he configurado un proyecto de implementación web que compila código en la carpeta .\Release. Después de la compilación, quiero copiar los archivos en otra máquina (ya que cualquiera que sea el directorio en el que cree se elimina y luego se vuelve a crear).Proyecto de implementación web - Copiar archivos después de la compilación

El ItemGroup para definir qué archivos copiar está configurado de la siguiente manera:

<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'"> 
    <ReleaseFiles Include=".\Release\**\*" /> 
    <OverrideFiles Include="..\website\App_Code\override\site.com\**\*" /> 
</ItemGroup> 

'web' el código que se utiliza para múltiples sitios, por lo que hay varios proyectos de implementación web que existen dentro de la solución.

Entonces, tengo el objetivo AfterBuild para copiar los archivos:

<Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <Copy SourceFiles="@(ReleaseFiles)" ContinueOnError="true" SkipUnchangedFiles="true" DestinationFiles="@(ReleaseFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" /> 
    <Copy SourceFiles="@(OverrideFiles)" DestinationFiles="@(OverrideFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" /> 
</Target> 

Sin embargo, los ReleaseFiles no se copian, lo que puede ser la causa de que? He tenido el error .\TempBuildDir\folder\subfolder - The process cannot access the file because it is being used by another process. donde folder\subfolder puede ser diferente cada vez, pero incluso cuando ese mensaje no aparece, los archivos aún no se copian.

El problema es que ha funcionado antes.

Respuesta

9

El problema básico es que el ItemGroup en su muestra está siendo evaluado en el momento en el archivo de MSBuild se carga - y en ese momento, lo más probable, no existen esos archivos todavía .....

Por lo tanto, sus colecciones "ReleaseFiles" y "OverrideFiles" están vacías y, a continuación, no se copia nada.

Lo que hay que hacer es crear sus ItemGroups dinámica después la construcción ha sucedido (y los archivos referenciados aquí son realmente presente):

<CreateItem Include=".\Release\**\*"> 
    <Output TaskParameter="Include" ItemName="ReleaseFiles"/> 
</CreateItem> 
<CreateItem Include="..\website\App_Code\override\site.com\**\*"> 
    <Output TaskParameter="Include" ItemName="OverrideFiles"/> 
</CreateItem> 

Ahora usted debe estar bien, y la tarea de copia debe trabajo.

Marc

+0

¿CreateItem pasa por ItemGroup o Target? – SamWM

+0

Debería colocarlo en el destino 'AfterBuild', antes de las tareas de Copiar. –

+0

Eso lo arregló para mí – SamWM

Cuestiones relacionadas