Ruby 以编程方式将Rubocop格式化程序与stdin/stdout集成
我试图在编辑器中集成Rubocop的格式化程序:给定一些Ruby代码作为输入,返回一个表示等效格式化代码的字符串。我正在考虑Rubocop的帮助建议的Ruby 以编程方式将Rubocop格式化程序与stdin/stdout集成,ruby,rubocop,Ruby,Rubocop,我试图在编辑器中集成Rubocop的格式化程序:给定一些Ruby代码作为输入,返回一个表示等效格式化代码的字符串。我正在考虑Rubocop的帮助建议的-s选项: -s文件-来自STDIN的管道源,使用攻击报告中的文件。这对于编辑器集成非常有用 在终端中,以下命令成功读取输入内容并将格式化输出打印到标准输出: cat some_file.rb | rubocop-a-f fi-s some_file.rb 但是,我无法使用RuboCopAPI以编程方式再现类似的内容。我希望以某种方式将输入提供给R
-s
选项:
-s文件-来自STDIN的管道源,使用攻击报告中的文件。这对于编辑器集成非常有用
在终端中,以下命令成功读取输入内容并将格式化输出打印到标准输出:
cat some_file.rb | rubocop-a-f fi-s some_file.rb
但是,我无法使用RuboCopAPI以编程方式再现类似的内容。我希望以某种方式将输入提供给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方便地生成格式化输出?只需调用RuboCop作为外部进程,例如使用
Open3.capture2
:
stdout_str, status = Open3.capture2("rubocop -a -f fi -s some_file.rb", input)
我可以问一下您试图构建集成的编辑器是什么吗?您是否有关于如何实现集成的指南或说明?@lacostenycoder我的目标是Solarograph项目,因此是任何具有语言服务器协议支持的编辑器。我提交了一个使用临时文件()触发格式设置的PR,但我觉得它有点慢和笨重,因此这个问题需要尝试提出一个更好的方法。调用将尝试读取
stdin
,因此您的进程会陷入困境。你为什么不把Rubocop作为另一个进程使用,并把它写进这个进程stdin。谢谢分享你的想法!这是最初的做法,但造成了各种问题。这样做假定“rubocop”可执行文件在用户路径上可用,但不一定如此,并且假定编辑器可以访问该路径,而对于在各自独立环境中运行的某些ide来说,情况并非如此。与直接插入API相比,它的效率更低,并且还有其他缺点,例如错误处理。