2010-02-09 86 views
27

如何創建基於目錄內容排除某些目錄的ant文件集?如何根據目錄內容從ant文件集中排除目錄

我使用ant創建一個分佈式jar,每個分佈式目錄都有不同的目錄,其中一些目錄是不完整的,不應該發佈。

我想添加一些東西到目錄(例如一個名爲incomplete.flag的文件),以便ant排除目錄。然後,我可以在翻譯完成時刪除文件,並將其包含在構建中,而無需修改build.xml。

鑑於此目錄結構:

proj 
+ locale 
    + de-DE 
    + en-US 
    + fr-FR 

這個文件集中排除所有incompelte.flag文件,但我怎麼能排除整個目錄,包含他們?

<fileset dir="${basedir}"> 
    <include name="locale/"/> 
    <exclude name="locale/*/incomplete.flag"> 
    </fileset> 

我可以寫一個Ant任務如果需要的話,但我希望在fileset可以處理這個用例。

+0

不是一個真正的答案,但不會是足夠的添加有效的目錄爲'includes'代替'excluding'不完整? –

+0

使用'includes'不能解決用例問題,因爲目標是隨着語言環境的添加和完成而不修改build.xml。 – Chadwick

+1

你可能要保持積極的名單不包括build.xml中 (我們不應該改變這種狀況,這是有道理的),但在一個單獨的文件。 該文件將隨後經由 <文件集DIR = 「PROJ /區域設置」 includesfile = 「PROJ /語言環境/完成-locales.txt」/> 文件 「完成-locales.txt」 將列出剛剛被裝載完成語言環境,每行一個: DE-DE 的en-US – mgaert

回答

6

下面是一個替代方法,不是將incomplete.flag文件添加到要排除的每個目錄,而是生成一個文件,其中包含要排除的所有目錄的列表,然後使用excludesfile屬性。就像這樣:

<fileset dir="${basedir}" excludesfile="FileWithExcludedDirs.properties"> 
    <include name="locale/"/> 
    <exclude name="locale/*/incomplete.flag"> 
</fileset> 

希望它有幫助。

+0

這穿過我的腦海,但我不能想辦法來創建excludesfile - 有什麼建議?我懷疑可以使用相同的機制來創建文件集。思考? – Chadwick

+0

我看到問題了。我認爲這取決於包含或排除文件的標準。我想你可能會寫一些腳本來生成文件,但是你必須去螞蟻之外。 – Alonso

+0

我剛剛意識到有關螞蟻的選擇。這些可以在文件集中使用。檢查出來http://ant.apache.org/manual/CoreTypes/selectors.html – Alonso

0

這可以通過使用「**」模式如下。

<exclude name="maindir/**/incomplete.flag"/> 

上面的'exclude'將完全排除所有包含incomplete.flag文件的目錄。

+0

這將是完全的東西,我需要但是,對於我的生活,我無法得到它的工作......:/ – crappish

+3

以上不會排除任何目錄。它只會在maindir下的任何子目錄中排除那些匹配該模式的文件。 – Eddie

+0

@Eddie - 如何排除所有子目錄? – useranon

55

以下辦法爲我工作:

<exclude name="**/dir_name_to_exclude/**" /> 
+7

如本答案中所示,通過目錄名排除並不重要,不能解決問題。請仔細閱讀,排除的子目錄應僅包含具有特定名稱的文件。 – Chadwick

+1

目前沒有這種可能性。所以,在這個主題中的所有答案只是建議一些方法。 – Sasha

+0

@Sasha謝謝,我正在尋找這個問題的第一部分,你的回答給了我。 – randomUser56789

15

您需要添加一個 '/' 後的目錄名

<exclude name="WEB-INF/" /> 
+3

如本答案中所示,通過目錄名稱排除並不重要,不能解決問題。請仔細閱讀,排除的子目錄應僅包含具有特定名稱的文件。 – Chadwick

+0

「精彩」,看到最清晰,最簡單,最好的答案得到最少的投票... – peterh

+0

@彼得......也許什麼__你看到最清晰,最簡單不是別人看到的?感謝您的投票:-( – mgaert

0

它爲我工作了jar目標:

<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/"> 
    <manifest> 
    <attribute name="Main-Class" value="${mainServer.class}" /> 
    </manifest> 
</jar> 

該代碼包含「classes.dir」中的所有文件,但從jar中排除目錄「client」。

+1

如本答案中所示,按目錄名排除並不重要,並且不能解決問題。請仔細閱讀,排除的子目錄應該只包含那些包含特定名稱文件的文件。 – Chadwick

5

Ant文檔中實際存在這種類型的問題。它使用了 選擇器(上面提到)和映射器。見http://ant.apache.org/manual/Types/dirset.html最後一個例子:

<dirset id="dirset" dir="${workingdir}"> 
    <present targetdir="${workingdir}"> 
     <mapper type="glob" from="*" to="*/${markerfile}" /> 
    </present> 
</dirset> 

選擇下${workingdir}它含有${markerfile}地方的所有目錄。

0

我想一個辦法,首先檢查您的文件是否存在,如果存在的文件夾複製從排除:

<target name="excludeLocales"> 

    <property name="de-DE.file" value="${basedir}/locale/de-DE/incompelte.flag"/> 
    <available property="de-DE.file.exists" file="${de-DE.file}" /> 

    <copy todir="C:/temp/"> 
     <fileset dir="${basedir}/locale"> 
      <exclude name="de-DE/**" if="${de-DE.file.exists}"/> 
      <include name="xy/**"/> 
     </fileset> 
    </copy> 
</target> 

這也應該努力爲其他語言。

1

回答用戶對我mgaert工作提供。我認爲它應該被標記爲正確的答案。

它的工作原理也與複雜的選擇像在本例中:

<!-- 
    selects only direct subdirectories of ${targetdir} if they have a 
    sub-subdirectory named either sub1 or sub2 
--> 
<dirset dir="${targetdir}" > 
    <and> 
     <depth max="0"/> 
     <or> 
      <present targetdir="${targetdir}"> 
       <globmapper from="*" to="*/sub1" /> 
      </present> 
      <present targetdir="${targetdir}"> 
       <globmapper from="*" to="*/sub2" /> 
      </present> 
     </or> 
    </and> 
</dirset> 

因此,具有這樣的目錄結構:

targetdir 
├── bar 
│   └── sub3 
├── baz 
│   └── sub1 
├── foo 
│   └── sub2 
├── phoo 
│   ├── sub1 
│   └── sub2 
└── qux 
    └── xyzzy 
     └── sub1 

上述dirset將只包含

baz foo phoo
bar沒有按」因爲當 xyzzy SUB3的牛逼匹配不匹配,因爲它不是 targetdir

直接子目錄部
0

作品對我來說:

<target name="build2-jar" depends="compile" > 
    <jar destfile="./myJjar.jar"> 
     <fileset dir="./WebContent/WEB-INF/lib" includes="hibernate*.jar,mysql*.jar" /> 
     <fileset dir="./WebContent/WEB-INF/classes" excludes="**/controlador/*.class,**/form/*.class,**/orm/*.class,**/reporting/*.class,**/org/w3/xmldsig/*.class"/> 
    </jar>