Я пытаюсь создать пакет 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');
}
}
}
Как я могу заставить этот код запускаться один раз, когда пакет установлен?
Сейчас нет способа сделать это.
Возможно, просто создайте команду artisan в вашем пакете и просто скажите разработчикам, чтобы она запускалась в процессе установки.
Документация : http://laravel.com/docs/5.0/commands
Других решений пока нет …