Учитывая путь, как определить, является ли его абсолютным/относительным в Ruby?

Я работаю над написанием сценария сборки rake, который будет работать на кросс-платформе (Mac OSX, Linux, Windows). Конструкция script будет потребляться сервером .

Я хочу, чтобы логика моего script была следующей:

  • Если путь определен как относительный, сделайте его абсолютным, сделав output_path = FOO_HOME + user_supplied_relative_path
  • Если путь определен как абсолютный, возьмите его как-есть

В настоящее время я использую Pathname.new(location).absolute? но он не работает корректно на окнах.

Какой подход вы предложили бы для этого?

Ответ 1

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

Ответ 2

Метод, который вы ищете, realpath.

По существу вы это делаете:

absolute_path = Pathname.new(path).realpath

N.B.: В модуле Pathname указано, что использование является экспериментальным на машинах, у которых нет имен типа unix. Таким образом, это зависит от реализации. Похоже, JRuby должен работать на Windows.

Ответ 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