2012-07-11 33 views
0

我想使我的網站儘可能高效,其中一部分是縮小我的CSS和JavaScript文件。我的目標是能夠在開發過程中使用unminified文件,但在生產中使用縮小文件。所以我的想法是讓我的未命名的文件名是正常的(foo.css)和我縮小的文件名是相同的,只有在開始時用下劃線(_foo.css)。YUI Compressor的Bash腳本與Git一起使用

由於開發環境不使用縮小文件,我不必擔心保持縮小的文件是最新的。他們唯一應該生成的時候是我提交到網站的Git存儲庫。所以把它變成Git鉤子是有道理的,這是我以前從未做過的事情。我希望這個鉤子也適合我的同事。我在Mac上,他們在Linux上。我有一個可用的shell腳本,但是有兩件事需要修改,以便它可以用作Git鉤子並由我的同事使用。這兩件事是我需要幫助的。但首先,代碼:

#!/bin/bash 

# The files to ignore are already minified. 

css_files_to_ignore=(
    "jquery.colorbox-min.css" 
); 

js_files_to_ignore=(
    "jquery.colorbox-min.js" 
); 

base_folder=/Applications/MAMP/htdocs/my_project/app/webroot 
yuicompressor_path=/Applications/yuicompressor.jar 

function process_assets() { 
    extension=$1 
    files_minified=0 

    for infile in $(echo "$base_folder/$extension/*.$extension") 
    do 
     [[ -f $infile ]] || continue 

     filename=${infile##*/} 

     # If the filename starts with an underscore, that means that the file is a 
     # minified file that was previously generated. 

     [[ ${filename:0:1} != "_" ]] || continue 

     ignore_this_file=false 

     files_to_ignore=$extension"_files_to_ignore" 

     for i in $(eval echo \${$files_to_ignore[@]}) 
     do 
      if [[ $i == $filename ]]; then 
       ignore_this_file=true 
       break 
      fi 
     done 

     if [ $ignore_this_file == false ]; then 
      minified_file="$base_folder/$extension/_$filename" 

      if [ ! -f "$minified_file" ] || test $infile -nt $minified_file; then 
       java -jar $yuicompressor_path "$infile" -o "$minified_file" 
       ((files_minified++)) 
      fi 
     fi 
    done 

    if [ $extension == "css" ]; then 
     file_type=CSS 
    else 
     file_type=JavaScript 
    fi 

    echo -n "$files_minified $file_type file" 

    if [ "$files_minified" == "1" ]; then 
     echo -n " was" 
    else 
     echo -n "s were" 
    fi 

    echo " minified" 
} 

if [ -f $yuicompressor_path ]; then 
    process_assets css 
    process_assets js 
else 
    echo "YUI Compressor was not found. Aborting." 
    exit 1 
fi 

,我需要的是如何處理base_folder變量幫助的第一件事。由於這將是一個Git鉤子,該變量應該如何設置?在提交時當前的工作目錄是否會影響腳本?

我需要幫助的第二件事是如何處理yuicompressor_path變量。正如我前面所說,我在Mac上,我的同事在Linux上。如果可能,我希望Git鉤子爲我們所有人工作。我能否以適合我們所有人的方式設置變量?

謝謝!

回答

0

您可以根據Git存儲庫的路徑構建變量內容。

base_folder="$(git rev-parse --show-toplevel)" 

將設置base_folder等於到Git存儲庫頂層的路徑。如果您需要將其設置爲子路徑,則可以在之後添加該路徑。如果你的Git回購是在my_project文件夾級別,你可能會做......

base_folder="$(git rev-parse --show-toplevel)/app/webroot" 

這應該在兩個OS X和Linux工作。


設置yuicompressor的路徑有點棘手。我推薦的是讓人們在他們的本地系統上安裝鉤子時手動設置它,或者(如果yuicompressor在路徑中),請使用which

+0

'base_folder =「$(git rev-parse --show-toplevel)/ app/webroot」'工作!謝謝!至於'yuicompressor_path'變量,如果該文件存在,我將它設置爲'/ Applications/yuicompressor.jar',否則我將它設置爲'$(command -v yui-compressor)',並確保該命令的輸出是一個有效的文件。 – Nick 2012-07-11 19:54:03