Ruby on rails 检查Capistrano任务中是否存在目录失败

Ruby on rails 检查Capistrano任务中是否存在目录失败,ruby-on-rails,capistrano,Ruby On Rails,Capistrano,我已将新硬盘添加到服务器,需要使用它保存所有用户信息,因此我需要将public目录移动到新硬盘 我不知道在我的例子中什么是最好的方法,但我决定将公共目录更改为指向新HDD路径的符号链接 基于此,我创建了以下capistrano任务以在部署后运行: # I'm using capistrano 3.1 namespace :public_to_symbolic do desc 'Change public directory to symbolic link pointing to

我已将新硬盘添加到服务器,需要使用它保存所有用户信息,因此我需要将public目录移动到新硬盘

我不知道在我的例子中什么是最好的方法,但我决定将公共目录更改为指向新HDD路径的符号链接

基于此,我创建了以下
capistrano任务
以在部署后运行:

  # I'm using capistrano 3.1
  namespace :public_to_symbolic do
    desc 'Change public directory to symbolic link pointing to other Hdd'
    task :change do
      on roles(:app) do
        is_directory = File.directory?("#{release_path}/public")
        is_symbolic_link = File.symlink?("#{release_path}/public")
        is_new_directory_exist = File.directory?('/mnt/newhdd/public')
        can_change = is_directory && !is_symbolic_link && is_new_directory_exist
        puts "is_directory : #{is_directory}" # prints false
        puts "is_symbolic_link : #{is_symbolic_link}" # prints false
        puts "is_new_directory_exist : #{is_new_directory_exist}" # prints false
        puts "can_change: #{can_change}" # prints false
        puts "release_path: #{release_path}" # prints /var/www/myapp/releases/20180305112922
        if can_change
          puts 'Changing public directory to symbolic link'
          execute "mv #{release_path}/public #{release_path}/public_linked"
          execute "ln -s /mnt/newhdd/public #{release_path}/public"
          execute "rm -rf #{release_path}/public_linked"
        end
      end
    end
  end

  after 'deploy', 'public_to_symbolic:change'
因此,正如所评论的,
是目录
是符号链接
是新目录
都返回
错误
,但当我做同样的检查时(即
文件目录(“{Rails.root}/public”)
文件目录(“/var/www/myapp/current/public”)
)使用部署服务器上的Rails控制台,我得到了
true
,并且我能够看到公共目录

为了避免这个问题,我还尝试使用
current\u path
而不是
release\u path
,但结果仍然相同

我有两个问题:

  • 为什么在任务运行时,
    is\u directory
    is\u new\u directory\u exist
    总是
    false
  • 如果有更好的方法在不同的硬盘上使用公共目录,请给出建议

  • 欢迎所有建议

    您在本地计算机上运行的Capistrano任务中使用的所有Ruby方法

    例如:

    is_directory = test("[ -d #{release_path}/public ]")
    
    • File.directory?
    • File.symlink?
    它们总是在本地文件系统上进行评估。Capistrano从不在远程服务器上运行Ruby代码。这些方法总是为您返回
    false
    ,因为它们试图在您的本地计算机上查找,例如
    “{release\u path}/public”
    ,而本地计算机当然不存在

    要在服务器上运行代码,您可以使用Capistrano的
    test
    execute
    方法。它们接收通过SSH远程执行的命令字符串

    如果要测试远程路径是否为目录,则不能使用Ruby;您必须使用可以在远程shell中运行的东西。下面是一种测试路径是否为目录的方法,例如:

    is_directory = test("[ -d #{release_path}/public ]")
    
    同样,要测试路径是否为符号链接,请执行以下操作:

    is_symbolic_link = test("[ -h #{release_path}/public ]")