App Engine 上的 Laravel 8:“请提供有效的缓存路径”

Posted

技术标签:

【中文标题】App Engine 上的 Laravel 8:“请提供有效的缓存路径”【英文标题】:Laravel 8 on App Engine: "Please provide a valid cache path" 【发布时间】:2021-02-18 16:36:16 【问题描述】:

我将一个 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 的 sn-p:

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 文件夹以及/storagebootstrap/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'));

关注guide。

在升级 Laravel 之前,我在 App Engine 上部署应用没有问题。

【问题讨论】:

【参考方案1】:

解决方案是更新 Livewire 依赖项。

之前:

"livewire/livewire": "^1.1",

之后:

"livewire/livewire": "^2.1",

从 2.0 开始的任何版本似乎都可以工作。

【讨论】:

【参考方案2】:

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


编辑

我认为问题在于 explained here 的编译视图路径

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

可能的修复:

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

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

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

【讨论】:

第 1 点是我的解决方案!你救了我的一天!谢谢!【参考方案3】:

我的工作解决方案是编辑config/view.php:

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

这将确保应用在 GAE 机器上运行时编译视图的默认位置位于 /tmp 目录而不是 storage/framework/views

【讨论】:

我喜欢你的解决方案。

以上是关于App Engine 上的 Laravel 8:“请提供有效的缓存路径”的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 302状态仅限生产中的任务队列

CSS 不会在 XAMPP 上的 Laravel 8 + Jetstream 中加载

sh 访问Google App Engine上的docker实例

Google-App-Engine 上的 Grails - 它死了吗? [关闭]

Google App Engine 上的 web.py

从 app-Engine 上的 java 类向 Android 客户端发送 PUSH 通知