Процесс не получает канал от 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
Другие вопросы по тегам