msbuild copy rename msbuildcommunitytasks

No se puede hacer que MSBuild Community Task RegexReplace funcione



copy rename (1)

DR__ copiar un grupo de archivos cuyos nombres comienzan con el prefijo DR__ , pero las copias deben tener ese prefijo eliminado. Es decir, DR__foo debe copiarse como foo . Estoy intentando esto, que se basa en el ejemplo proporcionado en la documentación (el .chm):

<Target Name="CopyAuxiliaryFiles"> <MakeDir Directories="$(TargetDir)Parameters" Condition="!Exists(''$(TargetDir)Parameters'')" /> <ItemGroup> <ContextVisionParameterFiles Include="$(SolutionDir)CVParameters/DR__*" /> </ItemGroup> <Message Text="Files to copy and rename: @(ContextVisionParameterFiles)"/> <RegexReplace Input="@(ContextVisionParametersFiles)" Expression="DR__" Replacement=""> <Output ItemName ="DestinationFullPath" TaskParameter="Output" /> </RegexReplace> <Message Text="Renamed Files: @(DestinationFullPath)"/> <Copy SourceFiles="@(ContextVisionParameterFiles)" DestinationFiles="@(DestinationFullPath)" /> </Target>

DestinationFullPath sale vacío (o eso es lo que veo cuando lo visualizo con Message ). Por lo tanto, Copy falla porque no se especifican DestinationFiles . ¿Qué pasa aquí?

Editar : ContextVisionParameterFiles no está vacío, contiene esto:

D:/SVN.DRA.WorkingCopy/CVParameters/DR__big_bone.alut;D:/SVN.DRA.WorkingCopy/CVParameters/DR__big_medium.gop

En realidad son 40 archivos, pero lo recorté en aras de la claridad


¡Lo tengo! Parece haber sido la combinación de un error estúpido y un parámetro aparentemente obligatorio. En cuanto al primero, había dos objetivos llamados CopyAuxiliaryFiles . En cuanto a la segunda, parece que se necesita el parámetro Count .

La versión final y funcional:

<Target Name="CopyCvParameters"> <ItemGroup> <CvParamFiles Include="$(SolutionDir)CVParameters/DR__*" /> </ItemGroup> <Message Text="Input:&#xA;@(CvParamFiles, ''&#xA;'')"/> <!-- Replaces first occurance of "foo." with empty string--> <RegexReplace Input="@(CvParamFiles)" Expression="^.*DR__" Replacement="$(TargetDir)Parameters/" Count="1"> <Output ItemName ="RenamedCvParamFiles" TaskParameter="Output" /> </RegexReplace> <Message Text="&#xA;Output RenamedCvParamFiles:&#xA;@(RenamedCvParamFiles, ''&#xA;'')" /> <Copy SourceFiles="@(CvParamFiles)" DestinationFiles="@(RenamedCvParamFiles)" SkipUnchangedFiles="True" /> </Target>

Darse cuenta de:

  • Cambié el nombre del objetivo para resolver la colisión del nombre (¿Por qué Visual Studio no detecta esto como un error?)
  • Imprimí bastante los ItemGroups con la sintaxis @(CvParamFiles, ''&#xA;'') , que parece reemplazar ; con saltos de línea
  • Mi expresión regular reemplaza la ruta absoluta y el prefijo
  • Count="1" pasa ahora a RegexReplace