Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Ant任务应用于字符串中的值列表_Ant - Fatal编程技术网

如何将Ant任务应用于字符串中的值列表

如何将Ant任务应用于字符串中的值列表,ant,Ant,我正在编写一个Ant脚本,旨在模仿VSS的“影子文件夹”概念,作为从VSS迁移到Subversion的权宜之计(无需重新配置构建管理软件)。脚本相当简单: 创建生成文件夹 将源文件从Subversion提取到生成文件夹中 翻译源文件 将源代码和目标代码文件从生成文件夹复制到用于部署的最终位置 在我将整个主干拉入构建文件夹并从那里开始的情况下,所有这些都可以“很好地”工作……除了“构建”需要30多分钟,我希望作为提交后事件的一部分启动它(同样,模仿VSS的“影子文件夹”功能,该功能将所有文件的

我正在编写一个Ant脚本,旨在模仿VSS的“影子文件夹”概念,作为从VSS迁移到Subversion的权宜之计(无需重新配置构建管理软件)。脚本相当简单:

  • 创建生成文件夹
  • 将源文件从Subversion提取到生成文件夹中
  • 翻译源文件
  • 将源代码和目标代码文件从生成文件夹复制到用于部署的最终位置
在我将整个主干拉入构建文件夹并从那里开始的情况下,所有这些都可以“很好地”工作……除了“构建”需要30多分钟,我希望作为提交后事件的一部分启动它(同样,模仿VSS的“影子文件夹”功能,该功能将所有文件的“最新”副本保存在独立于VSS数据库的文件夹中,并在响应所有签入时更新)

我一直在对脚本进行黑客攻击,目的是对已更改的文件进行更有针对性的下载(svn diff给了我文件列表,我相信svn export可以用于单独下载)

现在,问题是:使用Ant Core,有没有一种方法可以“迭代地”调用列表中每个元素的目标?这是这里发布的问题的重复:

但我拒绝接受这不能在本地完成。此帖子:

给了我希望,但我对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>

受影响的资源:${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是可怕的东西,破坏了构建的优雅或类似的东西。我可以欣赏定义依赖关系的优雅和所有这些,但至少