执行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="<classAccesses>\n(.*?)<apexClass>CaseEntitlementMilestoneCalc_Test<\/apexClass>\n(.*?)<enabled>(.*?)<\/enabled>\n(.*?)<\/classAccesses>" 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
问题
- 任何人都可以看到我的正则表达式可能在我的本地机器上工作,但不在VSTS上的任何理由?
- 有没有其他方法可以做到这一点更傻瓜?
谢谢!
尝试使用此代码来代替:
<classAccesses>.* .*<apexClass>CaseEntitlementMilestoneCalc_Test<\/apexClass>.* .*<enabled>(.*?)<\/enabled>.* .*<\/classAccesses>
是的,谢谢你的作品!为了我的理解,关键是使用&#10而不是\ n对吗? – dsmorris
是的,你是对的。 –
您可能要检查行结束在VSTS文件中的不同。我自己并没有使用VSTS,但我确实知道Windows使用'\ r \ n'作为其行尾,而Linux和OSX只使用'\ n'。如果通过Git检出此文件,则可能会更改行结束符以匹配检测到的操作系统。 – CAustin
此外,避免此问题的一个好方法是使用Ant内置的属性'$ {line.separator}',它将匹配系统用于行尾的任何内容。不要担心它包含特殊的正则表达式字符;在评估模式之前,Ant首先解析属性。 – CAustin
考虑使用[xslt](https://ant.apache.org/manual/Tasks/style.html)来过滤xml而不是正则表达式。有关示例,请参阅https://stackoverflow.com/questions/12152519/removing-xml-nodes-using-xslt。 –