我正在编写一个 Ant 脚本,旨在模仿 VSS 的“影子文件夹”概念,作为从 VSS 迁移到 Subversion 的权宜之计(无需重新配置我们的构建管理软件)。该脚本相当简单:
- 创建构建文件夹
- 从 Subversion 提取源文件到构建文件夹
- 翻译源文件
- 将源代码和目标代码文件从构建文件夹复制到用于部署的最终位置
在我将整个主干拉入构建文件夹并从那里开始的情况下,所有工作都“正常”...除了“构建”需要 30 多分钟,我希望将其作为帖子的一部分启动-commit 事件(再次模仿 VSS 的“影子文件夹”功能,该功能将所有文件的“最新”副本保存在独立于 VSS 数据库的文件夹中,并根据所有签入进行更新)。
我一直在修改脚本,目标是对已更改的文件进行更有针对性的下载(svn diff 给了我文件列表,svn export 可用于单独拉下它们,我相信) .
现在,要问一个问题:有没有办法使用 Ant Core 来“迭代地”调用列表中每个元素的目标?这是此处发布的问题的重复:
在 ant 中,如何在文件列表上应用目标(没有 ant-contrib)?
但我拒绝接受这不能在本地完成。这个帖子:
给了我希望,但我缺乏对 Ant 如何工作(或设计)放弃的基本理解。我希望我能做类似的事情:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Test XmlProperty" default="test" basedir=".">
<target name="test">
<xmlproperty file="log.xml" collapseAttributes="true" />
<echo>Affected resources: ${log.logentry.paths.path}</echo>
<macrodef name="svnExportFile">
<attribute name="svnRepoUrls"/>
<sequential>
<loadresource property="lead.path">
<string value="${svnRepoUrls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="(\w+)[,${line.separator}]*.*" replace="\1" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
<loadresource property="rest.paths">
<string value="${svnRepoUrls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="(\w+)[,${line.separator}]*(.*)" replace="\2" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="${lead.path}"/>
<echo message="${rest.paths}"/>
<svnExportFile svnRepoUrls="${rest.paths}"/>
</sequential>
</macrodef>
<svnExportFile svnRepoUrls="${log.logentry.paths.path}"/>
</target>
</project>
虽然我没有正则表达式工作得很好。这是对Ant的重大违反吗?我应该放弃希望并简单地使用 Ant-contrib 运行吗?我采用它的速度很慢,因为它似乎自 2008 年以来没有更新,我希望限制所有这些东西工作所需的依赖数量。
有什么想法吗?
编辑:我越来越接近(有点)......上面的代码在最初的帖子中没有正确引用,我在发布之前没有机会尝试它(需要离开并且不想失去我输入的所有内容)。无论如何,没有办法停止递归(我怀疑属性是不可变的,因此不会像我希望的那样重置),所以它不起作用(还没有?)。
我试图完成与上面相同的基本概念(我知道它不受欢迎,但它非常方便,因为它允许您通过 if/unless 属性有条件地执行任务)——但这不起作用,因为 Ant显然不想允许递归:
'antcall 任务调用它自己的父目标'
并尝试通过依赖启动递归:
'循环依赖:svn.export.file <- svn.export.file'
如果有人好奇,这里是版本:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Test XmlProperty" default="test" basedir=".">
<target name="test">
<xmlproperty file="log.xml" collapseAttributes="true" />
<echo>Affected resources: ${log.logentry.paths.path}</echo>
<antcall target="svn.export.file" inheritAll="false">
<param name="svnRepoUrls" value="${log.logentry.paths.path}"/>
</antcall>
</target>
<target name="svn.export.file" if="svnRepoUrls">
<loadresource property="lead.path">
<string value="${svnRepoUrls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="(\w+)[,${line.separator}]*.*" replace="\1" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
<loadresource property="rest.paths">
<string value="${svnRepoUrls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="(\w+)[,${line.separator}]*(.*)" replace="\2" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="${lead.path}"/>
<echo message="${rest.paths}"/>
<antcall target="svn.export.file" inheritAll="false">
<param name="svnRepoUrls" value="${rest.paths}"/>
</antcall>
</target>
</project>