如何将Ant任务应用于字符串中的值列表
我正在编写一个Ant脚本,旨在模仿VSS的“影子文件夹”概念,作为从VSS迁移到Subversion的权宜之计(无需重新配置构建管理软件)。脚本相当简单:如何将Ant任务应用于字符串中的值列表,ant,Ant,我正在编写一个Ant脚本,旨在模仿VSS的“影子文件夹”概念,作为从VSS迁移到Subversion的权宜之计(无需重新配置构建管理软件)。脚本相当简单: 创建生成文件夹 将源文件从Subversion提取到生成文件夹中 翻译源文件 将源代码和目标代码文件从生成文件夹复制到用于部署的最终位置 在我将整个主干拉入构建文件夹并从那里开始的情况下,所有这些都可以“很好地”工作……除了“构建”需要30多分钟,我希望作为提交后事件的一部分启动它(同样,模仿VSS的“影子文件夹”功能,该功能将所有文件的
- 创建生成文件夹
- 将源文件从Subversion提取到生成文件夹中
- 翻译源文件
- 将源代码和目标代码文件从生成文件夹复制到用于部署的最终位置
<?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>
受影响的资源:${log.logentry.path.path}
虽然我没有让正则表达式正常工作。这是对Ant的重大违反吗?我应该放弃希望,直接使用Ant contrib运行吗?我采用它的速度很慢,因为自2008年以来似乎没有任何更新,我希望限制所有这些东西工作所需的依赖数量
有什么想法吗
编辑:我越来越接近了(有点)…上面的代码在最初的帖子中没有被正确引用,在发布之前我也没有机会尝试过(需要离开,不想丢失我键入的所有内容)。无论如何,没有办法停止递归(我怀疑属性是不可变的,因此不会像我希望的那样重置),所以它(还)不起作用
我尝试用(我知道这是不受欢迎的,但它非常方便,因为它允许您通过的if/除非属性有条件地执行任务)来实现与上面相同的基本概念——但这不起作用,因为Ant不希望允许递归,显然:
“antcall任务调用其自己的父目标”
尝试通过以下方式启动递归:
“循环依赖:svn.export.file我承认,这很难看……我也不太确定我是否会坚持使用它作为我的解决方案(我想我可能会继续安装ant contrib,因为这段代码既难看又令人困惑)--但它似乎做到了这一点,它在某种程度上证明了我的理论:是的,您可以为列表中的每个元素调用一个目标,而无需依赖于
<?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" inheritAll="false">
<param name="svn.repo.urls" value="${log.logentry.paths.path}"/>
</antcall>
</target>
<target name="svn.export" if="svn.repo.urls">
<macrodef name="svnExportFile">
<attribute name="urls"/>
<sequential>
<macrodef name="parsePath">
<attribute name="property"/>
<attribute name="replacePart"/>
<sequential>
<loadresource property="@{property}">
<string value="@{urls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="([^,]+),?(.*)" replace="@{replacePart}" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
</sequential>
</macrodef>
<parsePath property="lead.path" replacePart="\1"/>
<fail>
<condition>
<not>
<isset property="lead.path"/>
</not>
</condition>
</fail>
<parsePath property="rest.paths" replacePart="\2"/>
<echo>lead.path:${lead.path}</echo>
<echo>rest.paths:${rest.paths}</echo>
<antcall target="svn.export.deux"/>
</sequential>
</macrodef>
<svnExportFile urls="${svn.repo.urls}"/>
</target>
<target name="svn.export.deux" if="rest.paths">
<echo>rest.paths:${rest.paths}</echo>
<echo>svn.repo.urls:${svn.repo.urls}</echo>
<antcall target="svn.export" inheritAll="false">
<param name="svn.repo.urls" value="${rest.paths}"/>
</antcall>
</target>
</project>
受影响的资源:${log.logentry.path.path}
lead.path:${lead.path}
rest.path:${rest.path}
rest.path:${rest.path}
svn.repo.url:${svn.repo.url}
我承认,这很难看……而且我也不太确定我是否会坚持使用它作为我的解决方案(我想我可能会继续安装ant contrib,因为这个“代码”既难看又让人困惑)——但它似乎起到了作用,它某种程度上证明了我的理论,是的,您可以为列表中的每个元素调用一个目标,而无需依赖它
<?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" inheritAll="false">
<param name="svn.repo.urls" value="${log.logentry.paths.path}"/>
</antcall>
</target>
<target name="svn.export" if="svn.repo.urls">
<macrodef name="svnExportFile">
<attribute name="urls"/>
<sequential>
<macrodef name="parsePath">
<attribute name="property"/>
<attribute name="replacePart"/>
<sequential>
<loadresource property="@{property}">
<string value="@{urls}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="([^,]+),?(.*)" replace="@{replacePart}" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
</sequential>
</macrodef>
<parsePath property="lead.path" replacePart="\1"/>
<fail>
<condition>
<not>
<isset property="lead.path"/>
</not>
</condition>
</fail>
<parsePath property="rest.paths" replacePart="\2"/>
<echo>lead.path:${lead.path}</echo>
<echo>rest.paths:${rest.paths}</echo>
<antcall target="svn.export.deux"/>
</sequential>
</macrodef>
<svnExportFile urls="${svn.repo.urls}"/>
</target>
<target name="svn.export.deux" if="rest.paths">
<echo>rest.paths:${rest.paths}</echo>
<echo>svn.repo.urls:${svn.repo.urls}</echo>
<antcall target="svn.export" inheritAll="false">
<param name="svn.repo.urls" value="${rest.paths}"/>
</antcall>
</target>
</project>
受影响的资源:${log.logentry.path.path}
lead.path:${lead.path}
rest.path:${rest.path}
rest.path:${rest.path}
svn.repo.url:${svn.repo.url}
是否必须在ant中完成?为什么没有ant contrib?我的帖子有点长,但我提到了两个原因:1)ant contrib自2008年以来似乎没有任何变化——也许是因为一切都很好,不需要改变,但这对我来说似乎很奇怪,2)我希望限制我的依赖性。在我看来,没有Ant是相当残废的。我读到一条评论,认为Ant contrib和Ant contrib是可怕的东西,破坏了构建的优雅或类似的东西。我可以欣赏定义依赖关系的优雅和所有这些,但至少