0

我想让我的网站尽可能高效,其中一部分是缩小我的 CSS 和 JavaScript 文件。我的目标是能够在开发中使用未缩小的文件,但在生产中使用缩小的文件。所以我的想法是让我的未缩小文件名正常(foo.css)并且我的缩小文件名相同,只是开头有一个下划线(_foo.css)。

由于开发环境不使用压缩文件,我不必担心保持压缩文件是最新的。唯一应该生成它们的时间是当我提交到网站的 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 挂钩对我们所有人都有效。我可以以适合我们所有人的方式设置该变量吗?

谢谢!

4

1 回答 1

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.

于 2012-07-11T04:18:10.063 回答