Laravel 8 в App Engine: укажите действительный путь к кешу

Я обновил проект Laravel с версии 7 до версии 8. Когда я пытаюсь развернуть его на App Engine, он не сообщает, пожалуйста, укажите действительный путь к кешу:

Updating service [***]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build [***] status: FAILURE
Error type: UNKNOWN

[...]

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

In Compiler.php line 36:

  Please provide a valid cache path.

Часть моего composer.json:

"scripts": {
    "post-autoload-dump": [
        "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
        "@php artisan package:discover --ansi",
        "@php artisan vendor:publish --force --tag=livewire:assets --ansi"
    ],
    "post-create-project-cmd": [
        "@php artisan key:generate --ansi"
    ],
    "post-update-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postUpdate",
        "@php artisan ide-helper:generate",
        "@php artisan ide-helper:meta"
    ],
    "post-install-cmd": [
        "composer dump-autoload",
        "php artisan config:clear",
        "php artisan cache:clear",
        "php artisan view:clear",
        "php artisan cache:clear",
        "php artisan optimize:clear"
    ]

Фрагмент из app.yaml:

env_variables:
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
  APP_SERVICES_CACHE: /tmp/services.php
  APP_PACKAGES_CACHE: /tmp/packages.php
  APP_CONFIG_CACHE: /tmp/config.php
  APP_ROUTES_CACHE: /tmp/routes.php
  CACHE_DRIVER: database
  SESSION_DRIVER: database

У меня есть папка /storage/framework/views вместе с другими стандартными папками как в /storage, так и в bootstrap/cache.

Если я удалю эту строку из composer.json (в post-autoload-dump):

"@php artisan vendor:publish --force --tag=livewire:assets --ansi"

Я могу развернуть приложение, но оно не работает на страницах, использующих компоненты Livewire, со следующей ошибкой:

The /workspace/bootstrap/cache directory must be present and writable. (View: /workspace/resources/views/users/edit.blade.php)
ErrorException
in /workspace/vendor/livewire/livewire/src/LivewireComponentsFinder.php (line 58)
in /workspace/vendor/livewire/livewire/src/CompilerEngine.php -> handleViewException (line 41)
in /workspace/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php -> handleViewException (line 60)
in /workspace/vendor/livewire/livewire/src/LivewireViewCompilerEngine.php -> evaluatePath (line 36)
in /workspace/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php -> evaluatePath (line 61)
in /workspace/vendor/laravel/framework/src/Illuminate/View/View.php -> get (line 139)

Это происходит, несмотря на то, что я добавил в bootstrap/app.php следующую строку:

$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));

следуя руководству.

До обновления Laravel у меня не было проблем с развертыванием приложения на App Engine.


person Mateusz    schedule 05.11.2020    source источник


Ответы (3)


Решением было обновить зависимость Livewire.

До:

"livewire/livewire": "^1.1",

После:

"livewire/livewire": "^2.1",

Кажется, работает любая версия, начинающаяся с 2.0.

person Mateusz    schedule 06.11.2020

Это действительно досадная ошибка. Это случалось время от времени, и я до сих пор не нашел решения. Я уверен, что в Cloud Build происходит что-то странное, просто не знаю что. У кого-нибудь есть идеи, кроме упомянутых выше, пожалуйста, поделитесь.


Изменить

Я считаю, что проблема заключается в соблюдении пути просмотра, как объяснено здесь

Теперь установка VIEW_COMPILED_PATH на /tmp необходима для запуска приложения, НО ошибка возникает во время сборки. Во время сборки путь кэша скомпилированных представлений считывается не из app.yaml, а из config/view.php или, возможно, .env, где обычно значение равно realpath(storage_path('framework/views')). При нормальных обстоятельствах это абсолютно нормально. Последний фрагмент головоломки - gcloud app deploy, который по какой-то причине не будет развертывать пустые каталоги или каталоги, в которых есть только .gitignore, следовательно, storage/framework/views не будет развернут, и во время сборки произойдет ошибка.

Возможные исправления:

  1. Добавьте случайный файл (кроме .gitignore) в 'storage / framework / views' перед развертыванием, чтобы убедиться, что каталог доступен во время сборки.

  2. Измените значение по умолчанию в config/views на каталог, который присутствует во время сборки.

Подойдет любой другой способ гарантировать, что storage/framework/views не игнорируется (присутствует во время сборки).

person zjbarg    schedule 14.02.2021

Моим рабочим решением было отредактировать config/view.php:

   'compiled' => env(
        'VIEW_COMPILED_PATH',
        isset($_SERVER['GAE_SERVICE']) ?
            '/tmp'
            : realpath(storage_path('framework/views'))
    ),

Это гарантирует, что расположение по умолчанию для скомпилированных представлений, когда приложение запущено на компьютере GAE, находится в каталоге /tmp вместо storage/framework/views.

person Nurul Huda    schedule 17.04.2021
comment
Мне нравится ваше решение. - person zjbarg; 17.04.2021