2012-01-31 61 views
2

的最後修改日期:使用Ant來改變我目前使用YUI通過Ant來壓縮JavaScript文件的文件

<apply executable="java" parallel="false"> 
    <fileset dir="." includes="${build.web.dir}/js/*.js"/> 
    <arg line="-jar"/> 
    <arg path="yuicompressor-2.4.7.jar"/>   
    <srcfile/> 
    <arg line="-o"/> 
    <mapper type="glob" from="*.js" to="*-min.js"/> 
    <targetfile/>  
</apply> 

但是新創建的* -min.js文件現在有新的「最後修改」日期。當我使用RSYNC來發布文件時,這將成爲一個問題,它會比較上次修改日期以確定文件是否應該更新。

理想情況下,我想保留上次修改的日期,以便部署不會不必要地更新所有文件,並覆蓋服務器上更新的文件(它曾發生過)。

+0

我不明白。如果您重新部署應用程序,是不是希望部署新的文件?如果你想保留以前的文件,生成這些文件有什麼意義? – 2012-01-31 17:16:30

+0

是的,我確實希望部署較新的文件,但我不知道壓縮發生時哪些文件更新,因此所有文件都被壓縮。這意味着每個文件都將最後修改日期設置爲當前時間,從而導致所有文件被傳輸。理想情況下,我只想傳輸已更新的文件,並防止服務器上某些較新的文件被覆蓋。 – 2012-01-31 17:43:09

+0

傳送縮小的JS文件不應該很長,並且如果服務器上的文件比剛剛創建的文件更新,那麼會出現嚴重問題。你如何保證服務器上的這個新文件與新部署兼容? – 2012-01-31 17:51:37

回答

1

感謝@馬丁 - 克萊頓我能夠使用Touch任務到新創建的文件縮小的恢復到原來的最後修改日期。

下面是參數化的螞蟻呼叫允許CSS和JS文件,可以很容易地精縮:

<target name="minify-filetype" > 
    <echo>Minimise all ${filetype} files</echo> 
    <apply executable="java" parallel="false"> 
     <fileset dir="." includes="${build.web.dir}/${filetype}/*.${filetype}"/> 
     <arg line="-jar"/> 
     <arg path="../../../etc/ant/trunk/lib/yuicompressor-2.4.7.jar"/>    
     <srcfile/> 
     <arg line="-o"/> 
     <mapper type="glob" from="*.${filetype}" to="*-min.${filetype}"/> 
     <targetfile/>  
    </apply> 

    <echo>Convert minified files back to original Last Modified dates</echo> 
    <touch> 
     <fileset dir="." includes="${build.web.dir}/${filetype}/*.${filetype}" 
         excludes="${build.web.dir}/${filetype}/*-min.${filetype}"/> 
     <mapper type="glob" from="*.${filetype}" to="*-min.${filetype}"/> 
    </touch> 

    <!-- moving *-min.js and creating *.js files (overwriting orginal and deleting *-min) --> 
    <move todir="${build.web.dir}/${filetype}/" overwrite="true" preservelastmodified="true"> 
     <fileset dir="${build.web.dir}/${filetype}/" /> 
     <mapper type="glob" from="*-min.${filetype}" to="*.${filetype}"/> 
    </move> 
</target> 
1

建議你看看Ant選擇器,最有可能的是depend selector。如果你看到我的意思,他們會讓你將壓縮限制在只有那些未壓縮的javascript比以前的壓縮版本更新的文件上。

例如,像:

<apply executable="java" parallel="false"> 
    <fileset dir="." includes="${build.web.dir}/js/*.js" 
        excludes="${build.web.dir}/js/*-min.js"> 
     <depend targetdir="."> 
      <globmapper from="*.js" to="*-min.js"/> 
     </depend> 
    </fileset> 
    <arg line="-jar"/> 
    <arg path="yuicompressor-2.4.7.jar"/>   
    <srcfile/> 
    <arg line="-o"/> 
    <mapper type="glob" from="*.js" to="*-min.js"/> 
    <targetfile/>  
</apply> 
+0

我看到這個建議的另一個問題是我比較的文件在服務器上。當部署代碼時,它會在最小化之前檢入到一個乾淨的目錄中,並通過RSYNC分配給服務器。然後,RSYNC檢查上次修改的時間以確定是否更新服務器上的文件。目前這是毫無意義的,因爲所有文件都將當前時間設置爲最後修改日期。 它開始看起來像我可能需要調用一些外部程序,以恢復上次修改日期。 – 2012-01-31 19:09:52

+0

如何在執行最小化之前從服務器執行rsync,然後將rsync僅更改到僅更改的服務器。 – 2012-01-31 20:00:13

+0

不錯的想法似乎可以通過一些額外的步驟。主要的問題是,當你使用最小化版本進行第二次rsync更新時,文件會變得比版本庫中的更新。在下一次部署時,rsync將需要避免該文件,如果它沒有更改,因爲我希望它被標記爲警告,在需要調查的服務器上文件更新。如果解決方案不適用於ANT,那麼rsync的更多解決方案可能會帶來一個小問題,即文件不會完全同步,而且是時間上的。 – 2012-01-31 21:42:45