He instalado PHPCS desde composer.json
"require-dev": { "phpstan/phpstan": "^0.12.93", "squizlabs/php_codesniffer": "^3.6" }, Estoy usando laravel 8, así que agregué el siguiente código para el archivo de confirmación previa en el archivo .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" "$1" "$2" output=$(eval "$3" 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"Pero esto me está dando el siguiente error:
[2/3] code sniffer NOK! xargs: ./vendor/bin/phpcs: No such file or directoryEDITAR:
Necesita agregar el código a continuación
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..." 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" != "" ] thenCódigo trabajado para que sea útil para otros:
#!C:/Program\ Files/Git/usr/bin/sh.exe PROJECT=`php -r "echo dirname(dirname(realpath('$0')));"` 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 $?y conjunto de reglas.xml es
<?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>Este gancho proviene de " Cómo configurar ganchos de confirmación de Git para PHP " de Benjamin Delespierre .
Tienes un ejemplo similar en fdemiramon gist , con el comentario :
Se supuso que tiene
phpcsyphpcbfen la carpetabin/.
La mejor práctica es usar el paquete dedicado para phpcs:squizlabs/PHP_CodeSniffer
Eso significa: incluya una dependencia para squizlabs/php_codesniffer en su archivo composer.json (lo cual hizo).
Por ejemplo:
{ "require-dev": { "squizlabs/php_codesniffer": "3.*" } }Luego podrá ejecutar
PHP_CodeSnifferdesde el directoriobindelvendor:
./vendor/bin/phpcs -h ./vendor/bin/phpcbf -h Si el uso de la ruta completa ( /d/Xampp/htdocs/project/vendor/bin/phpcs ) no funciona, aunque sea difícil, en un shell de git bash, ls /d/Xampp/htdocs/project/vendor/bin/phpcs sí lo hace trabajo, verifique, como se comentó, el final de las líneas utilizadas para ese archivo.
Puede obtener la carpeta raíz con, como mencioné aquí , git rev-parse --git-dir .
Espero que olvides ejecutar composer install después de agregar require-dev a composer.
pero hice el gancho que publicaste en mi ./.git/hooks/pre-commit y trato de confirmar archivos .php . y no tuve ningún error.
o tengo pwd en la función de secuencia de comandos de gancho e imprime el directorio raíz del proyecto . y todo parece estar bien. ya que.
por tu comentario, solo creo que estás ejecutando Windows:
tienes que escribir esto:
#!C:/Program\ Files/Git/usr/bin/sh.exeen lugar de unix shebang:
#!/bin/shEl repositorio de git deseado inicializado y el compositor inicializado es el directorio base de su proyecto
suponga que este es su directorio base: /d/Xampp/htdocs/proj/ , entonces su compositor generado debería estar en este directorio:
/d/Xampp/htdocs/proj/composer.json /d/Xampp/htdocs/proj/composer.lock /d/Xampp/htdocs/proj/vendor/ Además, su .git debe estar en este directorio:
/d/Xampp/htdocs/proj/.git/del resultado publicado de pwd, creo que su directorio git está debajo de:
/d/Xampp/htdocs/proj/api/v2/.git/ así que sugiero eliminar el directorio /d/Xampp/htdocs/proj/api/v2/.git/ , luego ir al cd D:\\Xampp\htdocs\proj y git init , debería crear un nuevo .git directorio en D:\\Xampp\htdocs\proj .
el pwd imprime el directorio actual , parece que cuando el script de gancho comienza a ejecutar su ruta es lo que se ha informado de pwd.
puede agregar este gravamen antes de la output=...
cd ../.. pwd si la pestaña impresa está en otro lugar en lugar del directorio base de su proyecto, puede cambiar el directorio con el cd .