Я работаю над проектом Rails 4 с открытым исходным кодом, в котором используется набор инструментов PDF (жемчужина «pdf-forms») для автоматического заполнения форм PDF на основе информации, хранящейся в базе данных приложения. PDFtk требует установки двоичных файлов, а для созданной модели PDFtk требуется путь к двоичным файлам. Путь должен быть динамическим, чтобы он работал на Heroku, Mac OS X и Windows. Я могу найти путь на машине * nix с помощью команды «what». Но Windows не использует «какой», она использует «где».
Есть ли способ определить, отвечает ли платформа на команду, и если да, то выполнить команду?
Моя лучшая попытка — определить платформу с помощью RbConfig (см. ниже). Однако некоторые платформы Windows (например, Cygwin) реагируют на команды *nix. Как пользователь Mac, я не знаком со всеми платформами для Windows.
def pdftk
# Use path stored in Heroku env vars or else get path to local binaries
@pdftk ||= PdfForms.new(ENV['PDFTK_PATH'] || local_path)
end
def local_path
os = RbConfig::CONFIG['arch']
if /mswin/ =~ os
path = `where pdftk` # Get pdftk filepath, Windows equiv of *nix 'which' command
else
path = `which pdftk` # Get pdftk filepath on POSIX systems
end
path
end
config.rb
для пути со значением по умолчанию, установленным там, где эта библиотека установлена «из коробки». (Или с настройкой env, как вы показали в ОП.) - person Aleksei Matiushkin   schedule 19.03.2016config.rb
с жестко заданными путями к файлам не решит проблему определения платформы. - person femmestem   schedule 19.03.2016path
в источникеlocal_path
избыточны.if
в ruby возвращает результат. Я бы просто удалил все, что начинается сif
, и вместо этого использовал"#{/mswin/ =~ os ? 'where' : 'which'} pdftk"
. (Измените двойные кавычки на обратные кавычки.) - person Aleksei Matiushkin   schedule 19.03.2016pdftk
? Есть некоторые полурешения для Windows эквивалент команды unixwhich
. Однако, почему бы вам просто не попробовать вызвать командуpdftk
без каких-либо параметров и увидеть код выхода в$?
? Если вы получаете ненулевой код выхода, скорее всего, программа не существует на платформе. - person BoraMa   schedule 19.03.2016C:\ProgramFiles
или типа того, но в данном случае, принимая во внимание, что я не предлагал избавиться от поддержки Windows, а сделать это изменениемconfig
файла, такой подход вполне приемлем. - person Aleksei Matiushkin   schedule 19.03.2016