Git PHPCS 的预提交挂钩在 Windows 中给我错误 Laravel
Git Pre-Commit hook for PHPCS is giving me error in Windows for Laravel
我已经从 composer.json
安装了 PHPCS
"require-dev": {
"phpstan/phpstan": "^0.12.93",
"squizlabs/php_codesniffer": "^3.6"
},
我正在使用 laravel 8,所以我在 .git/hooks/pre-commit
文件中为预提交文件添加了以下代码:
#!/bin/sh
# get bash colors and styles here:
# http://misc.flogisoft.com/bash/tip_colors_and_formatting
C_RESET='\e[0m'
C_RED='\e[31m'
C_GREEN='\e[32m'
C_YELLOW='\e[33m'
function __run() #(step, name, cmd)
{
local color output exitcode
printf "${C_YELLOW}[%s]${C_RESET} %-20s" "" ""
output=$(eval "" 2>&1)
exitcode=$?
if [[ 0 == $exitcode || 130 == $exitcode ]]; then
echo -e "${C_GREEN}OK!${C_RESET}"
else
echo -e "${C_RED}NOK!${C_RESET}\n\n$output"
exit 1
fi
}
modified="git diff --diff-filter=M --name-only --cached | grep \".php$\""
ignore="resources/lang,resources/views,bootstrap/helpers,database/migrations,bin"
phpcs="./vendor/bin/phpcs ./app --report=code --colors --report-width=80 --standard=PSR2 --ignore=${ignore}"
__run "1/3" "php lint" "${modified} | xargs -r php -l"
__run "2/3" "code sniffer" "${modified} | xargs -r ${phpcs}"
__run "3/3" "phpstan" "${modified} | xargs -r vendor/bin/phpstan analyse"
但这给了我以下错误:
[2/3] code sniffer NOK!
xargs: ./vendor/bin/phpcs: No such file or directory
编辑:
需要添加以下代码
PROJECT=`php -r "echo dirname(dirname(dirname(realpath('[=16=]'))));"`
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=""
IFS=$oIFS
fi
SFILES=${SFILES:-$STAGED_FILES_CMD}
echo "Checking PHP Lint..."
echo $FILES;exit 1;
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
这个钩子来自“How to setup Git commit hooks for PHP " from Benjamin Delespierre.
您在 fdemiramon gist, with the comment 中有一个类似的例子:
Assumed that you have both phpcs
and phpcbf
in bin/
folder.
Best practice is to use the dedicated package for phpcs: squizlabs/PHP_CodeSniffer
这意味着:在您的 composer.json
文件中包含 squizlabs/php_codesniffer
的依赖项(您这样做了)。
例如:
{
"require-dev": {
"squizlabs/php_codesniffer": "3.*"
}
}
You will then be able to run PHP_CodeSniffer
from the vendor
bin
directory:
./vendor/bin/phpcs -h
./vendor/bin/phpcbf -h
如果使用完整路径 (/d/Xampp/htdocs/project/vendor/bin/phpcs
) 不起作用,即使很难,在 git bash shell、ls /d/Xampp/htdocs/project/vendor/bin/phpcs
中也可以,如评论所述,请检查用于该文件的行尾。
您可以通过 mentioned here、git rev-parse --git-dir
.
获取根文件夹
我希望你在将 require-dev 添加到 composer 后忘记 运行 composer install
。
但是我已经制作了你在我的 ./.git/hooks/pre-commit
中发布的钩子并尝试提交 .php
文件。
我没有错误。
要么我在钩子脚本函数中有 pwd
并且它打印 项目根目录 。一切似乎都很好。
自从.
根据你的评论,我只是认为你 运行宁 windows:
你必须这样写:
#!C:/Program\ Files/Git/usr/bin/sh.exe
而不是 unix shebang:
#!/bin/sh
期望路径
所需的 git 存储库已初始化 & composer 初始化是您的 项目基目录
假设这是您的基本目录:/d/Xampp/htdocs/proj/
,
那么你生成的作曲家应该在这个目录下:
/d/Xampp/htdocs/proj/composer.json
/d/Xampp/htdocs/proj/composer.lock
/d/Xampp/htdocs/proj/vendor/
此外,
您的 .git
目录应该在这个目录中:
/d/Xampp/htdocs/proj/.git/
根据 pwd 发布的结果,我认为您的 git 目录位于:
/d/Xampp/htdocs/proj/api/v2/.git/
所以我建议删除/d/Xampp/htdocs/proj/api/v2/.git/
目录,
然后去 cd D:\Xampp\htdocs\proj
,
git init
,
它应该在 D:\Xampp\htdocs\proj
.
下创建一个新的 .git
目录
从脚本更改目录
pwd
打印 当前目录 , 似乎当 hook 脚本启动到 运行 它的路径就是报告的 pwd.
您可以在行 output=...
之前添加此留置权
cd ../..
pwd
如果打印的选项卡在其他地方而不是您的项目基目录,您可以使用 cd
更改目录。
工作代码以便对其他人有用:
#!C:/Program\ Files/Git/usr/bin/sh.exe
PROJECT=`php -r "echo dirname(dirname(realpath('[=10=]')));"`
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".php\{0,1\}$")
if [[ "$STAGED_FILES" = "" ]]; then
exit 0
fi
PASS=true
echo " Validating PHPCS:"
#doesnt matter where git was ran...just get absolute path to the .git folder
gitBase=`git rev-parse --absolute-git-dir`
# Check for phpcs
which ${gitBase}/../<path>/vendor/bin/phpcs &> /dev/null
if [[ "$?" == 1 ]]; then
echo " Please install PHPCS "
exit 1
fi
RULESET="$PROJECT/.githooks/ruleset.xml"
for FILE in $STAGED_FILES
do
${gitBase}/../<path>/vendor/bin/phpcs --colors --standard="$RULESET" -n -p "$FILE"
if [[ "$?" == 0 ]]; then
echo "PHPCS Passed: $FILE "
else
echo "PHPCS Failed: $FILE "
PASS=false
fi
done
echo " PHPCS validation completed! "
if ! $PASS; then
echo " COMMIT FAILED: Your commit contains files that should pass PHPCS but do not. Please fix the PHPCS errors and try again. "
exit 1
else
echo " COMMIT SUCCEEDED "
fi
exit $?
并且ruleset.xml是
<?xml version="1.0"?>
<ruleset name="PHP_CodeSniffer">
<description>The coding standard for our project.</description>
<rule ref="PSR2" />
<file>app</file>
<file>bootstrap</file>
<file>config</file>
<file>database</file>
<file>resources</file>
<file>routes</file>
<file>tests</file>
<exclude-pattern>bootstrap/cache/*</exclude-pattern>
<exclude-pattern>bootstrap/autoload.php</exclude-pattern>
<exclude-pattern>*/migrations/*</exclude-pattern>
<exclude-pattern>*/seeds/*</exclude-pattern>
<exclude-pattern>*.blade.php</exclude-pattern>
<exclude-pattern>*.js</exclude-pattern>
<exclude-pattern>tests/*</exclude-pattern>
<!-- Show progression -->
<arg value="p"/>
</ruleset>
我已经从 composer.json
安装了 PHPCS"require-dev": {
"phpstan/phpstan": "^0.12.93",
"squizlabs/php_codesniffer": "^3.6"
},
我正在使用 laravel 8,所以我在 .git/hooks/pre-commit
文件中为预提交文件添加了以下代码:
#!/bin/sh
# get bash colors and styles here:
# http://misc.flogisoft.com/bash/tip_colors_and_formatting
C_RESET='\e[0m'
C_RED='\e[31m'
C_GREEN='\e[32m'
C_YELLOW='\e[33m'
function __run() #(step, name, cmd)
{
local color output exitcode
printf "${C_YELLOW}[%s]${C_RESET} %-20s" "" ""
output=$(eval "" 2>&1)
exitcode=$?
if [[ 0 == $exitcode || 130 == $exitcode ]]; then
echo -e "${C_GREEN}OK!${C_RESET}"
else
echo -e "${C_RED}NOK!${C_RESET}\n\n$output"
exit 1
fi
}
modified="git diff --diff-filter=M --name-only --cached | grep \".php$\""
ignore="resources/lang,resources/views,bootstrap/helpers,database/migrations,bin"
phpcs="./vendor/bin/phpcs ./app --report=code --colors --report-width=80 --standard=PSR2 --ignore=${ignore}"
__run "1/3" "php lint" "${modified} | xargs -r php -l"
__run "2/3" "code sniffer" "${modified} | xargs -r ${phpcs}"
__run "3/3" "phpstan" "${modified} | xargs -r vendor/bin/phpstan analyse"
但这给了我以下错误:
[2/3] code sniffer NOK!
xargs: ./vendor/bin/phpcs: No such file or directory
编辑:
需要添加以下代码
PROJECT=`php -r "echo dirname(dirname(dirname(realpath('[=16=]'))));"`
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=""
IFS=$oIFS
fi
SFILES=${SFILES:-$STAGED_FILES_CMD}
echo "Checking PHP Lint..."
echo $FILES;exit 1;
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
这个钩子来自“How to setup Git commit hooks for PHP " from Benjamin Delespierre.
您在 fdemiramon gist, with the comment 中有一个类似的例子:
Assumed that you have both
phpcs
andphpcbf
inbin/
folder.
Best practice is to use the dedicated package for phpcs:squizlabs/PHP_CodeSniffer
这意味着:在您的 composer.json
文件中包含 squizlabs/php_codesniffer
的依赖项(您这样做了)。
例如:
{
"require-dev": {
"squizlabs/php_codesniffer": "3.*"
}
}
You will then be able to run
PHP_CodeSniffer
from thevendor
bin
directory:
./vendor/bin/phpcs -h
./vendor/bin/phpcbf -h
如果使用完整路径 (/d/Xampp/htdocs/project/vendor/bin/phpcs
) 不起作用,即使很难,在 git bash shell、ls /d/Xampp/htdocs/project/vendor/bin/phpcs
中也可以,如评论所述,请检查用于该文件的行尾。
您可以通过 mentioned here、git rev-parse --git-dir
.
我希望你在将 require-dev 添加到 composer 后忘记 运行 composer install
。
但是我已经制作了你在我的 ./.git/hooks/pre-commit
中发布的钩子并尝试提交 .php
文件。
我没有错误。
要么我在钩子脚本函数中有 pwd
并且它打印 项目根目录 。一切似乎都很好。
自从.
根据你的评论,我只是认为你 运行宁 windows:
你必须这样写:
#!C:/Program\ Files/Git/usr/bin/sh.exe
而不是 unix shebang:
#!/bin/sh
期望路径
所需的 git 存储库已初始化 & composer 初始化是您的 项目基目录
假设这是您的基本目录:/d/Xampp/htdocs/proj/
,
那么你生成的作曲家应该在这个目录下:
/d/Xampp/htdocs/proj/composer.json
/d/Xampp/htdocs/proj/composer.lock
/d/Xampp/htdocs/proj/vendor/
此外,
您的 .git
目录应该在这个目录中:
/d/Xampp/htdocs/proj/.git/
根据 pwd 发布的结果,我认为您的 git 目录位于:
/d/Xampp/htdocs/proj/api/v2/.git/
所以我建议删除/d/Xampp/htdocs/proj/api/v2/.git/
目录,
然后去 cd D:\Xampp\htdocs\proj
,
git init
,
它应该在 D:\Xampp\htdocs\proj
.
.git
目录
从脚本更改目录
pwd
打印 当前目录 , 似乎当 hook 脚本启动到 运行 它的路径就是报告的 pwd.
您可以在行 output=...
cd ../..
pwd
如果打印的选项卡在其他地方而不是您的项目基目录,您可以使用 cd
更改目录。
工作代码以便对其他人有用:
#!C:/Program\ Files/Git/usr/bin/sh.exe
PROJECT=`php -r "echo dirname(dirname(realpath('[=10=]')));"`
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".php\{0,1\}$")
if [[ "$STAGED_FILES" = "" ]]; then
exit 0
fi
PASS=true
echo " Validating PHPCS:"
#doesnt matter where git was ran...just get absolute path to the .git folder
gitBase=`git rev-parse --absolute-git-dir`
# Check for phpcs
which ${gitBase}/../<path>/vendor/bin/phpcs &> /dev/null
if [[ "$?" == 1 ]]; then
echo " Please install PHPCS "
exit 1
fi
RULESET="$PROJECT/.githooks/ruleset.xml"
for FILE in $STAGED_FILES
do
${gitBase}/../<path>/vendor/bin/phpcs --colors --standard="$RULESET" -n -p "$FILE"
if [[ "$?" == 0 ]]; then
echo "PHPCS Passed: $FILE "
else
echo "PHPCS Failed: $FILE "
PASS=false
fi
done
echo " PHPCS validation completed! "
if ! $PASS; then
echo " COMMIT FAILED: Your commit contains files that should pass PHPCS but do not. Please fix the PHPCS errors and try again. "
exit 1
else
echo " COMMIT SUCCEEDED "
fi
exit $?
并且ruleset.xml是
<?xml version="1.0"?>
<ruleset name="PHP_CodeSniffer">
<description>The coding standard for our project.</description>
<rule ref="PSR2" />
<file>app</file>
<file>bootstrap</file>
<file>config</file>
<file>database</file>
<file>resources</file>
<file>routes</file>
<file>tests</file>
<exclude-pattern>bootstrap/cache/*</exclude-pattern>
<exclude-pattern>bootstrap/autoload.php</exclude-pattern>
<exclude-pattern>*/migrations/*</exclude-pattern>
<exclude-pattern>*/seeds/*</exclude-pattern>
<exclude-pattern>*.blade.php</exclude-pattern>
<exclude-pattern>*.js</exclude-pattern>
<exclude-pattern>tests/*</exclude-pattern>
<!-- Show progression -->
<arg value="p"/>
</ruleset>