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

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

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

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

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

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

Ответы [ 5 ]

27 голосов
/ 23 февраля 2010
require 'pathname'
(Pathname.new "/foo").absolute? # => true
(Pathname.new "foo").absolute? # => false
9 голосов
/ 15 декабря 2009

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

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

absolute_path = Pathname.new(path).realpath

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

3 голосов
/ 04 марта 2015

Существует встроенная функция, которая охватывает оба случая и выполняет именно то, что вы хотите:

output_path = File.absolute_path(user_supplied_path, FOO_HOME)

Хитрость заключается во втором аргументе. Он является базовым каталогом, если (и только если) первый аргумент является относительным путем.

1 голос
/ 15 декабря 2009

Вы также можете использовать File.expand_path, если относительный каталог относительно текущего рабочего каталога.

Я проверил на Linux и Windows, и не было никаких проблем.

Предполагая, что FOO_HOME является рабочим каталогом, код будет:

output_path = File.expand_path user_supplied_relative_path
1 голос
/ 15 декабря 2009

Pathname может сделать все это за вас

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

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

Я не уверен в этом в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...