Laravel: запустить программу командной строки, когда пакет установлен

Я пытаюсь создать пакет Laravel 5, который позволяет мне манипулировать изображениями, в том числе оптимизировать их размер. В идеале я хотел бы сделать что-то вроде следующего:

Image::scale('myImage.png', 300, 300)->rotate(90)->optimize()->save('newImage.png');

Для шага «оптимизировать» я хочу использовать pngquant

Пока установлен pngquant, это не так сложно — проанализируйте ввод, чтобы убедиться, что он безопасен, затем передайте его exec() команда.

Задача установка pngquant. Мое текущее решение включает в себя включение скомпилированных программ в состав пакета, например:

/vendor
/stevendesu
/image-manipulator
/bin
/windows
pngquant.exe
/mac
pngquant
/linux
Uhh.... /src ?
/src
ImageManipualtorServiceProvider.php

Для Windows и Mac это работает — я определяю операционную систему и вызываю соответствующий двоичный файл:

if( substr(PHP_OS, 0, 3) == 'WIN' )
exec( dirname(dirname(__FILE__)) . '/bin/windows/pngquant.exe ' . $parameters );
else if( substr(PHP_OS, 0, 3) == 'MAC' )
exec( dirname(dirname(__FILE__)) . '/bin/mac/pngquant' . $parameters );
else
exec( '.... I need to compile pngquant!!!' );

Для Linux нет ни одного двоичного файла, который я могу включить — он должен быть скомпилирован из исходного кода … По крайней мере, насколько я знаю (если я скомпилирую его на машине Linux и скопирую на другую машину Linux, он просто будет работать ?)

Я знаю, что я могу скомпилировать из исходного кода в PHP, просто позвонив chdir($sourceDir); exec('make');Тем не менее, я не хочу запускать это в первый раз, когда кто-то пытается использовать pngquant и обнаруживает, что двоичный файл отсутствует. Я предпочел бы скомпилировать из исходного кода при первой установке пакета.

Установив пакет раньше и сделав свой, я понял, что php artisan vendor:publish Команда была бы почти идеальной для этого. Он копирует файлы конфигурации и файлы миграции и запускается один раз — когда пакет установлен.

Однако я не знаю, как подключить эту команду для запуска exec('make');

Я попробовал следующее в своем поставщике услуг, и это не сработало:

public function boot()
{
// Publish config file
$this->publishes([
__DIR__.'/../config/image-manipulator.php' => config_path('image-manipulator.php'),
]);

// Detect operating system... If Linux, we'll need to compile our
// dependencies from source
$substring = strtolower( substr( PHP_OS, 0, 3 ) );
if( $substr != 'win' && $substr != 'mac' ) {
// Compile pngquant
if(!file_exists(dirname(dirname(__FILE__) . '/bin/linux/pngquant/pngquant'))) {
$returnVal = exec('which gcc');
if(empty($returnVal)) {
// Error - gcc not installed
}

$returnVal = exec('ldconfig -p | grep "libpng"');
if(empty($returnVal)) {
// Error - libpng not installed
}

$returnVal = exec('ldconfig -p | grep "libz"');
if(empty($returnVal)) {
// Error - zlib not installed
}

$returnVal = exec('cd ' . dirname(dirname(__FILE__)) . '/bin/linux/pngquant/src && make');
}
}
}

Как я могу заставить этот код запускаться один раз, когда пакет установлен?

0

Решение

Сейчас нет способа сделать это.

Возможно, просто создайте команду artisan в вашем пакете и просто скажите разработчикам, чтобы она запускалась в процессе установки.

Документация : http://laravel.com/docs/5.0/commands

1

Другие решения

Других решений пока нет …