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_dirs, ["storage"] # 可写文件夹 set :laravel_writable_dirs, [ "bootstrap/cache", "storage", "storage/app", "storage/app/public", "storage/framework", "storage/framework/cache", "storage/framework/sessions", "storage/framework/views", "storage/logs" ] set :laravel_server_user, 'www-data' 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, "#{release_path}/.env" end end desc "检查软链目录" task "check: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 :writable 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 set :file_permissions_paths, fetch(:file_permissions_paths, []) .push(*laravel_writable_dirs) .uniq set :file_permissions_users, fetch(:file_permissions_users, []) .push(fetch(:laravel_server_user)) .uniq 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:check:linked_dirs" after "deploy:updated", "laravel:upload_dotenv_file" after "deploy:updated", "laravel:writable" after 'deploy:updated', 'deploy:set_permissions:acl' 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