deployment - Capistrano 3 : Relative symlink instead of absolute for current, linked_dirs 和 linked_files

标签 deployment capistrano3

部署时我需要使用相对符号链接(symbolic link)而不是绝对符号链接(symbolic link)。

我认为需要覆盖的树任务是。

Rake::Task["deploy:symlink:linked_dirs"]
Rake::Task["deploy:symlink:linked_files"]
Rake::Task["deploy:symlink:release"] ​ ​

我想要的是一些 DSL,我可以将其放入我的 deploy.rb 中,这样当我部署时创建的链接都是相对的。

最佳答案

您可以在deploy.rb中使用它来覆盖默认行为

## Use relative path instead of absolute

Rake::Task["deploy:symlink:linked_dirs"].clear
Rake::Task["deploy:symlink:linked_files"].clear
Rake::Task["deploy:symlink:release"].clear

namespace :deploy do
namespace :symlink do
    desc 'Symlink release to current'
    task :release do
      on release_roles :all do
        tmp_current_path = release_path.parent.join(current_path.basename)
        execute :ln, '-s', release_path.relative_path_from(current_path.dirname), tmp_current_path
        execute :mv, tmp_current_path, current_path.parent
      end
    end

    desc 'Symlink files and directories from shared to release'
    task :shared do
      invoke 'deploy:symlink:linked_files'
      invoke 'deploy:symlink:linked_dirs'
    end

    desc 'Symlink linked directories'
    task :linked_dirs do
      next unless any? :linked_dirs
      on release_roles :all do
        execute :mkdir, '-p', linked_dir_parents(release_path)

        fetch(:linked_dirs).each do |dir|
          target = release_path.join(dir)
          source = shared_path.join(dir)
          unless test "[ -L #{target} ]"
            if test "[ -d #{target} ]"
              execute :rm, '-rf', target
            end
            execute :ln, '-s', source.relative_path_from(target.dirname), target
          end
        end
      end
    end

    desc 'Symlink linked files'
    task :linked_files do
      next unless any? :linked_files
      on release_roles :all do
        execute :mkdir, '-p', linked_file_dirs(release_path)

        fetch(:linked_files).each do |file|
          target = release_path.join(file)
          source = shared_path.join(file)
          unless test "[ -L #{target} ]"
            if test "[ -f #{target} ]"
              execute :rm, target
            end
            execute :ln, '-s', source.relative_path_from(target.dirname), target
          end
        end
      end
    end
  end
end

关于deployment - Capistrano 3 : Relative symlink instead of absolute for current, linked_dirs 和 linked_files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590392/

相关文章:

c++ - 在自动化服务部署时设置用户服务运行的最佳实践是什么?

java - 有没有等同于 Java Jar 或 .NET DLL 的 JavaScript?

ruby-on-rails - Capistrano + Whenever gems - bin/rails : Permission denied

ruby-on-rails-3 - 如何在 Assets :precompile 之后刷新 Rails/Sprockets 以了解生产服务器上的新 list

deployment - Amber Smalltalk - 创建单个 .js 文件进行部署

php - 在 1&1 服务器上部署 Laravel

ruby - 卡皮斯特拉诺 3 : use server custom variable in task

ruby-on-rails - Capistrano 3 在目录中执行

ruby-on-rails - Capistrano 冷启动 - git :check 的问题

google-app-engine - 部署到 Google App Engine 时出现 CLI 400 错误