Přechod z PHP_CodeSniffer a Slevomatu

Převod phpcs.xml na konfiguraci DressCode, příkazy phpcs a phpcbf nahrazené příkazy check a fix, jiné exit kódy a přehled toho, co odpovídá čemu.

Než začnete

Projděte si společný postup: kód a komentáře můžete nechat, jak jsou, konfiguraci převede import a komentáře přepíše migrate-suppressions. Tahle stránka doplňuje, co je u PHP_CodeSniffer zvláštní. A jedna dobrá zpráva rovnou: phpcs.xml je XML, takže ho import přečte i tehdy, když už jsou PHP_CodeSniffer i Slevomat odinstalované.

Převod konfigurace

dresscode import phpcs.xml > dresscode.php

Sady PSR1, PSR2 a PSR12 se překládají na preset dresscode/psr12. Jednotlivé sniffy (pravidla PHP_CodeSniffer) se překládají jménem, a kde má vlastnost z <properties> protějšek, tak i s ní: Generic.Files.LineLength je dresscode/line-length a jeho absoluteLineLimit se stane klíčem lineLength, SlevomatCodingStandard.Namespaces.UnusedUses je dresscode/unused-imports, Squiz.WhiteSpace.OperatorSpacing je dresscode/binary-operator-spacing. Délka řádku je v DressCode jedna pro všechna pravidla, takže ji nastaví i SlevomatCodingStandard.Files.LineLength a o jedna menší než minLineLength také RequireMultiLineMethodSignature a RequireMultiLineCondition ze Slevomatu; když se hodnoty liší, import nechá nejmenší a upozorní na to.

Vyloučení sniffu uvnitř sady (<exclude name="…"/>) import přenese jako vypnutí pravidla, které sniffu odpovídá. Když ale odpovídající pravidlo DressCode pokrývá i jiný sniff, import ho nechá zapnuté a vypíše varování; stejně tak u vyloučení jedné zprávy sniffu (Generic.PHP.ForbiddenFunctions.Found), protože na jednu zprávu se pravidlo zúžit nedá. Umlčení přes <severity>0</severity> import nepřenáší; takové pravidlo vypněte v klíči rules hodnotou keep. Sniff bez protějšku skončí ve výpisu na chybovém výstupu; typicky jde o sniffy o dokumentačních komentářích z balíku Squiz.Commenting a o sniffy, které hlídají totéž co jiný sniff, jen jinými slovy.

Co v phpcs.xml není pravidlo a přepíšete to ručně:

  • <file> a <exclude-pattern> do klíčů paths a excludePaths; vzory popisuje Konfigurace. <exclude-pattern> uvnitř <rule> patří do přepisu, který pravidlu pro ty cesty dá hodnotu keep. Na obojí import upozorní.
  • <arg name="extensions"> do klíče fileExtensions.
  • <config name="php_version"> není potřeba, cílovou verzi si DressCode přečte z composer.json.
  • <arg name="tab-width"> a odsazení řeší preset, nebo klíč style.

Slevomat: jeho sniffy, které DressCode pokrývá, se přeloží jménem jako každé jiné. Jeho pomocné třídy ani nastavení installed_paths tu nic nepotřebuje.

Příkazy

PHP_CodeSniffer DressCode
phpcs src dresscode check src
phpcbf src dresscode fix src
phpcs --standard=PSR12 src dresscode check --preset dresscode/psr12 src
phpcs --report=checkstyle dresscode check -f checkstyle
phpcs --report=json dresscode check -f json
phpcs --parallel=8 dresscode check --jobs 8
phpcs --cache cache je zapnutá sama; --no-cache ji obejde
phpcs -p průběh se na terminálu ukazuje sám
.phpcs.xml.dist dresscode.neon.dist

PHP_CodeSniffer rozlišuje exit kódem, jestli jsou nalezená porušení opravitelná, a phpcbf má vlastní stupnici. DressCode vrací 0 pro čisto, 1 pro porušení a 2 pro selhání nástroje; kolik porušení po opravě zbude, řekne shrnutí check a formát json. Skript, který exit kód vyhodnocuje, potřebuje jednu úpravu.

Co je jinak

  • Jeden nástroj na kontrolu i opravu. phpcs a phpcbf byly dva příkazy, které se občas neshodly, protože oprava mohla odhalit další porušení. Tady je fix totéž co check plus zápis, a co fix neopraví, ohlásí stejně jako check.
  • Priority sniffů neexistují, pravidla běží opakovaně do ustálení; proč.
  • Komentáře phpcs:ignore, phpcs:disable, phpcs:enable, phpcs:ignoreFile a @phpcsSuppress fungují dál, a to i se jmény sniffů. Přepis na dresscode:* je jeden příkaz a je dobrovolný.
  • Baseline je vestavěná. U PHP_CodeSniffer se o ní léta diskutuje a řeší se doplňky třetích stran. Tady ji zapíše check --generate-baseline a obsahuje jen to, co fix opravit neumí, takže opravám nepřekáží; viz Baseline.
  • Vlastní sniff se nepřenáší, ale přepisuje; nad stromem z něj obvykle zbude zlomek délky. Návod je na samostatné stránce.