Z Nette Coding Standardu
Nette Coding Standard 4 je od teď jen preset a extension nad DressCode: co udělá ncs migrate a proč první fix přeformátuje víc souborů, než čekáte.
Co se změnilo
Nette Coding Standard byl do verze 3 tenká obálka nad PHP CS Fixerem a PHP_CodeSniffer s balíkem pravidel od Slevomatu:
dva nástroje, dvě konfigurace (ncs.php pro fixer, ncs.xml pro sniffer) a příkaz ecs,
který to spouštěl. Verze 4 je přesně to, čím měla být vždycky: preset. Pár set řádků, které říkají,
jaká pravidla s jakými volbami dávají styl Nette, a extension, která je do DressCode zapojí.
Příkaz ncs check a ncs fix funguje dál, takže projekt, který ho volal z CI nebo z editoru,
nemusí měnit nic. Pod ním běží DressCode.
Migrace konfigurace
Projekt bez vlastní konfigurace nepotřebuje nic: ncs bez souboru použije extension Nette Coding Standardu a
výchozí preset nette/php. Projekt s ncs.php nebo ncs.xml je převede jedním
příkazem:
vendor/bin/ncs migrate
Výsledkem je dresscode.php s extension a s tím, co v původních souborech bylo navíc: přepsaná pravidla z
ncs.php jako enable() a disable(), vyloučené cesty z ncs.xml jako
excludePaths(). Jména pravidel projdou překladem na jména DressCode; co žádné pravidlo nepokrývá, příkaz
vypíše a vynechá. Volby přepsané z ncs.php se kopírují, jak jsou, s poznámkou, že jejich jména je potřeba
zkontrolovat proti ncs rules, protože volba fixeru a volba pravidla DressCode se mohou jmenovat jinak.
return Config::create()
->extension(Nette\CodingStandard\Extension::class)
->enable('dresscode/line-length', ['limit' => 100])
->excludePaths(['tests/fixtures']);
Od té chvíle je konfigurace jedna a dresscode i ncs čtou tutéž. Extension zaregistruje presety
nette/php (výchozí), nette/clean-code, nette/optimize-fn a nette/types,
vyloučí cesty, které vylučovala verze 3 (expected, tmp, fixtures*), a zachová filtr
souborů podle verze PHP, na který Nette spoléhá v testech.
První fix přeformátuje víc, než čekáte
Verze 4 není řádek po řádku totéž co verze 3, a schválně. Některé rozdíly jsou opravy toho, co verze 3 nechávala
být: velké písmeno na začátku komentáře // Komentář, komentář /* enum */ před
case, declare(strict_types=1) na řádku otevíracího tagu, nezlomitelná mezera zapsaná doslova
v řetězci. Napříč balíčky Nette to byla víc než stovka souborů z necelých tří tisíc.
Udělejte to jako samostatný commit: ncs fix, commit bez jiných změn, hotovo. Projít to řádek po řádku
nemá cenu; cenu má vědět, že v tom commitu není nic jiného.
Co zůstalo
- Komentáře
phpcs:ignorea spol. fungují dál; přepis nadresscode:ignoreuděládresscode migrate-suppressions. - Presety
nette/clean-code,nette/optimize-fnanette/typesse zapínají vpresets, ne přes$presets/v XML. - Vlastní sniffy a fixery, pokud nějaké byly, se přepisují podle návodu; přepsaný sniff je obvykle několikanásobně kratší.