【问题标题】:A Ruby method for resolving relative paths while keeping absolute paths?一种在保留绝对路径的同时解析相对路径的Ruby方法?
【发布时间】:2009-12-15 11:27:43
【问题描述】:

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

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

  1. 如果确定路径是相对路径,则通过 output_path = FOO_HOME + user_supplied_relative_path 使其成为绝对路径
  2. 如果确定路径为绝对路径,则按原样处理

我目前正在使用 Pathname.new(location).absolute?,但它在 Windows 上无法正常工作。

您对此有何建议?

【问题讨论】:

标签: ruby cross-platform


【解决方案1】:
require 'pathname'
(Pathname.new "/foo").absolute? # => true
(Pathname.new "foo").absolute? # => false

【讨论】:

  • require 'pathname' 是 ruby​​ 标准库的一部分
【解决方案2】:

你要找的方法是realpath.

基本上你这样做:

absolute_path = Pathname.new(path).realpath

N.B.:路径名模块指出,在没有类似 unix 路径名的机器上使用是实验性的。所以它依赖于实现。看起来 JRuby 应该可以在 Windows 上运行。

【讨论】:

  • Pathname#realpath 假设您的相对路径是相对于当前工作目录的,可能不是用户的主目录。
【解决方案3】:

有一个内置函数涵盖了这两种情况,并且完全符合您的要求:

output_path = File.absolute_path(user_supplied_path, FOO_HOME)

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

【讨论】:

    【解决方案4】:

    Pathname 可以为你做这一切

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

    不过,我不确定是否在 Windows 上。

    【讨论】:

      【解决方案5】:

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

      我在 Linux 和 windows 上检查过,没有任何问题。

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

      output_path = File.expand_path user_supplied_relative_path
      

      【讨论】:

      • File.expand_path 执行以下操作: 1. 如果参数是相对路径,则从中创建绝对路径; 2.扩展~~username。这意味着,File.expand_path 比 OP 要求的要多一点。请改用File.absolute_path
      • 您不必假设 FOO_HOME 是工作目录。 File.chdir 带有块可确保无需永久修改您的工作目录:File.chdir(FOO_HOME){File.absolute_path user_supplied_relative_path}。更简单的方法是提供FOO_HOME 作为调用的第二个参数。 File.expand_pathFile.absolute_path 都接受它。
      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2017-04-19
      • 2010-12-11
      相关资源
      最近更新 更多