簡體   English   中英

Ant從(絕對)屬性創建文件集,dirsets

[英]Ant create filesets, dirsets from (absolute) properties

在ant中,我定義了一些屬性來定義構建系統中所需的一些路徑( 絕對 )。

大多數ant任務都需要文件集,因此要從屬性構建文件集,我必須這樣做:

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

問題是myprop是絕對的,我應該省略dir屬性( 這是不可能的 ),所以有沒有辦法定義(絕對)屬性並有效地使用它們來創建文件集,dirsets等..或者在螞蟻是這個不好的做法(只應使用相對路徑)

謝謝。

關於Ant的絕對與相對沒有特別的規則。 如果可能,您應該避免對絕對路徑進行硬編碼 - 以使您的構建更加便攜。 如果必須對構建的某些部分使用絕對路徑,請嘗試構建它們 - 例如從項目的${basedir}構建它們 - 以便更容易進行更改。

將絕對路徑轉換為相對路徑以在文件集等中使用可能有用的兩件事:

  • property任務支持屬性relative= ,可用於將絕對路徑轉換為相對路徑。
  • 當一個屬性中有多個絕對路徑時, pathconvert任務可用於執行相同操作。

例子:

<!-- 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中獲取文件集的最長公共前綴目錄的簡單方法,但是這里有一個宏包裝腳本任務,它執行你可能稱之為“收縮包裝”的內容。 您可以通過引用'input'文件集以及要設置的屬性的名稱來調用它。

<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實現派生的。)

你可以試試看:

<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}'" />

我建議你為dir目標使用不同的屬性,如果你對$ {myprop}進行絕對引用,我想這是一個文件名。 嘗試將其分成$ {parent.dir}和$ {target.filename}。

<fileset dir="${parent.dir}" includes="${target.filename}"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM