我有一个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帖子中找到任何关于这些行为差异的提及,而且我似乎仍然磕磕绊绊地看着它们现在变得有些沮丧。这是一个众所周知的事情,其他应用程序如何解释这个问题?
答案 0 :(得分:2)
这实际上都是因为sym link =(。
因此web_apps实际上是指向我们服务器上不存在的共享目录的sym链接。在我的开发机器上它确实存在。由于“文件存在”错误,这并不是非常明显。
我们的部署脚本正在构建sym链接,而不首先检查该目录是否确实存在。呸。
答案 1 :(得分:0)
这看起来是一个权限问题,如果目录不存在则会创建目录,否则就不会出现任何错误。
查看'/path/to/my/project/public/web_apps/'