执行Ant'replaceregexp'确定我的本地机器,但无法在Microsoft VSTS上运行

问题描述:

寻找一些有关Ant的帮助,特别是'replaceregexp'方法。感谢任何和所有的建议。执行Ant'replaceregexp'确定我的本地机器,但无法在Microsoft VSTS上运行

问题

我们使用Ant部署XML文件,并需要在部署之前删除XML的某些行。我们正在使用Microsoft VSTS作为我们的部署工具。

我们需要Ant来扫描大量文件,并删除特定的行。这是我们需要分析和删除源的一个小例子:

<classAccesses> 
    <apexClass>CaseEntitlementMilestoneCalc</apexClass> 
    <enabled>true</enabled> 
</classAccesses> 
<classAccesses> 
    <apexClass>CaseEntitlementMilestoneCalc_Test</apexClass> 
    <enabled>true</enabled> 
</classAccesses> 
<classAccesses> 
    <apexClass>CaseTriggerHandler</apexClass> 
    <enabled>true</enabled> 
</classAccesses> 

在这个例子中,我们希望找到并删除XML的这一部分:

<classAccesses> 
    <apexClass>CaseEntitlementMilestoneCalc_Test</apexClass> 
    <enabled>true</enabled> 
</classAccesses> 

我们使用“replaceregexp”在Ant中这样做。这是我们写这样做蚂蚁代码:

<replaceregexp match="&lt;classAccesses&gt;\n(.*?)&lt;apexClass&gt;CaseEntitlementMilestoneCalc_Test&lt;\/apexClass&gt;\n(.*?)&lt;enabled&gt;(.*?)&lt;\/enabled&gt;\n(.*?)&lt;\/classAccesses&gt;" replace="" flags="gm" byline="false">  
         <fileset dir="${src.dir}/profiles" includes="**/*.profile" /> 
        </replaceregexp> 

这工作得很好,当我通过终端我的Mac上运行它,但是当我试图在VSTS运行它,它不会做查找/替换。以下是调试日志每个:

我的Mac调试声明

[replaceregexp] Replacing pattern '<classAccesses>\n(.*?)<apexClass>CaseEntitlementMilestoneCalc_Test<\/apexClass>\n(.*?)<enabled>(.*?)<\/enabled>\n(.*?)<\/classAccesses>' with '' in '/Users/david.morris/DevWorkspace/R_Salesforce_Amey/src/profiles/FSL Mobile User.profile' with flags: 'gm'. 
[replaceregexp] Found match; substituting 
[replaceregexp] File has changed; saving the updated file 

VSTS调试声明

fileset: Setup scanner in dir d:\a\1\s\src\profiles with patternSet{ includes: [**/*.profile] excludes: [] } 
Replacing pattern '<classAccesses>\n(.*?)<apexClass>CaseEntitlementMilestoneCalc_Test<\/apexClass>\n(.*?)<enabled>(.*?)<\/enabled>\n(.*?)<\/classAccesses>' with '' in 'd:\a\1\s\src\profiles\AAD JIT Provisioning.profile' with flags: 'gm'. 
No change made 

问题

  1. 任何人都可以看到我的正则表达式可能在我的本地机器上工作,但不在VSTS上的任何理由?
  2. 有没有其他方法可以做到这一点更傻瓜?

谢谢!

+1

您可能要检查行结束在VSTS文件中的不同。我自己并没有使用VSTS,但我确实知道Windows使用'\ r \ n'作为其行尾,而Linux和OSX只使用'\ n'。如果通过Git检出此文件,则可能会更改行结束符以匹配检测到的操作系统。 – CAustin

+1

此外,避免此问题的一个好方法是使用Ant内置的属性'$ {line.separator}',它将匹配系统用于行尾的任何内容。不要担心它包含特殊的正则表达式字符;在评估模式之前,Ant首先解析属性。 – CAustin

+0

考虑使用[xslt](https://ant.apache.org/manual/Tasks/style.html)来过滤xml而不是正则表达式。有关示例,请参阅https://*.com/questions/12152519/removing-xml-nodes-using-xslt。 –

尝试使用此代码来代替:

&lt;classAccesses&gt;.*&#10;.*&lt;apexClass&gt;CaseEntitlementMilestoneCalc_Test&lt;\/apexClass&gt;.*&#10;.*&lt;enabled&gt;(.*?)&lt;\/enabled&gt;.*&#10;.*&lt;\/classAccesses&gt; 
+0

是的,谢谢你的作品!为了我的理解,关键是使用&#10而不是\ n对吗? – dsmorris

+0

是的,你是对的。 –