X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/3ddf076ca3e59ab12b7237bd31702300dcbb3164..e0117cc756e4ec7d3336fbed119b90abf0f90818:/README.md diff --git a/README.md b/README.md index ebc9136..3998c89 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,46 @@ Installation Applications that use Symfony Flex ---------------------------------- -Open a command console, enter your project directory and execute: +Add bundle custom repository to your project's `composer.json` file: + +```json +{ + ..., + "repositories": [ + { + "type": "package", + "package": { + "name": "rapsys/packbundle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://git.rapsys.eu/packbundle", + "reference": "master" + }, + "autoload": { + "psr-4": { + "Rapsys\\PackBundle\\": "" + } + }, + "require": { + "symfony/asset": "^4.4", + "symfony/flex": "^1.5", + "symfony/framework-bundle": "^4.4", + "symfony/process": "^4.4", + "symfony/twig-bundle": "^4.4", + "twig/extensions": "^1.5" + } + } + } + ], + ... +} +``` + +Then open a command console, enter your project directory and execute: ```console -$ composer require +$ composer require rapsys/packbundle dev-master ``` Applications that don't use Symfony Flex @@ -19,7 +55,7 @@ Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle: ```console -$ composer require +$ composer require rapsys/packbundle dev-master ``` This command requires you to have Composer installed globally, as explained @@ -42,7 +78,7 @@ class AppKernel extends Kernel { $bundles = array( // ... - new \\(), + new Rapsys\PackBundle\RapsysPackBundle(), ); // ... @@ -51,3 +87,189 @@ class AppKernel extends Kernel // ... } ``` + +### Step 3: Configure the Bundle + +Setup configuration file `config/packages/rapsys_pack.yaml` with the following +content available in `Resources/config/packages/rapsys_pack.yaml`: + +```yaml +#Services configuration +services: + #Replace assets.packages definition + assets.packages: + class: 'Symfony\Component\Asset\Packages' + arguments: [ '@rapsys_pack.path_package' ] + #Replace assets.context definition + assets.context: + class: 'Rapsys\PackBundle\Context\RequestStackContext' + arguments: [ '@request_stack', '%asset.request_context.base_path%', '%asset.request_context.secure%' ] + #Register assets pack package + rapsys_pack.path_package: + class: 'Rapsys\PackBundle\Package\PathPackage' + arguments: [ '/', '@assets.empty_version_strategy', '@assets.context' ] + public: true + #Register twig pack extension + rapsys_pack.pack_extension: + class: 'Rapsys\PackBundle\Extension\PackExtension' + arguments: [ '@file_locator', '@service_container', '@rapsys_pack.path_package', '@rapsys_pack.slugger_util' ] + tags: [ 'twig.extension' ] + #Register slugger util service + rapsys_pack.slugger_util: + class: 'Rapsys\PackBundle\Util\SluggerUtil' + arguments: [ '%kernel.secret%' ] + public: true + #Register slugger util class alias + Rapsys\PackBundle\Util\SluggerUtil: + alias: 'rapsys_pack.slugger_util' +``` + +Open a command console, enter your project directory and execute the following +command to see default bundle configuration: + +```console +$ php bin/console config:dump-reference RapsysPackBundle +``` + +Open a command console, enter your project directory and execute the following +command to see current bundle configuration: + +```console +$ php bin/console debug:config RapsysPackBundle +``` + +### Step 4: Use the twig extension in your Template + +You can use a template like this to generate your first `rapsys_pack` enabled +template: + +```twig + + + + + {% block title %}Welcome!{% endblock %} + {% stylesheet '//fonts.googleapis.com/css?family=Irish+Grover|La+Belle+Aurore' '@NamedBundle/Resources/public/css/{reset,screen}.css' '@Short/css/example.css' %} + + {% endstylesheet %} + + + {% block body %}{% endblock %} + {% javascript '@Short/js/*.js' %} + + {% endjavascript %} + + +``` + +### Step 5: Make sure you have local binary installed + +You need to have cpack and jpack scripts from https://git.rapsys.eu/packer/ repository +set as executable and installed in /usr/local/bin. + +To install cpack and jpack required packages open a root console and execute the +following command: + +```console +# urpmi perl-base perl-CSS-Packer perl-JavaScript-Packer +``` + +or stone age distributions: + +```console +# apt-get install libcss-packer-perl libjavascript-packer-perl +``` + +or other distributions through cpan: + +```console +# cpan App::cpanminus +# cpanm CSS::Packer +# cpanm JavaScript::Packer +``` + +### Step 6: Create your own filter + +You can create you own mypackfilter class which call a mypack binary: + +```php +fileName = $fileName; + + //Set line + $this->line = $line; + + //Set bin + $this->bin = $bin; + + //Check argument presence + if (!empty($this->...)) { + //Append argument + if ($this->... == '...') { + $this->bin .= ' ...'; + } else { + //Throw an error on ... + throw new Error(sprintf('Got ... for %s: %s', $this->bin, $this->...), $this->line, $this->fileName); + } + } + } + + //Pass merge of all inputs in content + public function process(string $content): string { + //Create descriptors + $descriptorSpec = array( + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w') + ); + + //Open process + if (is_resource($proc = proc_open($this->bin, $descriptorSpec, $pipes))) { + //Set stderr as non blocking + stream_set_blocking($pipes[2], false); + + //Send content to stdin + fwrite($pipes[0], $content); + + //Close stdin + fclose($pipes[0]); + + //Read content from stdout + if ($stdout = stream_get_contents($pipes[1])) { + $content = $stdout; + } + + //Close stdout + fclose($pipes[1]); + + //Read content from stderr + if (($stderr = stream_get_contents($pipes[2]))) { + throw new Error(sprintf('Got unexpected strerr for %s: %s', $this->bin, $stderr), $this->line, $this->fileName); + } + + //Close stderr + fclose($pipes[2]); + + //Close process + if (($ret = proc_close($proc))) { + throw new Error(sprintf('Got unexpected non zero return code %s: %d', $this->bin, $ret), $this->line, $this->fileName); + } + } + + //Return content + return $content; + } +} +``` + +The class must implements FilterInterface and get it's arguments through constructor.