检查Capistrano任务中的目录是否存在失败

问题描述 投票:0回答:1

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

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

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

  # 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'

所以,如评论所述,is_directoryis_symbolic_linkis_new_directory_exist都返回false,但是当我在部署服务器上使用Rails控制台进行相同的检查(即File.directory?("#{Rails.root}/public")File.directory?("/var/www/myapp/current/public"))时,我得到true并且我能够看到公共目录!

为了避免这个问题,我还尝试使用current_path而不是release_path,但仍然使用相同的结果。

我有两个问题:

  1. 为什么is_directoryis_new_directory_exist在任务运行时始终是false
  2. 如果有更好的方法在不同的Hdd上使用公共目录,请咨询。

欢迎所有建议

ruby-on-rails capistrano
1个回答
1
投票

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

例如:

  • File.directory?
  • File.symlink?

这些始终在本地文件系统上进行评估。 Capistrano从不在远程服务器上运行Ruby代码。这些方法总是为您返回false,因为他们试图查找例如"#{release_path}/public"在您的本地计算机上,当然不存在。

要在服务器上运行代码,可用的工具是Capistrano的testexecute方法。这些接收通过SSH远程执行的命令字符串。

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

is_directory = test("[ -d #{release_path}/public ]")

同样,要测试路径是否为符号链接:

is_symbolic_link = test("[ -h #{release_path}/public ]")
© www.soinside.com 2019 - 2024. All rights reserved.