Ответ 1
require 'pathname'
(Pathname.new "/foo").absolute? # => true
(Pathname.new "foo").absolute? # => false
Я работаю над написанием сценария сборки rake, который будет работать на кросс-платформе (Mac OSX, Linux, Windows). Конструкция script будет потребляться сервером .
Я хочу, чтобы логика моего script была следующей:
В настоящее время я использую Pathname.new(location).absolute? но он не работает корректно на окнах.
Какой подход вы предложили бы для этого?
require 'pathname'
(Pathname.new "/foo").absolute? # => true
(Pathname.new "foo").absolute? # => false
Метод, который вы ищете, realpath.
По существу вы это делаете:
absolute_path = Pathname.new(path).realpath
N.B.: В модуле Pathname указано, что использование является экспериментальным на машинах, у которых нет имен типа unix. Таким образом, это зависит от реализации. Похоже, JRuby должен работать на Windows.
Существует встроенная функция, которая охватывает оба случая и делает именно то, что вы хотите:
output_path = File.absolute_path(user_supplied_path, FOO_HOME)
Трюк дает второй аргумент. Он является базовым каталогом, если (и только если) первым аргументом является относительный путь.
Pathname
может сделать все, что для вас
require "pathname"
home= Pathname.new("/home/foo")
home + Pathname.new("/bin") # => #<Pathname:/bin>
home + Pathname.new("documents") # => #<Pathname:/home/foo/documents>
Я не уверен об этом в Windows.
Вы также можете использовать File.expand_path
, если относительный каталог относится к текущему рабочему каталогу.
Я проверил Linux и Windows и не имел никаких проблем.
Предполагая, что FOO_HOME
является рабочим каталогом, код будет:
output_path = File.expand_path user_supplied_relative_path