我自己在尝试将我们的 SF2.2 项目迁移到 SF2.3 时遇到了这个问题,下面是 Assetic 的 CompassFilter 在 2.2 和 2.3 版本的 Assetic 包中执行的命令行的比较
SF 2.2.2 AsseticBundle 2.1.3
"C:\Ruby200\bin\ruby.exe" "C:\Ruby200\bin\compass" "编译" "C:\Users\Rick\AppData\Local\Temp" "--boring" "--images-dir " "D:/Projects/cw3sf2/app/../web/bundles/cwmain/images/" "--config" "C:\Users\Rick\AppData\Local\Temp\ass8DCC.tmp" "--sass -dir""""--css-dir""""C:/Users/Rick/AppData/Local/Temp/ass8DCD.tmp.scss"
SF 2.3 AsseticBundle 2.3.0
"C:\Ruby200\bin\ruby.exe" "C:\Ruby200\bin\compass" "编译" "C:\Users\Rick\AppData\Local\Temp" "--boring" "--images-dir " "D:/Projects/cw3sf2/app/../web/bundles/cwmain/images/" "--config" "C:\Users\Rick\AppData\Local\Temp\assD29B.tmp" "--sass -dir" "--css-dir" "C:/Users/Rick/AppData/Local/Temp/assD29C.tmp.scss"
您会注意到以前的 ProcessBuilder 通过使用 "" 为 --sass-dir 和 --css-dir 注入了空参数,而较新的 ProcessBuilder 没有。显然,这会导致 Compass 向您发送错误消息。
解决这个问题需要在 ProcessBuilder 中进行上游修复,或者需要 AsseticBundle 在 CompassFilter.php 行 316 上手动将 --css-dir 和 --sass-dir 设置为 $tempdir
$pb->add('--sass-dir')->add('')->add('--css-dir')->add('');
进入
$pb->add('--sass-dir')->add($tempDir)->add('--css-dir')->add($tempDir);
发生错误是因为在 Symfony 2.3 分支中更改了 ProcessBuilder,它以不同的方式转义 shell 参数,忽略空参数。从而导致生成的命令中缺少所需的“”。我已经向 CompassFilter 的创建者提出了这个问题,尽管它可能需要上游修复。