我有一个脚本,该脚本使用Dir.getwd
多次获取当前工作目录。然后用它来做事。这始终可为99.9%的用户提供服务,但对于某些用户,在 some 情况下它返回意外值。这会导致异常。
什么会导致工作目录更改?
(在该代码中根本没有调用{Dir.chdir
。)
背景故事:
我为以红宝石编写的开源mobile automation command line tool fastlane做出了贡献。
我们有一个问题,少数用户报告by a File.join
抛出了no implicit conversion of nil into String (TypeError)
个错误,其中a method self.path
in the same file提供了一个参数。
self.path
试图通过使用File.directory?
和File.exist?
找出某些配置的路径。通常,方法中的第一行value ||= "./#{FOLDER_NAME}/" if File.directory?("./#{FOLDER_NAME}/")
应该“触发”并设置值。这就是我们99.9%的用户使用它的方式。
对于其余的少数方法,使用此方法前1或2次有效,然后变得不稳定并返回意外值或根本不返回-由于该方法没有后备功能,因此可以返回{{1} }如果6个条件都不满足。但是:这些条件是检查未被触摸的文件,并且在第一次调用时,其中一个条件确实是正确的(应该如此)!
(不幸的是,我根本无法在计算机上重现该问题。)
通过puts
debugging via a branch and a discussion in a GitHub issue(branch is here),我们可以将其固定到工作目录,并且以意外的方式更改-多次。它从执行脚本的nil
到配置所在的project_directory
,或者相反。
这本身是可以的,因为正是针对这两种情况制作了该方法。但是值似乎在代码的每一行中都改变了! (这里有一个comment on the GitHub issue,显示了project_directory/fastlane
突然返回其他值)因此,没有条件可以满足,我们得到了Dir.getwd
。
有什么想法会导致这种情况吗?