manoj-malviya / php_codesniffer
PHP_CodeSniffer 对 PHP、JavaScript 和 CSS 文件进行分词,并检测违反定义的编码标准。
Requires
- php: >=5.1.2
- ext-tokenizer: *
- ext-xmlwriter: *
This package is auto-updated.
Last update: 2024-08-29 04:31:09 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 代码审查时间,防止在混合制表符/空格、括号位置等简单事物上反复讨论。