【问题标题】:Laravel: run a command line program when package is installedLaravel:安装包时运行命令行程序
【发布时间】:2015-02-26 23:07:10
【问题描述】:

我正在尝试创建一个 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 机器,将它只是工作?)

我知道我可以通过调用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');
        }
    }
}

如何在安装包后让这段代码运行一次?

【问题讨论】:

    标签: php laravel compilation package laravel-5


    【解决方案1】:

    目前没有办法做到这一点。

    也许只是在你的包中构建一个 artisan 命令,然后告诉开发人员在安装过程中运行你的命令。

    文档:http://laravel.com/docs/5.0/commands

    【讨论】:

    • 这听起来很适合我的要求(构建一个工匠命令)——我现在才知道该怎么做。我会尝试对其进行一些研究,或者如果可以的话,请使用如何创建工匠命令的示例来更新您的答案。如果可行,我会接受,否则我会评论新问题
    • 本教程有点过时了,但可能会有所帮助 - code.tutsplus.com/tutorials/…
    • 抱歉这么久才接受。度过了忙碌的一周。
    • 谢谢。这个问题在 laravel 中也让我很恼火。我将尝试在 laravel 中构建一个拉取请求以允许处理此问题。所以希望在某个时候可以解决这个问题。
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多