【问题标题】:How can I iterate over properties from a file?如何迭代文件中的属性?
【发布时间】:2011-03-04 15:20:22
【问题描述】:

我所有的项目及其版本都在一个属性文件中定义,如下所示:

ProjectNameA=0.0.1
ProjectNameB=1.4.2

我想遍历所有项目,并在 Ant 脚本中使用它们的名称和版本。

目前我使用属性任务读取整个文件,然后在 for 循环中迭代给定列表,如下所示:

<for list="ProjectNameA,ProjectNameB" param="project">
   <sequential>
    <echo message="@{project} has version ${@{project}}" />
   </sequential>
</for>

如何避免在 for 循环中对项目名称进行硬编码? 基本上遍历每一行并提取项目的名称和版本。

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    既然您已经在使用 antcontrib for,那么使用 propertyselector 任务怎么样:

    <property file="properties.txt" prefix="projects."/>
    <propertyselector property="projects" match="projects\.(.*)" select="\1"/>
    
    <property file="properties.txt" />
    <for list="${projects}" param="project">
        ...
    </for>
    

    这里的想法是使用projects 前缀读取属性一次,然后使用生成的属性集构建一个逗号分隔的带有propertyselector 任务的项目列表。然后属性被重新读取没有前缀,这样你的for循环就可以像以前一样继续了。

    【讨论】:

    • 添加了与给定错误的关系,以及 for 元素的顺序元素以使其更加明显。
    • 想要添加编辑,但被拒绝。所以我将其添加为注释:for 任务未以某种方式列在最新 jar 的 antcontrib.properties 中。一种解决方法是将其作为具有名称的类包含在 taskdef 中,就像在错误报告中所述 sourceforge.net/tracker/…
    • 感谢马丁的帖子。对于没有为 ant contrib 设置东西的其他人,您可能还需要以下行: 参考:ant-contrib.sourceforge.net/tasks/index.html#intro
    【解决方案2】:

    如果您正在阅读其他 .property 文件(除了 build.properties),您需要记住的一点是作用域。如果您读取了一个附加文件(通过属性 file="foo.property")标签,ant 将显示该文件已被读取,并且属性已加载。但是,当您去引用它们时,它们会出现未定义的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2022-01-04
      • 2020-08-25
      • 2020-05-18
      相关资源
      最近更新 更多