2011-10-04 11 views
8

Como parte de mi compilación de solución, quiero copiar todos los archivos de "Contenido" (asp? X etc.) a otra carpeta. Dado que estos están claramente etiquetados en el proyecto, pensé que debía haber una manera fácil de copiarlos en lugar de escribir mi propio paso posterior a la construcción con xcopy. Desafortunadamente no he podido resolver esto, esta cosa de msbuild es incompatible con mi cerebro. Solo quiero un paso como pero no puedo entender la sintaxis a usar.¿Cómo puedo hacer que MSBuild copie todos los archivos marcados como Contenido en una carpeta, preservando la estructura de la carpeta?

sugerencias de sintaxis archivo BAT no sería una respuesta a esta pregunta - únicas soluciones msbuild puros aplican

Gracias, por

Respuesta

10

Usted puede hacer esto por lo siguiente:

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/> 
</Target> 

Si desea ejecutar este como un post-construcción de pasos a continuación, puedes añadir AfterTargets = "Construir", por ejemplo:

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles" AfterTargets="Build"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/> 
</Target> 
+0

¿Cómo podemos hacer todo esto sin editar el archivo 'csproj' original? http://stackoverflow.com/questions/30577036/without-editing-the-csproj-file-get-msbuild-to-copy-all-files-marked-as-content –

+0

@ShaunLuttin ver http://sedodream.com /2012/07/28/MSBuildHowToExecuteATargetAfterCoreCompilePart2.aspx –

+0

No estoy seguro de si MSBuild tiene menos detalles en los años desde que se respondió esto, pero DestinationFiles = "$ (DestFolder) \% (RelativeDir)% (Filename)% (Extension)" funcionó para mí (es decir, omita el contenido-> bit) – piers7

1

utilizo la web desplegar función para empaquetar todos los archivos de contenido y entonces puedo Utilice la implementación web para sincronizar con un sitio o use xcopy o más bien RoboCopy si la implementación web no es una opción.

La tarea RoboCopy está incluida en MSBuild Community Tasks.

<PropertyGroup> 
    <Configuration>Release</Configuration> 
    <PackageDir>$(MSBuildProjectDirectory)\obj\$(Configuration)\Package\PackageTmp</PackageDir> 
    <ServerPath>\\server\path</ServerPath> 
    <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\...</MSBuildCommunityTasksPath> 
</PropertyGroup>  

<ItemGroup> 
    <Project Include="WebApplication.csproj"/> 
</ItemGroup> 

<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> 

<Target Name="Deploy"> 
    <MSBuild Projects="@(Project)" Targets="Build;Package" Properties="Configuration=$(Configuration)"/> 
    <RoboCopy 
     SourceFolder="@(PackageDir)" 
     DestinationFolder="$(ServerPath)" 
     Subdirectories="true" 
     Mirror="true" 
     /> 
</Target> 
0

La respuesta de Sayed no me funcionó porque también conservaba el directorio principal original. En su lugar, utilicé la siguiente versión alterada y funcionó maravillosamente y es un poco más elegante.

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="$(DestFolder)\%(RecursiveDir)"/> 
</Target> 
+0

No creo que RecursiveDir funcione para archivos * content * en el proyecto, solo para conjuntos de archivos que haya cargado desde globbing contra el sistema de archivos. – piers7

Cuestiones relacionadas