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
文件夹以及/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'));
关注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实例