Ruby 展开路径(";../../Gemfile";,&uuuuuu文件)这是如何工作的?档案在哪里?
Ruby 展开路径(";../../Gemfile";,&uuuuuu文件)这是如何工作的?档案在哪里?,ruby,Ruby,ENV[“BUNDLE\u GEMFILE”]=File.expand\u path(“../../GEMFILE”,\uuuuuuu File) 我正试图从某个目录访问一个.rb文件,一个教程告诉我使用此代码,但我看不出它是如何找到gem文件的。两个参考: 我今天偶然发现了这一点: 如果从目录树中的boot.rb向上移动两个目录: 您看到Gemfile,这让我相信File.expand\u path(“../../Gemfile””,\uu\u File\uu)引用了以下文件:/pat
ENV[“BUNDLE\u GEMFILE”]=File.expand\u path(“../../GEMFILE”,\uuuuuuu File)
我正试图从某个目录访问一个.rb文件,一个教程告诉我使用此代码,但我看不出它是如何找到gem文件的。两个参考:
我今天偶然发现了这一点:
如果从目录树中的boot.rb向上移动两个目录:
您看到Gemfile,这让我相信File.expand\u path(“../../Gemfile””,\uu\u File\uu)
引用了以下文件:/path/to/this/File/。/../Gemfile
File.expand_path('../../Gemfile', __FILE__)
是一种有点难看的Ruby习惯用法,用于在知道相对于当前文件的路径时获取文件的绝对路径。另一种书写方式是:
File.expand_path('../Gemfile', File.dirname(__FILE__))
两者都很难看,但第一种变体较短。然而,在掌握窍门之前,第一种变体也是非常不直观的。为什么额外的。
?(但第二种变体可能给出了为什么需要它的线索)
其工作原理如下:File.expand\u path
返回第一个参数相对于第二个参数(默认为当前工作目录)的绝对路径<代码>\uuuu文件\uuuu是代码所在文件的路径。由于本例中的第二个参数是指向文件的路径,并且file.expand\u path
假定为目录,因此我们必须在路径中附加一个。
,以获得正确的路径。这就是它的工作原理:
File.expand\u path
基本上是这样实现的(在下面的代码中,path
的值为。/../Gemfile
和relative\u to
的值为/path/to/File.rb
):
def File.expand_path(path,relative_to=Dir.getwd)
#首先将两个参数连接起来,第二个参数先连接起来
绝对路径=File.join(相对路径)
而绝对路径包含?(“…”)
#删除第一次出现的/。。
绝对路径=绝对路径.sub(%r{/[^/]+/\.\.},,)
结束
绝对路径
结束
(还有一点,它将~
扩展到主目录,等等——上面的代码可能还有一些其他问题)
单步调用上面的代码绝对路径
将首先获得值/path/to/file.rb/./../Gemfile
,然后对于循环中的每一轮,将删除第一个。
,以及它前面的路径组件。首先删除/file.rb/。
,然后在下一轮中删除/to/。
,我们得到/path/Gemfile
长话短说,File.expand_path('../../Gemfile',uuu File_uu)
是一个技巧,当您知道相对于当前文件的路径时,可以获取文件的绝对路径。相对路径中的额外。
用于删除中的文件名
在Ruby 2.0中有一个名为\uuuuu dir\uuuuu
的内核
函数,它被实现为File.dirname(File.realpath(\uuuu File\uuuuu))
谢谢您的帖子,但这来自gembundler教程,所以我试图准确地理解他们是如何做到的:)还有一个问题,除了与Ruby 1.9.2之前的版本不兼容之外,还有什么原因不应该只使用“require_relative”呢?从Ruby 2.0开始,您可以使用File.expand_path(“../Gemfile”、\uu dir_u)
Theo的这一行终于让它为我点击了文件。扩展路径假定一个目录
,即使\uuuuuu文件
不是一个目录。为了让事情变得有意义,请使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
def File.expand_path(path, relative_to=Dir.getwd)
# first the two arguments are concatenated, with the second argument first
absolute_path = File.join(relative_to, path)
while absolute_path.include?('..')
# remove the first occurrence of /<something>/..
absolute_path = absolute_path.sub(%r{/[^/]+/\.\.}, '')
end
absolute_path
end