使用 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
我正在开发一个开源 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