使用 Ruby 检测平台是否响应 CLI 命令

Use Ruby to detect if platform responds to CLI command

我正在开发一个开源 Rails 4 项目,该项目使用 PDF 工具包 ('pdf-forms' gem) 根据应用程序中存储的信息自动填写 PDF 表单数据库。 PDFtk 需要安装二进制文件,并且实例化的 PDFtk 模型需要二进制文件的路径。该路径需要是动态的,这样它才能在 Heroku、Mac OS X 和 Windows 上运行。我可以使用 'which' 命令在 *nix 机器上找到路径。但是,Windows 不使用 'which',它使用 'where'。

有没有办法检测平台是否响应命令,如果响应则执行命令?

我最好的尝试是使用 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

where 命令应该至少从 Windows 7 开始可用。

如果你使用jruby,RbConfig::CONFIG['arch']命令会给你一个java相关的标识符。根据此 question,您可以改用 host_os(在 windows 7 中使用 jruby 9000 进行测试)。

您还可以通过检查对 which/where 命令的调用错误来使代码对您的同事更友好:

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

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