Laravel 5.5使用Deployer部署时storage:link执行失败原因咨询
我来帮你解决这个Deployer部署Laravel 5.5时遇到的storage软链接问题,这个坑我之前也踩过,咱们一步步来搞定它:
问题根源分析
你遇到的错误本质是:本地开发环境创建的public/storage软链接(指向你Mac上的本地路径)被意外同步到了服务器的部署版本中,服务器上根本找不到这个本地路径,导致执行artisan storage:link时,要么因为目标路径已存在(损坏的软链接)无法创建,要么找不到要链接的目标目录,直接抛出symlink(): No such file or directory错误。
分步解决方案
1. 先清理本地环境,避免坏软链接被重复部署
- 先删除本地项目里的损坏软链接:
rm public/storage - 打开你的
.gitignore文件,添加一行public/storage,把这个软链接排除在版本控制之外,防止以后误提交到Git仓库。
2. 修改Deployer脚本,强制清理服务器上的旧软链接
在你的deploy.php部署脚本里,自定义一个storage:link任务,确保在创建新软链接前,先删除服务器上已存在的public/storage(不管它是文件、目录还是损坏的软链接):
task('storage:link', function () { // 先强制删除已存在的public/storage,避免冲突 run('rm -rf {{release_path}}/public/storage'); // 执行Laravel的storage:link命令创建新软链接 run('{{bin/php}} {{release_path}}/artisan storage:link'); }); // 把这个任务挂到Deployer的部署流程中,比如在deploy:vendors之后执行 after('deploy:vendors', 'storage:link');
3. 配置共享目录,让存储文件跨版本共享
Laravel的storage/app/public目录通常存储用户上传的文件,这些文件不应该随每次部署更新而被覆盖,所以在deploy.php里配置共享目录:
set('shared_dirs', [ 'storage/app', 'storage/framework/cache', 'storage/framework/sessions', 'storage/framework/views', 'storage/logs', ]);
这样Deployer会自动把storage/app目录设置为共享目录,每次部署的新版本都会链接到这个共享目录,确保上传的文件不会丢失,同时storage:link创建的软链接也会指向这个共享的storage/app/public。
4. 重新部署验证
执行Deployer的部署命令:
dep deploy production
这次应该就能顺利创建软链接,不会再出现之前的错误了。
内容的提问来源于stack exchange,提问作者Ilya Vo
相关产品推荐
相关产品推荐

