namespace :load do task :defaults do set :laravel_roles, :all # 是否在部署时上传 .env 文件 set :laravel_upload_dotenv_file_on_deploy, true # 上传时的本地 .env 文件 set :laravel_dotenv_file, ".env.#{fetch(:stage)}" # 软链文件 set :laravel_linked_files, [".env"] # 软链文件夹 set :laravel_linked_dirs, ["storage"] # 可写文件夹 set :laravel_writable_dirs, [ "storage", "storage/app", "storage/app/public", "storage/framework", "storage/framework/cache", "storage/framework/sessions", "storage/framework/views", "storage/logs", ] end end namespace :laravel do desc "上传 .env 文件到共享目录" task :upload_dotenv_file do next unless fetch(:laravel_upload_dotenv_file_on_deploy) dotenv_file = fetch(:laravel_dotenv_file) run_locally do execute :touch, dotenv_file end on release_roles(fetch(:laravel_roles)) do upload! dotenv_file, "#{shared_path}/.env" end end desc "准备软链文件" task :resolve_linked_files do on release_roles(fetch(:laravel_roles)) do laravel_linked_files = fetch(:laravel_linked_files) next unless laravel_linked_files # 创建用于软链的文件 within shared_path do execute :touch, laravel_linked_files.join(" ") end set :linked_files, fetch(:linked_files, []).push(*laravel_linked_files) end end desc "准备软链目录" task :resolve_linked_dirs do laravel_linked_dirs = fetch(:laravel_linked_dirs) if fetch(:laravel_linked_dirs) set :linked_dirs, fetch(:linked_dirs, []).push(*laravel_linked_dirs) end end desc "准备可写文件" task :resolve_writable_dirs do on release_roles(fetch(:laravel_roles)) do laravel_writable_dirs = fetch(:laravel_writable_dirs) next unless laravel_writable_dirs within release_path do execute :mkdir, "-p", laravel_writable_dirs.join(" ") end end end desc "执行 artisan" task :artisan, :command do |t, args| args.with_defaults(:command => :list) on release_roles(fetch(:laravel_roles)) do within release_path do execute :php, :artisan, args[:command], *args.extras end end # 允许多次调用 laravel:artisan 任务 # https://github.com/capistrano/capistrano/issues/1686 Rake::Task["laravel:artisan"].reenable end desc "执行 artisan config:cache" task "artisan:config:cache" do invoke "laravel:artisan", "config:cache" end desc "执行 artisan db:seed" task "artisan:db:seed" do invoke "laravel:artisan", "db:seed", "--force" end desc "执行 artisan migrate" task "artisan:migrate" do invoke "laravel:artisan", :migrate, "--force" end desc "执行 artisan migrate:fresh" task "artisan:migrate:fresh" do invoke "laravel:artisan", "migrate:fresh", "--force" end desc "执行 artisan migrate:rollback" task "artisan:migrate:rollback" do invoke "laravel:artisan", "migrate:rollback", "--force" end desc "执行 artisan optimize" task "artisan:optimize" do invoke "laravel:artisan", :optimize end desc "执行 artisan optimize:clear" task "artisan:optimize:clear" do invoke "laravel:artisan", "optimize:clear" end desc "执行 artisan queue:restart" task "artisan:queue:restart" do invoke "laravel:artisan", "queue:restart" end desc "执行 artisan storage:link" task "artisan:storage:link" do invoke "laravel:artisan", "storage:link" end desc "执行 artisan route:cache" task "artisan:route:cache" do invoke "laravel:artisan", "route:cache" end desc "执行 artisan view:cache" task "artisan:view:cache" do invoke "laravel:artisan", "view:cache" end desc "执行 artisan view:clear" task "artisan:view:clear" do invoke "laravel:artisan", "view:clear" end end namespace :deploy do task :vendors do invoke "composer:install" end before "deploy:starting", "laravel:resolve_linked_dirs" after "deploy:check:directories", "laravel:upload_dotenv_file" after "deploy:check:directories", "laravel:resolve_linked_files" after "deploy:updated", "laravel:resolve_writable_dirs" after "deploy:updated", "deploy:vendors" after "deploy:vendors", "laravel:artisan:config:cache" after "deploy:vendors", "laravel:artisan:route:cache" after "deploy:vendors", "laravel:artisan:view:cache" after "deploy:vendors", "laravel:artisan:storage:link" after "deploy:vendors", "laravel:artisan:migrate" end