Search code examples
phpwindowssymfonyasseticyui-compressor

symfony2 assetics yui compressor on windows (path syntax)


I'm trying to get assetics running with the yui compressor and, if this is running, sass. Right now, both don't work. When removing all filters from config.yml and the twig template, it works and php app/console assetic:dump does copy the css and js files.

Now I want to add the yui compressor and my config.yml looks like this:

assetic:
  debug: %kernel.debug%
  use_controller: false
  filters:
    yui_js:
      jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.6.jar

Adding the filter to the template and running assetic:dump again ends in the following error (translation of message by me):

[RuntimeException]
The syntax for filename, directory name or drive name is wrong

I found an article telling me to specify the path to java.exe, so I add this to config.yml:

assetic:
  ..
  java: C:/Program Files (x86)/Java/jre6/bin/java.exe
  ..

Now assetic:dump tells me:

[RuntimeException]
The COMMAND "C:/Program" is either written wrong or

I tried playing around with both variables (using \ or \ instead of /, adding single or double quotes, working with short alias Progra~1 or Progra~2) in the config, but I didn't get anywhere. The both errors comming up all the time. Maybe someone can point me in the right direction.


Solution

  • Ok, I figured it out. Man, this one was brutal.

    Let's start with the easy stuff. A working version of the config.yml can look like this:

    assetic:
      debug: false
      use_controller: false
      java: C:\Program Files (x86)\Java\jre6\bin\java.exe
      sass: C:\Program Files (x86)\Ruby192\bin\sass.bat
      filters:
        scss: ~
        yui_js:
          jar: %kernel.root_dir%\Resources\java\yuicompressor-2.4.6.jar
    

    For some reason, assetic is always importing a whole directory for scss, so I had to make a combine.scss which imports the other scss files in the correct order.

    And now it gets ugly, as one have to change the assetics core in order to get this working. The developers of assetic know this bug and I think it is fixed in some development trunk/branch but not the stable one.

    The Assetic\Util\ProcessBuilder has to be changed on line 95

    if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
    

    ,line 103

    $script .= ' '.implode(' ', array_map('escapeshellarg', $args));
    

    and line 110

    return new Process($script, $this->cwd, null, $this->stdin, $this->timeout, $options);
    

    I hope this bug get fixed soon and till then anybody trying to get it working finds this thread... Took me like 8 hours of debuging, reading and trying different approaches.