2016-03-19 2 views
1

Я работаю над проектом Rails 4 с открытым исходным кодом, который использует PDF Tool Kit («формат pdf-форм») для автоматического заполнения форм PDF на основе информации, хранящейся в приложении база данных. PDFtk требует установки бинарных файлов, а для созданной модели PDFtk требуется путь к двоичным файлам. Путь должен быть динамичным, поэтому он будет работать на Heroku, Mac OS X и Windows. Я могу найти путь на машине * nix с командой «which». Но Windows не использует «which», он использует «где».Использовать Ruby для определения того, отвечает ли платформа команде CLI

Есть ли способ определить, отвечает ли платформа команде, и если да, то выполните команду?

Моя лучшая попытка - обнаружить платформу с помощью 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 
+0

Не могли бы вы объяснить, зачем вам нужен проект _Rails_ для запуска на хостах Windows? Собираетесь ли вы отправить весь проект конечному пользователю? Является ли пользователь в порядке с установкой проекта rails, я бы пошел с обязательной настройкой в ​​виде 'config.rb' для пути, со значением по умолчанию, установленным для того, где эта библиотека установлена« из коробки ». (Или с настройкой env как вы показали в OP.) – mudasobwa

+0

@mudasobwa Я сотрудничаю удаленно с разработчиками с использованием машин Windows, где некоторые из них не могут/не хотят использовать Cygwin или аналогичные. Использование 'config.rb' с жестко закодированными файловыми путями не устраняет проблему обнаружения платформы. – femmestem

+0

Достаточно честный. Я не имел в виду жестко заданные пути. Я имел в виду, что вы могли бы принудить коллабораторов к изменению содержимого этого файла или установке переменной env. В конце концов, это разработчики, а не клиенты. И, ИМХО, это не кодовое слово, которое действительно нужно отполировать. Определение платформы, как вы показали, уже намного лучше, чем ничего. – mudasobwa

ответ

1

Модуль STDLIB mkmf имеет малоизвестную вспомогательную функцию, find_executable (), который должен дать вам то, что вы хотите

require 'mkmf' 
path = find_executable('cli-command') 

Я лично не тестировал на Windows, но я предполагаю, что это должно работать ... http://ruby-doc.org/stdlib-2.3.0/libdoc/mkmf/rdoc/MakeMakefile.html#method-i-find_executable

1

Команда where должна быть доступна по крайней мере с Windows 7.

Если вы используете JRuby, команда RbConfig::CONFIG['arch'] даст вам идентификатор Java-связанные. В соответствии с этим question вместо этого вы можете использовать host_os (протестирован с jruby 9000 в Windows 7).

Вы также можете сделать код более дружественным для ваших сотрудников, проверяя ошибки вызова на который/где команда:

def local_path 
    os = RbConfig::CONFIG['host_os'] 
    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 
    unless $?.success? 
    log.error "failure to find the pdfkit excutable path" 
    puts "Please set the PDFTK_PATH environment variable to point to the pdftkkit executable" 
    path = "" # maybe throw an exception here 
    end 
    path 
end 
+0

Трудно принять ** один ** правильный ответ между вашим и 10dot, потому что я закончил использовать оба в сочетании. Я принял ответ 10dot как правильный, потому что он был специфичен для того, что я пытался выполнить. Тем не менее, я также подтверждаю ваш ответ за общепринятые советы о том, как переключить ответственность на других разработчиков, чтобы правильно настроить их среду и обеспечить их соблюдением с хорошими сообщениями об ошибках. – femmestem

Смежные вопросы