我已将新硬盘添加到服务器并需要使用它来保存所有用户信息,因此我需要将公共目录移至新硬盘。
我不知道在我的情况下最好的方法是什么,但我决定将公共目录更改为指向新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_directory
,is_symbolic_link
和is_new_directory_exist
都返回false
,但是当我进行相同的检查时(即File.directory?("#{Rails.root}/public")
或File.directory?("/var/www/myapp/current/public")
)在部署服务器上使用Rails控制台,我得到true
,我能够看到公共目录!
为了避免此问题,我还尝试使用current_path
代替release_path
,但结果仍然相同。
我有两个问题:
is_directory
和is_new_directory_exist
始终为false
?欢迎所有建议
答案 0 :(得分:1)
您在Capistrano任务中使用的所有Ruby方法都在本地计算机上运行。
例如:
File.directory?
File.symlink?
始终在本地文件系统上评估这些内容。 Capistrano从不在远程服务器上运行Ruby代码。这些方法始终会为您返回false
,因为他们正在尝试查找例如您本地计算机上的"#{release_path}/public"
,当然不存在。
要在服务器上运行代码,您可以使用的工具是Capistrano的test
和execute
方法。这些接收通过SSH远程执行的命令字符串。
如果要测试远程路径是否是目录,则不能使用Ruby;你必须使用可以在远程shell中运行的东西。以下是测试路径是否为目录的一种方法,例如:
is_directory = test("[ -d #{release_path}/public ]")
同样,要测试路径是否为符号链接:
is_symbolic_link = test("[ -h #{release_path}/public ]")