使用 Amazon Elastic Beanstalk 部署 Laravel 工作台包

Posted

技术标签:

【中文标题】使用 Amazon Elastic Beanstalk 部署 Laravel 工作台包【英文标题】:Deploying Laravel workbench package with Amazon Elastic Beanstalk 【发布时间】:2015-02-21 23:27:51 【问题描述】:

我有一个 Laravel Web 应用程序,其中包含我在工作台中开发的包。该软件包是应用程序 git 存储库的一部分。该应用程序托管在 Elastic Beanstalk 环境中。

当我使用 eb deploy 部署应用程序时,我在 eb-activity.log(来自 eb logs)中收到以下错误:

...
(output of composer package fetches)
...
Generating autoload files
php Fatal error:  Class 'Me\MyPackage\MyPackageServiceProvider' not found in /var/app/ondeck/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 157
"error":"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'Me\\MyPackage\\MyPackageServiceProvider' not found","file":"\/var\/app\/ondeck\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/ProviderRepository.php","line":157Script php artisan clear-compiled handling the post-install-cmd event returned with an error



  [RuntimeException]                                                                                                                                                                                   
  Error Output: PHP Fatal error:  Class 'Me\MyPackage\MyPackageServiceProvider' not found in /var/app/ondeck/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 157

我在我的开发机器上看到了类似的错误,我通过在工作台包目录中运行composer install 解决了,如Laravel 4 workbench class not found 中所述。问题是在 EB 在应用程序供应商目录上运行 composer 之前,我无法在我的包上运行 composer。配置文件的 commands 块太早了——文件还没有在服务器上——而 container_commands 块太晚了,因为它发生在 EB 运行 composer 之后。

如何先运行我的包编写器?

【问题讨论】:

【参考方案1】:

我想我已经解决了这个问题,虽然感觉有点笨拙。如果应用的根目录中有供应商目录,EB 不会自动运行 composer,所以...

    编辑 /.gitignore 并删除显示 /vendor 的行

    使用以下内容创建/vendor/.gitignore并将其添加到git。这会将带有单个 .gitignore 文件的 vendor 目录添加到 git,但忽略供应商包子目录的其余部分(将在部署期间由 composer 填写)。

    # ignore everything except .gitignore
    !.gitignore
    *
    

    您可能已经在/.ebextensions 中有一个作曲家部署配置文件,但以防万一这是我的全部内容(称为01composersettings.config),因为其他命令也进行了一些调查。针对我的问题的两个命令是01installWorkbenchPackages,它在02installPackages 之前运行。

    commands:
        01updateComposer:
            command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update
    
    option_settings:
      - namespace: aws:elasticbeanstalk:application:environment
        option_name: COMPOSER_HOME
        value: /root
    
    container_commands:
        01installWorkbenchPackages:
            command: "/usr/bin/composer.phar install -d /var/app/ondeck/workbench/me/my-package"
        02installPackages:
            command: "/usr/bin/composer.phar install"
        03optimize:
            command: "/usr/bin/composer.phar dump-autoload --optimize"
        04storagePermissions:
            command: "chmod -fR 755 /var/app/ondeck/app/storage"
    

    确保 /.ebextensions/01composersettings.config 也是 git 索引的一部分(git ls-tree -r master --name-only 可以方便地检查所有文件是否都在那里,包括 vendor 目录中只有 .gitignore

    运行eb deploy

【讨论】:

以上是关于使用 Amazon Elastic Beanstalk 部署 Laravel 工作台包的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Elastic Mapreduce 之上使用 Hive 来处理 Amazon Simple DB 中的数据?

使用 Amazon Elastic Beanstalk 部署 symfony2.1 应用程序

使用 Elastic Beanstalk 和 Amazon RDS 的连接池

如何使用 Amazon linux 2 在 Elastic beanstalk 中使用多容器 docker?

使用 RabbitMQ 的 Amazon Elastic Beanstalk 上的芹菜超时异常

Amazon Elastic Beanstalk 腻子