Процесс не получает канал от proc_open. lessc - язык динамических стилей
Вот источник программного обеспечения LessC, я думаю, что это будет полезно:
https://github.com/cloudhead/less.js/blob/master/bin/lessc
ЭТА ПРОБЛЕМА
Я использую lessc в оболочке просто:
lessc file.less
и я получаю вывод файла CSS.
Я пытался сделать это по php с proc_open. Но когда я передаю входной файл в proc, lessc не получает его. У меня ошибка (из трубы 1):
"lessc: no input files"
что эквивалентно в оболочке (параметр не передан):
lessc
lessc ''
Мой код:
$descriptorspec = array(
0 => array("file", 'path/to/file/foo.less', "r"),
1 => array("pipe", "w"),
2 => array("file", '/tmp/lessCompiler-errors', "a")
);
$process = proc_open('lessc', $descriptorspec, $pipes);
if (is_resource($process)) {
$contents = stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
Кстати. Я пытаюсь избежать использования функции exec().
Я буду благодарен за любую помощь. Marcin
1 ответ
Сегодня я столкнулся с той же проблемой, но не уверен, что решение было верным, когда вы опубликовали вопрос, но теперь вы можете передать '-' как источник ввода в lessc, чтобы он читался из stdin. Так что вам нужно изменить только одну строку:
$process = proc_open('lessc -', $descriptorspec, $pipes);
Поскольку мне потребовалось некоторое время, чтобы выяснить все детали, вот мой фрагмент кода:
/* run lessc */
$descriptors = array(
0 => array( 'pipe', 'r' ),
1 => array( 'pipe', 'w' ),
2 => array( 'pipe', 'w' ));
$process = proc_open( 'lessc --no-color -x -', $descriptors, $pipes,
'/web/less', array( 'PATH' => '/usr/local/bin/' ) );
if( !is_resource( $process ) ) {
$this->errorMessage( 'Unable to start lessc' );
exit();
}
/* write generated content */
fwrite( $pipes[0], 'some dynamically generated less code' );
fclose( $pipes[0] );
/* read compiled css */
$css = stream_get_contents( $pipes[1] );
fclose( $pipes[1] );
/* check for errors */
if( $stderr = stream_get_contents( $pipes[2] ) ) {
$this->errorMessage( "lessc error: {$stderr}" );
exit();
}
fclose( $pipes[2] );
proc_close( $process );
/* write back */
$this->write( $css );
- Я должен был установить
PATH
на Debian Wheezy, потому что Lessc продолжал жаловаться:/usr/bin/env: node: No such file or directory
см. https://github.com/joyent/node/issues/3911 --no-color
подавляет escape-коды в сообщениях об ошибках-x
сжимает CSS