如何配置Sinatra以接收更多自定义选项参数?
我正在使用Sinatra开发一款本地主机桌面应用,启动时希望传入类似ruby mysinatra.rb -first_name="My Name"的自定义选项,但始终收到无效选项错误。这是因为Sinatra仅支持自带的默认选项,运行ruby mysinatra.rb -h可查看所有支持的选项:
Usage: main [options]
-p port set the port (default is 4567)
-s server specify rack server/handler
-q turn on quiet mode (default is off)
-x turn on the mutex lock (default is off)
-e env set the environment (default is development)
-o addr set the host (default is (env == 'development' ? 'localhost' : '0.0.0.0'))
要求自定义选项每次运行均可灵活修改,不能硬编码到文件中。
方式一:通过环境变量传递参数
启动应用时直接设置环境变量:
first_name="My Name" ruby mysinatra.rb
在Sinatra代码中读取环境变量:
get '/' do "Hello, #{ENV['first_name'] || 'Guest'}!" end
方式二:用--分隔Sinatra默认选项与自定义参数
Sinatra会忽略--之后的所有参数,启动命令如下:
ruby mysinatra.rb -- -first_name="My Name"
在代码中通过ARGV提取并解析自定义参数:
# 过滤获取--之后的自定义参数 custom_args = ARGV.drop_while { |arg| arg != '--' }.drop(1) # 提取first_name参数值 first_name = custom_args.find { |arg| arg.start_with?('-first_name=') }&.split('=')&.last || 'Guest' get '/' do "Hello, #{first_name}!" end
方式三:使用Ruby的optparse库解析自定义参数
如果需要更复杂的参数规则,可借助optparse先处理自定义选项,剩余参数交给Sinatra处理:
require 'sinatra' require 'optparse' custom_options = {} OptionParser.new do |opts| opts.on("-f", "--first_name NAME", "指定你的名字") do |name| custom_options[:first_name] = name end end.parse! get '/' do "Hello, #{custom_options[:first_name] || 'Guest'}!" end
启动时直接传入自定义参数即可:
ruby mysinatra.rb -first_name="My Name"
内容的提问来源于stack exchange,提问作者Leahcim

