我有一个 Rails 应用程序,其中包含一段简单的代码,用于在目录不存在时创建一个目录。
FileUtils.mkpath(self.webapp_dir) unless File.exists?(self.webapp_dir)
这在我的开发工作站 (OS X 10.9) 上的表现符合预期,但在部署到其他环境 (Red Hat 4.4.6-3) 时出现错误。
在我的 Rails 控制台中,我运行了以下命令:
FileUtils.mkpath('/path/to/my/project/public/web_apps/1')
请注意,在第一次运行时,“public/web_apps/”存在,但“1”不存在。这成功了。我可以在整个路径已经存在的情况下再次运行它,并且每次都成功且没有错误。
现在,我尝试在生产环境的 Rails 控制台中运行相同的代码。同样,“public/web_apps/”已经存在,但“1”不存在。在这种情况下,我得到一个错误。
FileUtils.mkpath('/path/to/my/project/public/web_apps/1')
--> Errno::EEXIST: File exists - /path/to/my/project/public/web_apps
有谁知道为什么两台机器之间的行为不同,我能做些什么?我想我可以遍历并检查路径中的每个目录,只有当它不存在时才创建它,但这是我已经期望 mkpath 做的。
我发现其他与文件系统交互的函数之间存在其他差异(例如 File.size 如何在文件写入后不会立即报告正确的值,除非您先打开它)。不过,我还没有在任何文档或其他 SO 帖子中找到任何关于这些行为差异的提及,而且我似乎一直在绊倒它们,这现在有点令人沮丧。这是已知的事情吗?其他应用如何解释这一点?
最佳答案
这实际上都是由于符号链接(symbolic link)损坏 =(。
所以 web_apps 实际上是指向我们服务器上不存在的共享目录的符号链接(symbolic link)。在我的开发机器上它确实存在。由于“文件存在”错误,这并不是很明显。
我们的部署脚本在没有首先检查该目录是否确实存在的情况下构建符号链接(symbolic link)。呸。
关于ruby-on-rails - Ruby FileUtils.mkpath 在不同环境下的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104083/