Relativ recent am descoperit că pot face auto-formatarea codului la… commit. Da, știu, mind blowing 😀
Eu am nevoie de formatarea SCSS, JS, JSON și PHP. Folosesc întotdeauna composer câteva pachete node, deci am packages.json
și composer.json
mereu în proiect. Prin urmare, folosim câteva pachete Node pentru a face treaba:
$ npm i --save-dev cross-env husky lint-staged prettier prettier-stylelint stylelint-scss
Husky instalează hooks de git necesare, lint-staged execută hooks pentru fișierele staged, cross-env permite setarea de variabile. Apoi, adăugăm în package.json
:
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,jsx}": [ "prettier --write", "git add" ],
"*.{json}": [ "prettier --write --parser=json", "git add" ],
"*.{scss,sass}": [ "prettier-stylelint --quiet --write", "git add" ],
"*.{php,php_cs}": [ "php -l", "cross-env PHP_CS_FIXER_FUTURE_MODE=1 php-cs-fixer fix --config=.php_cs", "git add" ]
}
}
Apoi avem fișierele de config:
// .prettierrc
{
"useTabs": true,
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"bracketSpacing": true,
"jsxBracketSameLine": true,
"arrowParens": "always"
}
// .stylelintrc
{
"plugins": [
"stylelint-scss",
],
"rules": {
"indentation": 2,
"string-quotes": "single",
"color-no-invalid-hex": true,
"function-parentheses-space-inside": "always",
"media-feature-parentheses-space-inside": "always",
"selector-pseudo-class-parentheses-space-inside": "always",
"max-empty-lines": 2,
"scss/at-function-parentheses-space-before": "always"
}
}
Pentru formatarea codului PHP avem nevoie să instalăm un pachet global:
$ composer global require friendsofphp/php-cs-fixer
<?php
//.php_cs
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)
->setRules(
[
'@Symfony' => true,
'@Symfony:risky' => true,
'@PHP71Migration' => true,
'braces' => true,
'array_indentation' => true,
'array_syntax' => ['syntax' => 'short'],
'dir_constant' => true,
'heredoc_to_nowdoc' => true,
'linebreak_after_opening_tag' => true,
'modernize_types_casting' => true,
'multiline_whitespace_before_semicolons' => true,
'no_unreachable_default_argument_value' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'ordered_class_elements' => true,
'ordered_imports' => true,
'phpdoc_add_missing_param_annotation' => ['only_untyped' => false],
'phpdoc_order' => true,
'doctrine_annotation_braces' => true,
'doctrine_annotation_indentation' => true,
'doctrine_annotation_spaces' => true,
'psr4' => true,
'no_php4_constructor' => true,
'no_short_echo_tag' => true,
'semicolon_after_instruction' => true,
'align_multiline_comment' => true,
'doctrine_annotation_array_assignment' => true,
'general_phpdoc_annotation_remove' => ['annotations' => ['author', 'package']],
'list_syntax' => ['syntax' => 'short'],
'phpdoc_types_order' => ['null_adjustment' => 'always_last'],
'single_line_comment_style' => true,
]
)
->setCacheFile(__DIR__.'/.php_cs.cache')
->setIndent("\t")
->setFinder(
PhpCsFixer\Finder::create()
->in(__DIR__)
);
Și cam asta e. De fiecare dată când se face commit, autoformatarea se aplică pe fișierul modificat. Asta înseamnă și un timp mai mare de commit, dar până acum nu am observat un delay mai mare de 5-10 secunde.
Evident, regulile sunt ajustabile, fiecare formatter având propriile opțiuni.
Lasă un răspuns