msbuild createitem

Intentando excluir ciertas extensiones haciendo una copia recursiva(MSBuild)



createitem (1)

Estoy tratando de usar MSBuild para leer en una lista de archivos de un archivo de texto y luego realizar una copia recursiva, copiando el contenido de esos archivos de directorios en un área de almacenamiento intermedio, mientras excluyo ciertas extensiones (por ejemplo, archivos .tmp)

Me las arreglé para hacer la mayoría de los anteriores con bastante facilidad utilizando CreateItem y la tarea de copia de MSBuild, lo que sea que haga la tarea CreateItem simplemente ignora mi parámetro Excluir:

<PropertyGroup> <RootFolder>c:/temp</RootFolder> <ExcludeFilter>*.tmp</ExcludeFilter> <StagingDirectory>staging</StagingDirectory> </PropertyGroup> <ItemGroup> <InputFile Include="MyFile.txt" /> </ItemGroup> <Target Name="Build"> <ReadLinesFromFile File="@(InputFile)"> <Output ItemName="AllFolders" TaskParameter="Lines" /> </ReadLinesFromFile> <CreateItem Include="$(RootFolder)/%(AllFolders.RelativeDir)**" Exclude="$(ExcludeFilter)"> <Output ItemName="AllFiles" TaskParameter="Include" /> </CreateItem> <Copy SourceFiles="@(AllFiles)" DestinationFolder="$(StagingDirectory)/%(RecursiveDir)"

Contenidos de ejemplo de ''MyFile.txt'':

somedirectory/ someotherdirectory/

(Es decir, las rutas son relativas a $(RootFolder) - menciona esto porque leí en algún lugar que podría ser relevante)

He intentado un montón de combinaciones diferentes de filtros Excluir, pero parece que nunca puedo lograr que excluya correctamente mis archivos .tmp. ¿Hay alguna forma de hacerlo con MSBuild sin tener que recurrir a xcopy?


Debe especificar la Exclude en la ruta absoluta y cambiar el carácter comodín de exclusión para incluir el subdirectorio

Si usa una ruta absoluta para Include , debe usar una ruta absoluta para Exclude . Si usa una ruta relativa para Include , debe usar una ruta relativa para ambas.

<PropertyGroup> <RootFolder>c:/temp</RootFolder> <ExcludeFilter>**/*.tmp</ExcludeFilter> <StagingDirectory>staging</StagingDirectory> </PropertyGroup> <ItemGroup> <InputFile Include="MyFile.txt" /> </ItemGroup> <Target Name="Build"> <ReadLinesFromFile File="@(InputFile)"> <Output ItemName="AllFolders" TaskParameter="Lines" /> </ReadLinesFromFile> <CreateItem Include="$(RootFolder)/%(AllFolders.RelativeDir)**" Exclude="$(RootFolder)/%(AllFolders.RelativeDir)$(ExcludeFilter)"> <Output ItemName="AllFiles" TaskParameter="Include" /> </CreateItem> <Copy SourceFiles="@(AllFiles)" DestinationFolder="$(StagingDirectory)/%(RecursiveDir)"/> </Target>

Múltiples excluye y camino absoluto.

Si desea excluir varios elementos, no hay una forma limpia cuando está utilizando la ruta absoluta, pero podría hacerlo con Remove .

Primera forma: usando quitar y artículo

<PropertyGroup> <RootFolder>c:/temp</RootFolder> </PropertyGroup> <ItemGroup> <InputFile Include="MyFile.txt" /> <!-- Exclude are defined here --> <ExcludeFilters Include="$(RootFolder)/**/*.tmp"/> <ExcludeFilters Include="$(RootFolder)/**/*.bmp"/> </ItemGroup> <Target Name="Build"> <ReadLinesFromFile File="@(InputFile)"> <Output ItemName="AllFolders" TaskParameter="Lines" /> </ReadLinesFromFile> <CreateItem Include="$(RootFolder)/%(AllFolders.RelativeDir)**"> <Output ItemName="AllFiles" TaskParameter="Include" /> </CreateItem> <!-- Removing the wrong extension in item --> <ItemGroup> <AllFiles Remove="@(ExcludeFilters)"/> </ItemGroup> <Copy SourceFiles="@(AllFiles)" DestinationFolder="$(StagingDirectory)/%(RecursiveDir)"/> </Target>

Segunda vía: utilizando quitar y condicionar.

<Target Name="Build"> <ReadLinesFromFile File="@(InputFile)"> <Output ItemName="AllFolders" TaskParameter="Lines" /> </ReadLinesFromFile> <CreateItem Include="$(RootFolder)/%(AllFolders.RelativeDir)**"> <Output ItemName="AllFiles" TaskParameter="Include" /> </CreateItem> <!-- Removing the wrong extension in item --> <ItemGroup> <AllFiles Remove="@(AllFiles)" Condition="''%(Extension)'' == ''.tmp''"/> <AllFiles Remove="@(AllFiles)" Condition="''%(Extension)'' == ''.bmp''"/> </ItemGroup> <Copy SourceFiles="@(AllFiles)" DestinationFolder="$(StagingDirectory)/%(RecursiveDir)"/> </Target>