首页 > 解决方案 > App Engine 上的 Laravel 8:“请提供有效的缓存路径”

问题描述

我将 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 上部署应用程序没有问题。

标签: laravelgoogle-app-enginegoogle-cloud-platformlaravel-8laravel-livewire

解决方案


这是一个非常烦人的错误。它时不时地发生,我仍然没有找到解决办法。我确信 Cloud Build 中发生了一些奇怪的事情,我只是不知道是什么。任何人都有上述以外的任何想法,请分享。


编辑

我认为问题在于此处解释的编译视图路径

现在,设置VIEW_COMPILED_PATH/tmp是​​应用程序运行所必需的,但是在构建过程中会发生错误。在构建期间,编译的视图缓存路径不是从或通常值app.yaml 的位置读取,而是从读取。现在,在正常情况下这绝对没问题。最后一个难题是由于某种原因会忽略部署空目录或其中只有 .gitignore 的目录,因此不会部署,并且在构建期间会发生错误。config/view.php.envrealpath(storage_path('framework/views'))gcloud app deploystorage/framework/views

可能的修复:

  1. 在部署之前在 'storage/framework/views' 中添加一些随机文件(除了.gitignore),以确保该目录在构建期间可用。

  2. 将默认值更改为config/views构建期间存在的目录。

任何其他确保storage/framework/views不被忽略(在构建期间存在)的方法都应该这样做。


推荐阅读