如何通过Rubocop API编程集成标准输入输出格式化器?
如何通过RuboCop API便捷生成格式化输出
其实完全不用折腾临时文件,我来给你两个靠谱的方案,直接通过API实现和终端-s选项一样的效果:
方案一:模拟终端-s选项的逻辑
这个方案完全贴合你在终端里的操作,核心就是临时替换标准输入和输出流,让RuboCop以为它在读取终端输入:
require 'rubocop' def format_ruby_code(code, filename = 'buffer.rb') # 先保存原始的标准输入输出,用完再恢复 original_stdin = $stdin original_stdout = $stdout formatted_code = '' begin # 把要格式化的代码写入到模拟的stdin中 $stdin = StringIO.new(code) # 捕获RuboCop的输出 $stdout = StringIO.new # 解析你需要的选项:自动修复(-a)、文件格式输出(-f fi)、指定虚拟文件名(-s) options, paths = RuboCop::Options.new.parse(['-a', '-f', 'fi', '-s', filename]) config_store = RuboCop::ConfigStore.new # 初始化并运行Runner runner = RuboCop::Runner.new(options, config_store) runner.run(paths) # 提取格式化后的代码 formatted_code = $stdout.string.strip ensure # 恢复原始的输入输出流,避免影响后续代码 $stdin = original_stdin $stdout = original_stdout end formatted_code end # 测试一下 input = "some_var = 'hello'" puts format_ruby_code(input)
方案二:直接调用RuboCop底层修复API
如果觉得用Runner太heavy,也可以直接操作AST和修复器,跳过命令行选项解析的步骤,效率更高:
require 'rubocop' require 'rubocop/cop/registry' def format_ruby_code_directly(code) # 解析代码生成AST parser = RuboCop::AST::Parser.new ast = parser.parse(code) return code unless ast # 加载默认配置和启用的Cop规则 config = RuboCop::ConfigLoader.default_configuration registry = RuboCop::Cop::Registry.new(config) enabled_cops = registry.enabled_cops(config) # 收集所有违规项 offenses = [] enabled_cops.each do |cop_class| cop = cop_class.new(config, nil) cop.inspect(nil, ast) offenses.concat(cop.offenses) end # 应用自动修复并返回结果 corrector = RuboCop::Corrector.new(code, offenses.map(&:corrector)) corrector.rewrite end # 测试示例 input = "some_var = 'hello'" puts format_ruby_code_directly(input)
小提示
- 方案一能完全复用你本地的RuboCop配置文件,和终端执行的效果完全一致,适合需要严格遵循项目规则的场景
- 方案二更轻量,不需要处理命令行选项,适合编辑器实时格式化的场景
- 如果之前遇到选项解析卡顿,试试在选项里加上
--no-config跳过配置加载,或者确保你的RuboCop配置文件路径正确
内容的提问来源于stack exchange,提问作者Pyves
相关产品推荐
相关产品推荐

