A Robo Less taskjának kibővítése
A Robo egy egyszerű és elegáns feladat végrehajtó. A Less taskja szintén egyszerű, de inkább buta, mint elegáns. Ha a less fájlok különböző mappák között vannak szétszórva, akkor két megoldás közül választhatunk. Vagy CSS fordítás előtt átírjuk a fájlokat vagy kibővítjük a Less taskot és felokosítjuk.
A problémába nagyon hamar bele lehet ütközni, elég ha két külön mappában tároljuk a less fájlokat, a fordító scriptet pedig egy harmadikban. Vegyük a következő szerkezetet:
- css mappa
- bootstrap mappa
- bootstrap.less
- testreszabott css mappa
- main.less
- bootstrap mappa
- RoboFile.php
A fájlszerkezetben kínálja magát a megoldás, hogy a main.less fájlban relatívan hivatkozzunk a testvérmappában lévő fájlokra, pl. így:
/* töltsük be a bootstrap fájlokat */ @import "../bootstrap/bootstrap.less";
Azonban ha nekiállunk a beépített (0.5.3-as verziónál) Less taskkal fordítani a fájlokat, hibaüzenet fog minket fogadni:
[Less_Exception_Parser] File `../bootstrap/bootstrap.less` not found.
Az egyik megoldás az lenne, hogy fordítás előtt lecseréljük az összes elérési utat vagy abszolútra vagy a fordító scripthez képest relatívra. Ebben segítségünkre lehet a Replace task.
A másik megoldás, hogy kibővítjük és felokosítjuk a Less taskot. Ez már félig rendelkezésünkre is áll, mert a Less task által használt less.php támogatja az útvonalak behelyettesítését.
Új, okosabb Less compiler hozzáadásához szükségünk lesz egy traitre és egy LessTaskot kibővítő osztályra:
trait MyLess { function taskMyLess($input) { return new MyLessTask($input); } } class MyLessTask extends \Robo\Task\Assets\Less { protected $directories = []; protected function myless($file) { $lessCode = file_get_contents($file); $parser = new Less_Parser(); $parser->SetImportDirs($this->directories); $parser->parse($lessCode); return $parser->getCss(); } public function setImportPaths($paths) { $this->directories = $paths; return $this; } protected function lessCompilers() { return [ 'lessphp', //https://github.com/leafo/lessphp 'less', // https://github.com/oyejorge/less.php, 'myless', // https://github.com/oyejorge/less.php, but with advanced options ]; } }
A kódon látjuk, hogy az eredeti Less taskot kibővítettük egy setImportPaths nevű metódussal, amit felhasználhatunk a fordítás során, hogy megadjuk a less.php fordítónak az útvonalakat. Az új feladatot így használhatjuk fel:
class RoboFile extends \Robo\Tasks { // használjuk az új taskunkat use MyLess; public function makecss () { $this->taskMyLess([ 'css/testreszabott css mappa/main.less' => 'dist/main.css' ]) ->setImportPaths([ '/var/www/project/css/bootstrap'=>'../bootstrap', ]) ->compiler('myless') ->run(); } }
Ezt meghívva már sikeres fordítást kell kapnunk:
[MyLessTask] Wrote CSS to dist/main.css
A kódot alapul véve nagyon egyszerűen létrehozhatunk más CSS fordítókat is, akár SCSS fordítót is. A bejegyzés írásának napjaiban merge-elve lett az Scss taskot létrehozó pull requestem, Scsshez nyugodtan használjuk azt.