Symfony 2中的Assetic + YUI Compressor:这是一个错误吗?

10

我已经在命令行中测试过YUI压缩器(在Windows上),它似乎完美运行。

但是,由Assetic创建的.css文件没有被压缩,并且在顶部(在.css文件内部)带有此消息:

/*
[exception] 500 | Internal Server Error | RuntimeException
[message] 
[1] RuntimeException: 
            at n/a
                in E:\websites\symfony2\public_html\Symfony\vendor\assetic\src\Assetic\Filter\Yui\BaseCompressorFilter.php line 81

            at Assetic\Filter\Yui\BaseCompressorFilter->compress('

这是一个配置问题吗?还是assetic的一个bug?

以下是我在twig模板中使用的代码:

{% stylesheets '@CompanyBundlenameBundle/Resources/public/css/style.css' filter='yui_css' %}
<link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" />
{% endstylesheets %}

我也遇到了完全相同的问题,但是在Mac OS X Lion上。 - David Morales
看起来 YUI 抛出了这个错误。你能否在 Assetic 之外运行压缩器来压缩 style.css? - Kris Wallsmith
7个回答

5
我有同样的问题...(这个问题似乎只存在于Windows系统中)我发现唯一的方法非常麻烦:
1. 在配置文件中指定Java可执行文件路径(与yui jar声明路径处于相同位置)
yui_css:
    jar: "%kernel.root_dir%\\Resources\\java\\yuicompressor.jar"
    java: "C:\\Program Files\\Java\\jre6\\bin\\java.exe"

2- 打开Assetic \ Util \ Process.php文件
更改“run”方法中的“proc_open”行(我的版本中的第123行)
原始行:

$process = proc_open($this->commandline, $descriptors, $pipes, $this->cwd, $this->env, $this->options);

修改后的代码:

$process = proc_open('"'.$this->commandline.'"', $descriptors, $pipes, $this->cwd, $this->env, $this->options);

它可以工作...但不是真正的解决方案...

如果有人有更多信息...谢谢:)


5
如果您正在使用最新稳定版本(1.0.2),则存在一个错误,使其无法在Windows上正确使用YUI压缩器。正如@ Pierre所指出的那样,问题在于调用proc_open函数的方式,但修复应在其他地方应用。
如果您查看Assetic \ Util \ ProcessBuilder类,您会在第95行找到罪魁祸首。
#95 if (defined('PHP_WINDOWS_MAJOR_VERSION')) {

在PHP中没有名为PHP_WINDOWS_MAJOR_VERSION的常量(http://php.net/manual/en/info.constants.php),这使得if语句测试的结果为false。应该使用PHP_WINDOWS_VERSION_MAJOR

我在这个类中发现的第二个问题是在下面几行:

#102 if ($args) {
#103   $script .= ' '.implode(' ', array_map('escapeshellarg', $parts));
#104 }

$parts在此作用域中未定义,应替换为$args

后来我发现,在这个提交中修复了这两个问题: https://github.com/kriswallsmith/assetic/commit/cc2e9adb744df0704a5357adc1cf9287c427420f,但代码还没有被标记。

希望这可以帮助您。


4
YUI压缩器需要在您的app/config/config.yml中定义,如下所示:
assetic:
    debug:          %kernel.debug%
    use_controller: false
    filters:
        cssrewrite: ~
        yui_css:
            jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.6.jar

当然,您需要下载YUI压缩器并将其复制到/app/Resources/java/目录中。

注意,Assetic Bundle不会自动发布您的压缩CSS文件,您需要使用以下命令手动发布它们:

php app/console assetic:dump 

在开发环境中,它会自动发布它们。无论如何,我尝试了转储命令,但是出现了同样的错误:RuntimeException。这很令人沮丧,看起来他们只在Linux上测试了代码。 - HappyDeveloper
我在Linux上工作,但无法在我的系统上重现您的错误。请测试symfony github问题,该团队非常敏锐。 - egeloen

3

不确定您是否解决了这个问题,但我今天遇到了同样的问题。

我按照上面的建议进行了操作,但仍然没有成功。

因此,我研究了一下500内部错误,我得到的错误是:

[message] Warning: file_put_contents(): Filename cannot be empty in /Applications/MAMP/htdocs/shop/vendor/assetic/src/Assetic/Filter/Yui/BaseCompressorFilter.php line 84

我查看了第84行的文件,那一行内容是:
$input = tempnam(sys_get_temp_dir(), 'assetic_yui_compressor');

经过一番挖掘和调试,我发现由sys_get_temp_dir()使用的我的临时目录权限不正确。

解决了这些权限问题后它就正常工作了。

我不确定你是否遇到了相同的错误,但如果是的话,希望这可以帮到你。

干杯

亚当


3

我遇到了同样的问题。

解决方法如下:

  • 打开“deps”文件。
  • 在“[AsseticBundle]”部分中删除“version=v1.0.0RC1”这一行。
  • 运行“bin/vendors update”命令以获取最新版本的AsseticBundle。

希望这可以帮到你。


2

感谢Jan Molak上面的帖子,我成功地在Windows Vista上运行了Symfony 2中的Assetic Less过滤器。

在我的deps文件中,我已经进行了更改:

[assetic]
    git=http://github.com/kriswallsmith/assetic.git
    version=v1.0.3

转化为

[assetic]
    git=http://github.com/kriswallsmith/assetic.git
    version=cc2e9adb744df0704a5357adc1cf9287c427420f

然后运行

php bin\vendors update

我希望这次更新不会引发其他问题。就目前而言,一切似乎按预期正常工作。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接