laravel - 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 上部署应用程序没有问题。
解决方案
这是一个非常烦人的错误。它时不时地发生,我仍然没有找到解决办法。我确信 Cloud Build 中发生了一些奇怪的事情,我只是不知道是什么。任何人都有上述以外的任何想法,请分享。
编辑
我认为问题在于此处解释的编译视图路径
现在,设置VIEW_COMPILED_PATH
为/tmp
是应用程序运行所必需的,但是在构建过程中会发生错误。在构建期间,编译的视图缓存路径不是从或通常值app.yaml
的位置读取,而是从读取。现在,在正常情况下这绝对没问题。最后一个难题是由于某种原因会忽略部署空目录或其中只有 .gitignore 的目录,因此不会部署,并且在构建期间会发生错误。config/view.php
.env
realpath(storage_path('framework/views'))
gcloud app deploy
storage/framework/views
可能的修复:
在部署之前在 'storage/framework/views' 中添加一些随机文件(除了
.gitignore
),以确保该目录在构建期间可用。将默认值更改为
config/views
构建期间存在的目录。
任何其他确保storage/framework/views
不被忽略(在构建期间存在)的方法都应该这样做。
推荐阅读
- excel - 冻结 Excel SQL 查询中的列
- bash - 在 coreOS (cos) 中找不到 apt-get 命令
- google-cloud-platform - XGboost Google-AI-Model 期望浮点值而不是使用分类值并转换它们
- html - 使用 Selenium 通过 CSS 查找元素
- reactjs - Material-UI - 支持 babel-plugin-react-css-modules 和 rtl app
- python - 与 Ray 并行并通过超时获取结果
- r - 在 R 循环中写入文件
- ios - Swift - UITextView 不显示文本
- c# - 如何访问 Visual Studio 项目中的其他 SDK
- sql - 带有子查询的 Postgres XMLCONCAT()