Laravel: 运行 安装包时的命令行程序
Laravel: run a command line program when package is installed
我正在尝试创建一个 Laravel 5 包,让我可以操作图像,包括优化它们的文件大小。理想情况下,我想做如下事情:
Image::scale('myImage.png', 300, 300)->rotate(90)->optimize()->save('newImage.png');
对于 "optimize" 步骤,我希望使用 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 机器上,它能正常工作吗?)
我知道我可以通过调用 chdir($sourceDir); exec('make');
从 PHP 中的源代码进行编译,但是我不想 运行 这是第一次有人尝试使用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 命令,然后告诉开发人员在安装过程中 运行 您的命令。
我正在尝试创建一个 Laravel 5 包,让我可以操作图像,包括优化它们的文件大小。理想情况下,我想做如下事情:
Image::scale('myImage.png', 300, 300)->rotate(90)->optimize()->save('newImage.png');
对于 "optimize" 步骤,我希望使用 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 机器上,它能正常工作吗?)
我知道我可以通过调用 chdir($sourceDir); exec('make');
从 PHP 中的源代码进行编译,但是我不想 运行 这是第一次有人尝试使用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 命令,然后告诉开发人员在安装过程中 运行 您的命令。