无法让 MSBuild 社区任务 RegexReplace 工作

Posted

技术标签:

【中文标题】无法让 MSBuild 社区任务 RegexReplace 工作【英文标题】:Can't get MSBuild Community Task RegexReplace to work 【发布时间】:2011-11-02 21:13:39 【问题描述】:

我正在尝试复制一堆名称以前缀DR__ 开头的文件,但副本必须删除该前缀。也就是说,DR__foo 必须复制为 foo。我正在尝试这个,它基于文档(.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 显示为空(或者当我使用Message 显示它时,我看到的就是这个)。因此,Copy 失败,因为没有指定 DestinationFiles。这里有什么问题?

编辑:ContextVisionParameterFiles 不为空,它包含以下内容:

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

它们实际上是 40 个文件,但为了清楚起见,我对其进行了修剪

【问题讨论】:

【参考方案1】:

知道了!它似乎是一个愚蠢的错误和一个看似强制的参数的组合。至于第一个,有两个目标,称为CopyAuxiliaryFiles。至于第二个,好像需要Count参数。

最终的工作版本:

<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>

注意:

我重命名了 Target 以解决名称冲突(为什么 Visual Studio 没有将其检测为错误?) 我用 @(CvParamFiles, '&amp;#xA;') 语法漂亮地打印了 ItemGroups,它似乎用换行符替换了 ; 我的正则表达式替换了绝对路径和前缀 Count="1" 现在传递给 RegexReplace

【讨论】:

以上是关于无法让 MSBuild 社区任务 RegexReplace 工作的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio中的MSBuild社区任务BeforeBuild步骤期间找不到路径中的xsd.exe

为啥 Msbuild 任务无法部署数据库,但 Exec 工作正常

自定义 MsBuild 任务因程序集加载错误而失败

给定相对路径时,如何让 MSBUILD 评估和打印完整路径?

TransformXml 任务通过使用单声道的 Linux 上的 msbuild 失败

TFSBuild 2013 无法更改 msbuild 版本