给定一个路径,如何确定它在Ruby中的绝对/相对?

时间:2009-12-15 11:27:44

标签: ruby cross-platform

我正在编写一个可以跨平台工作的rake构建脚本(Mac OSX,Linux,Windows)。构建脚本将由CI server使用。

我希望我的脚本逻辑如下:

  1. 如果路径被确定为相对路径,请通过 output_path = FOO_HOME + user_supplied_relative_path
  2. 使其成为绝对路径
  3. 如果路径被确定为绝对路径,请按原样使用
  4. 我目前正在使用 Pathname.new(location).absolute?,但它在Windows上无法正常工作。

    您对此有何建议?

5 个答案:

答案 0 :(得分:26)

require 'pathname'
(Pathname.new "/foo").absolute? # => true
(Pathname.new "foo").absolute? # => false

答案 1 :(得分:9)

您正在寻找的方法是realpath.

基本上你这样做:

absolute_path = Pathname.new(path).realpath

N.B。:Pathname模块指出在没有像路径名这样的unix的机器上使用是实验性的。所以它依赖于实现。看起来JRuby应该适用于Windows。

答案 2 :(得分:3)

有一个内置函数可以覆盖这两种情况并完全符合您的要求:

output_path = File.absolute_path(user_supplied_path, FOO_HOME)

诀窍是提供第二个参数。如果(并且仅当)第一个参数是相对路径,它将作为基本目录服务。

答案 3 :(得分:1)

Pathname可以为您完成所有这些

require "pathname"
home= Pathname.new("/home/foo")

home + Pathname.new("/bin") # => #<Pathname:/bin>
home + Pathname.new("documents") # => #<Pathname:/home/foo/documents>

虽然我对Windows不确定。

答案 4 :(得分:1)

如果相对目录相对于当前工作目录,也可以使用File.expand_path

我检查了Linux和Windows,没有任何问题。

假设FOO_HOME是工作目录,代码为:

output_path = File.expand_path user_supplied_relative_path