【问题标题】:Programmatically integrate Rubocop formatter with stdin/stdout以编程方式将 Rubocop 格式化程序与 stdin/stdout 集成
【发布时间】:2019-11-09 13:33:58
【问题描述】:

我正在尝试将 Rubocop 的格式化程序集成到编辑器中:给定一些 Ruby 代码作为输入,返回一个表示等效格式化代码的字符串。我正在考虑 Rubocop 的帮助建议的 -s 选项:

-s FILE - 来自 STDIN 的管道源,在攻击报告中使用 FILE。这对于编辑器集成很有用。

在终端中,以下命令成功读取输入内容并将格式化的输出打印到标准输出:

cat some_file.rb | rubocop -a -f fi -s some_file.rb

但是,我无法使用 Rubocop API 以编程方式重现类似内容。我希望以某种方式将输入提供给RuboCop::Runner,但是,在我到达这一点之前,只需解析选项就挂起:

require 'rubocop'

input = "some_var    = 'hello'"
options, paths = RuboCop::Options.new.parse(['-a', '-f', 'fi', '-s', 'some_file.rb'])
runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
...

当然,一种选择是删除-s 并对临时文件进行操作,但这会增加复杂性并且效率较低。

如何使用 API 方便地生成格式化输出?

【问题讨论】:

  • 我能问一下您正在尝试为哪个编辑器集成构建集成,您是否有关于如何执行此操作的指南或说明?
  • @lacostenycoder 我的目标是 Solagraph 项目,因此任何支持语言服务器协议的编辑器。我提交了一个使用临时文件(github.com/castwide/solargraph/pull/239)触发格式化的 PR,但我觉得它有点慢和笨重,因此这个问题试图想出一个更好的方法。
  • 调用Options::parse 将尝试从stdin 读取,因此您的进程会卡住。为什么不直接使用popen(3) 作为另一个进程调用 Rubocop,然后写入该进程的标准输入。

标签: ruby rubocop


【解决方案1】:

只需将 RuboCop 作为外部进程调用,例如使用Open3.capture2:

stdout_str, status = Open3.capture2("rubocop -a -f fi -s some_file.rb", input)

【讨论】:

  • 感谢您分享您的想法!这是最初的方法,但引起了各种问题。这样做假定“rubocop”可执行文件在用户的路径上可用,但情况不一定如此,并假定编辑器可以访问该路径,这对于在自己的单独环境中运行的某些 IDE 而言并非如此。它也比直接插入 API 效率低,并且还有其他缺点,例如错误处理。
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 2013-05-13
  • 2015-04-20
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多