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:
@(CvParamFiles, ''
'')"/>
<!-- 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="
Output RenamedCvParamFiles:
@(RenamedCvParamFiles, ''
'')" />
<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, ''
'')
, 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