manoj-malviya/php_codesniffer

PHP_CodeSniffer 对 PHP、JavaScript 和 CSS 文件进行分词,并检测违反定义的编码标准。

2.4.0 2015-11-23 21:30 UTC

README

首先,我们需要指定一个开发依赖来安装 phpcs。它看起来像这样

{
    "require-dev": {
        "manoj-malviya/php_codesniffer": "^2.4"
    }
}

安装脚本

Composer 有一个名为 scripts 的便利模式入口。它支持 post-install-cmd 脚本钩子。我们将使用它来安装一个 git pre-commit 钩子。添加到上面的示例中

{
    "require-dev": [
        "manoj-malviya/php_codesniffer": "^2.4"
    ],
    "scripts": {
        "post-install-cmd": [
            "bash contrib/setup.sh"
        ]
    }
}

这将在运行 composer install 命令时运行一个名为 setup.sh 的 bash 脚本。

设置 Git Pre-commit 钩子

在我们的 setup.sh 中,我们需要将一个 pre-commit 脚本复制到 .git/hooks 目录中

#!/bin/sh

cp contrib/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

这将从 contrib 目录复制我们的 pre-commit 脚本到 git 特殊目录的 hooks 部分,并使其可执行。

创建 Pre-commit 钩子

每当一个贡献开发者尝试提交代码时,它将运行我们的 pre-commit 脚本。现在我们只需要运行针对此提交的特定文件的代码检查规则

#!/bin/sh

PROJECT=`php -r "echo dirname(dirname(dirname(realpath('$0'))));"`
STAGED_FILES_CMD=`git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\\\.php`

# Determine if a file list is passed
if [ "$#" -eq 1 ]
then
    oIFS=$IFS
    IFS='
    '
    SFILES="$1"
    IFS=$oIFS
fi
SFILES=${SFILES:-$STAGED_FILES_CMD}

echo "Checking PHP Lint..."
for FILE in $SFILES
do
    php -l -d display_errors=0 $PROJECT/$FILE
    if [ $? != 0 ]
    then
        echo "Fix the error before commit."
        exit 1
    fi
    FILES="$FILES $PROJECT/$FILE"
done

if [ "$FILES" != "" ]
then
    echo "Running Code Sniffer..."
    ./vendor/bin/phpcs --standard=PSR1 --encoding=utf-8 -n -p $FILES
    if [ $? != 0 ]
    then
        echo "Fix the error before commit."
        exit 1
    fi
fi

exit $?

此脚本将获取提交的暂存文件,运行 php lint 检查(始终很好),并将代码检查规则应用于暂存文件。

如果有代码标准违反,phpcs 进程将返回非零退出状态,这将告诉 git 中断提交。

整合一切

在所有这些准备就绪后,工作流程如下

开发者运行 composer install。PHP Code Sniffer 通过开发依赖项安装。post-install 命令自动将 pre-commit 钩子复制到开发者的本地 git 钩子中。当开发者提交代码时,pre-commit 钩子触发,检查暂存文件中的编码标准违反和 lint 检查。这是一个相对简单的设置,可以节省大量的 pull request 代码审查时间,防止在混合制表符/空格、括号位置等简单事物上反复讨论。