Я использую пакет sass-lint
NPM для проверки стиля .scss
файлов из задачи Rake, таким образом:
sass_lint_cmd = "sass-lint --config #{ui_library_path}/scss/.sass-lint.yml '#{ui_library_path}/scss/*.scss' -v -q --max-warnings=0"
output, status = Open3.capture2e(sass_lint_cmd)
raise IOError, output unless status == 0
В основном это работает, поскольку в случае каких-либо предупреждений или ошибок линтера задача Rake прерывается, а вывод sass-lint
, включая ошибки, выводится на консоль.
Однако при прямом запуске sass-lint
выдает красивый цветной вывод. При захвате capture2e
цвета теряются.
Я предполагаю, что проблема в том, что sass-lint
(или Node) обнаруживает, что он не работает в TTY, и поэтому выводит обычный текст. Есть ли какая-то опция Process.spawn()
, которую я могу передать Open3.capture2e()
, или какой-то другой метод, с помощью которого я могу заставить его думать, что он работает в TTY?
(Примечание: я просмотрел Обмануть приложение, заставив его думать, что его стандартный вывод является терминалом, а не каналом, но BSD-версия script
, которая поставляется с macOS, похоже, не поддерживает ни --return
, ни -c
параметры, и я работаю на макОС.)
Обновление: я попробовал script -q /dev/null
и PTY.spawn()
в соответствии с ответом Piccolo, но безуспешно.
script -q /dev/null …
работает из командной строки, но не работает в Open3.capture2e()
(он запускается, но выдает монохромный вывод и ложную трассировку стека Bundler::GemNotFound
).
Что касается PTY.spawn()
, заменив приведенный выше код следующим:
r, _w, pid = PTY.spawn(scss_lint_command)
_, proc_status = Process.wait2(pid)
output, status = [r, proc_status.exitstatus]
(warn(output); raise) unless status == 0
подпроцесс никогда не кажется завершенным; если я ps
в другом терминале, он отображается как прерываемый спящий режим. Уничтожение подпроцесса не освобождает родительский процесс.
То же самое происходит с блочной формой.
output, status = nil
PTY.spawn(scss_lint_command) do |r, _w, pid|
_, proc_status = Process.wait2(pid)
output, status = [r, proc_status.exitstatus]
end
(warn(output); raise) unless status == 0
script -q ...
из командной строки, если вы передаете ее вcat
? - person Piccolo   schedule 26.07.2018