java - Ant 从(绝对)属性创建文件集、dirsets

标签 java ant

在 ant 中,我定义了一些属性,这些属性定义了我的构建系统中所需的一些路径(绝对)。

大多数 ant 任务都需要文件集,因此要从我必须做的属性构建文件集:

<fileset dir="" includes="${myprop}"/>

问题是 myprop 是绝对的,我应该省略 dir 属性(这是不可能的),所以有没有办法定义(绝对的) ) 属性并有效地使用它们来创建文件集、目录集等。 或者在 ant 中 这是一种不好的做法吗(只应使用相对路径)

谢谢。

最佳答案

Ant 没有关于绝对与相对的特定规则。如果可能,您应该避免硬编码绝对路径 - 以使您的构建更具可移植性。如果您必须对构建的某些部分使用绝对路径,请尝试构建它们 - 比如从项目的 ${basedir} - 以便更容易进行更改。

将绝对路径转换为用于文件集等的相对路径可能有用的两件事:

  • property task支持可用于将绝对路径转换为相对路径的属性 relative=
  • pathconvert task当一个属性中有多个绝对路径时,可用于执行相同的操作。

例子:

<!-- Absolute paths -->
<property name="myprop" value="${basedir}/x" />
<property name="myprop2" value="${basedir}/x:${basedir}/y" />

<!-- Convert single path to relative to basedir -->
<property name="myprop_rel" location="${myprop}" relative="yes"/>

<!-- Go via path/pathconvert for the property with multiple paths -->
<path id="mypath2" path="${myprop2}" />
<pathconvert property="myprop2_rel" refid="mypath2" pathsep=",">
    <map from="${basedir}/" to="" />
</pathconvert>

<fileset id="my_fileset" dir="." includes="${myprop2_rel}" />

回应评论:我不知道在 Ant 中获取文件集的最长公共(public)前缀目录的简单方法, 但这是一个包装脚本任务的宏,它执行您可能称之为“收缩包装”的操作。 您可以通过引用“输入”文件集和要设置的属性的名称来调用它。

<macrodef name="common-prefix-dir">
  <attribute name="refid" />
  <attribute name="outputproperty" />
  <sequential>
  <script language="javascript"><![CDATA[

    srcFiles = project.getReference( "@{refid}" )
              .getDirectoryScanner( project )
              .getIncludedFiles( );

    if ( srcFiles.length > 0 ) {
      prefix = "" + srcFiles[0];
      for ( i = 0; i < srcFiles.length; i++ ) {
        while ( prefix.length && srcFiles[i].substr( 0, prefix.length ) != prefix ) {
          prefix = prefix.substr( 0, prefix.length - 1);
        }

        if ( !prefix.length ) {
          break;
        }
      }
    }
    else {
      prefix = "";
    }
    prefix = prefix.substring( 0, prefix.lastIndexOf( '/' ) );
    project.setProperty( "@{outputproperty}", prefix );

  ]]></script>
  </sequential>
</macrodef>

(这是从 php implementation 派生的。)

你可以尝试一下:

<property name="my.dir" location="...your dir here..." />
<fileset id="my.fs" dir="${my.dir}">
  <!-- define fileset here -->
</fileset>
<echo message="Input fileset is: '${toString:my.fs}'" />

<common-prefix-dir refid="my.fs" outputproperty="prefix" />
<echo message="Longest common prefix is: '${prefix}'" />

pathconvert 任务现在可用于创建收缩包装的文件集:

<pathconvert property="shrink" refid="my.fs" pathsep=",">
  <map from="${my.dir}/${prefix}/" to="" />
</pathconvert>
<fileset id="my.fs.out" dir="${my.dir}/${prefix}" includes="${shrink}" />
<echo message="Shrink-wrapped fileset is: '${toString:my.fs.out}'" />

关于java - Ant 从(绝对)属性创建文件集、dirsets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066872/

相关文章:

java - 如何在 Play Framework 模型中导入 java 扩展?

java - 在启用语法高亮的情况下将 Java 源代码输出为 pdf

java - Splash-Screen 在 IDE 中工作,但不能以 .jar 形式工作 - ANT 问题?

ant - 在 ANT 中使用条件长度

java - 减少字符串中的字符数

java - Selenium 网络驱动程序 : Unable to locate element

maven - 在maven-antrun-plugin中调用foreach

Android AAPT 问题 - 将新图像替换为资源时

android - 构建android apk时如何将参数传递给aapt?

java - 安卓屏幕截图