Guard: Ctrl-C ν¬λž˜μ‹œ κ°€λ“œ

에 λ§Œλ“  2016λ…„ 06μ›” 16일  Β·  21μ½”λ©˜νŠΈ  Β·  좜처: guard/guard

(guard-rspec ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜μ—¬) μ‹€ν–‰ 쀑인 ν…ŒμŠ€νŠΈλ₯Ό μ·¨μ†Œν•˜λ €κ³  ν•  λ•Œλ§ˆλ‹€ κ°€λ“œ μ‰˜μ΄ μΆ©λŒν•˜κ³  ν…ŒμŠ€νŠΈκ°€ κ³„μ†λ©λ‹ˆλ‹€. κ°€λ“œλ₯Ό μ—΄κ³  ctrl-cλ₯Ό λˆ„λ₯΄λŠ” κ²ƒλ§ŒμœΌλ‘œ κ°„λ‹¨ν•˜κ²Œ μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 전체 디버그 μ„Έμ…˜ 좜λ ₯ 및 진단 μ •λ³΄λŠ” μ•„λž˜μ— μžˆμŠ΅λ‹ˆλ‹€. 2.3.0μ—μ„œλŠ” 잘 μž‘λ™ν•˜μ§€λ§Œ 2.3.1μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 루비 버전과 관련이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

$ bundle exec guard --debug
13:09:37 - DEBUG - Notiffany: gntp not available (Please add "gem 'ruby_gntp'" to your Gemfile and run your app with "bundle exec".).
13:09:37 - DEBUG - Notiffany: growl not available (Unsupported platform "linux-gnu").
13:09:37 - DEBUG - Notiffany: terminal_notifier not available (Unsupported platform "linux-gnu").
13:09:37 - DEBUG - Notiffany: libnotify not available (Please add "gem 'libnotify'" to your Gemfile and run your app with "bundle exec".).
13:09:37 - DEBUG - Command execution: which notify-send
13:09:37 - DEBUG - Notiffany: notifysend not available (libnotify-bin package is not installed).
13:09:37 - DEBUG - Notiffany: notifu not available (Unsupported platform "linux-gnu").
13:09:37 - DEBUG - Command execution: {"ALTERNATE_EDITOR"=>"false"} emacsclient --eval '1'
13:09:37 - DEBUG - Notiffany: emacs not available (Emacs client failed).
13:09:37 - DEBUG - Command execution: tmux -V
13:09:37 - DEBUG - Notiffany: file not available (No :path option given).
13:09:37 - DEBUG - Command execution: tmux -V
13:09:37 - DEBUG - Notiffany is using Tmux to send notifications.
13:09:37 - DEBUG - Command execution: tmux list-clients -F '#{client_tty}'
13:09:37 - DEBUG - Command execution: tmux show -t /dev/pts/0
13:09:37 - DEBUG - Notiffany is using TerminalTitle to send notifications.
13:09:37 - DEBUG - Command execution: hash stty
13:09:37 - DEBUG - Guard starts all plugins
13:09:37 - DEBUG - Hook :start_begin executed for Guard::RSpec
13:09:37 - INFO - Guard::RSpec is running
13:09:37 - DEBUG - Hook :start_end executed for Guard::RSpec
13:09:38 - INFO - Guard is now watching at '/mnt/data1/home/andrew/projects/039-disciple/disciple-api'
13:09:38 - DEBUG - Start interactor
[1] guard(main)>  [ pressed ctrl-c here ]
[1] guard(main)> ⏎                                                                                                                                                                                                                                                                                                            $  [typed a few random characters]
$ aError: Input/output error - read
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:198:in `readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:198:in `block in input_readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:115:in `interruptible_region'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:197:in `input_readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:183:in `block in read_line'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:129:in `handle_read_errors'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:170:in `read_line'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:98:in `read'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:68:in `block in repl'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `loop'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `repl'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `block in start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:61:in `__with_ownership'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:79:in `with_ownership'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:15:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/pry_class.rb:169:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-byebug-3.4.0/lib/pry-byebug/pry_ext.rb:11:in `start_with_pry_byebug'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/guard-2.14.0/lib/guard/jobs/pry_wrapper.rb:102:in `block (2 levels) in _switch_to_pry'
[... this section below repeats several times ...]
[1] guard(main)> Error: Input/output error - read
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:198:in `readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:198:in `block in input_readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:115:in `interruptible_region'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:197:in `input_readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:183:in `block in read_line'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:129:in `handle_read_errors'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:170:in `read_line'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:98:in `read'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:68:in `block in repl'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `loop'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `repl'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `block in start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:61:in `__with_ownership'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/input_lock.rb:79:in `with_ownership'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/repl.rb:15:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib/pry/pry_class.rb:169:in `start'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-byebug-3.4.0/lib/pry-byebug/pry_ext.rb:11:in `start_with_pry_byebug'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/guard-2.14.0/lib/guard/jobs/pry_wrapper.rb:102:in `block (2 levels) in _switch_to_pry'
[... end of repeating section ...]
[1] guard(main)> Error: Input/output error - read
FATAL: Pry failed to get user input using `Readline`.
To fix this you may be able to pass input and output file descriptors to pry directly. e.g.
  Pry.config.input = STDIN
  Pry.config.output = STDOUT
  binding.pry

13:11:22 - DEBUG - Interactor was stopped or killed
13:11:22 - DEBUG - Guard stops all plugins
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 status-left-bg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 status-right-bg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 status-left-fg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 status-right-fg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 message-bg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 message-fg
13:11:22 - DEBUG - Command execution: tmux set -q -u -t /dev/pts/0 display-time
$ uname -a
Linux triton.avito.uk 4.5.0-x86_64-linode65 #2 SMP Mon Mar 14 18:01:58 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

λ‚΄κ°€ 말할 수 μžˆλŠ” ν•œ λ‚΄ Ruby 2.3.1은 Readline μ§€μ›μœΌλ‘œ μ»΄νŒŒμΌλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

$ ruby -rreadline -e 'puts Readline::VERSION'
6.3

λΆˆν–‰νžˆλ„ 이것을 λ””λ²„κΉ…ν•˜κΈ° μœ„ν•œ λ‹€μŒ 단계가 무엇인지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

bug help needed work in progress

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

관련이 μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ RSpec 쀑에 CTRL-Cλ₯Ό λˆ„λ₯΄λ©΄ λ‹€μ‹œ pry에 λΉ μ§€μ§€λ§Œ κ°€λ“œλŠ” λ‹€μ‹œλŠ” 아무 것도 μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 디버깅을 많이 μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ™μž‘μ€ λ²ˆλ“€ μ‹€ν–‰μ˜ μœ λ¬΄μ— 관계없이 λ™μΌν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ§€μ •ν•œ λΆ„κΈ°λ‘œ 싀행을 μ‹œλ„ν–ˆλŠ”λ° RSpec을 μ€‘μ§€ν•œ ν›„ κ°€λ“œκ°€ μ’…λ£Œλ˜λŠ” μœ„μΉ˜μ— 차이가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ 아이디어라도? 이것과 관련이 μžˆμŠ΅λ‹ˆκΉŒ? 이에 λŒ€ν•΄ 즉각적인 아이디어가 μ—†λŠ” 경우 λ‚΄λΆ€λ₯Ό νŒŒν—€μ³ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 느린 사양을 많이 가지고 있으며 쀑간에 사양을 쀑지할 수 있으면 λ§Žμ€ μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. :)

λͺ¨λ“  21 λŒ“κΈ€

λ‚˜λŠ” λ˜ν•œ 2.2.5μ—μ„œ 이것을 κ²½ν—˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ 이것을 κ²½ν—˜ν•˜κ³  μžˆμ§€λ§Œ (효과적으둜 λ™μΌν•œ μŠ€νƒ 좔적) Ruby v2.3.0 , Guard v2.13.0 μžˆμŠ΅λ‹ˆλ‹€.

bundle exec guard λ₯Ό 톡해 Guardλ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ ν”„λ‘¬ν”„νŠΈμ—μ„œ Ctrl-C λ₯Ό λˆ„λ₯΄λ©΄ λ¬Έμ œκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ²ˆλ“€μ„ ν†΅ν•˜μ§€ μ•Šκ³  guard μ‹€ν–‰ν•˜λ©΄ Ctrl-C λˆŒλŸ¬λ„ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

전체 Ruby 및 Readline 버전:

$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15.5.0]
$ ruby -rreadline -e 'puts Readline::VERSION'
6.3

Pry ν”„λ‘¬ν”„νŠΈ 였λ₯˜κ°€ λ°œμƒν•œ ν›„ 여기에 μ„€λͺ…λœ 것과 μœ μ‚¬ν•œ 터미널 손상이 λ°œμƒν•©λ‹ˆλ‹€.
https://github.com/pry/pry/issues/1275
https://github.com/pry/pry/issues/1183
https://github.com/guard/guard/issues/719

rb-readline gem을 μˆ˜λ™μœΌλ‘œ μ„€μΉ˜ν•˜λ©΄ λ‚˜μ€‘μ— λ°œμƒν•˜λŠ” 손상 λ¬Έμ œλŠ” ν•΄κ²°λ˜μ§€λ§Œ Ctrl-C λŠ” λ™μΌν•œ μŠ€νƒ 좔적을 μƒμ„±ν•©λ‹ˆλ‹€. 이 gem이 μ„€μΉ˜λœ μƒνƒœμ—μ„œ guardλŠ” λ‹€μŒκ³Ό 같이 Readline 버전을 λ³΄κ³ ν•©λ‹ˆλ‹€:

[1] guard(main)> Readline::VERSION
=> "5.2"

μ—¬κΈ°μ—μ„œ μ •ν™•νžˆ λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€... @WilHall이 μ œμ•ˆν•œ κ²ƒμ²˜λŸΌ μ™ΈλΆ€ 번

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin14]
$ guard -v
Guard version 2.14.0

λ‚΄ Readline 버전은 κ°€λ“œ 내뢀와 μ™ΈλΆ€ λͺ¨λ‘ 6.3 μž…λ‹ˆλ‹€.

λͺ‡ 가지λ₯Ό ν•©μΉœ 것 κ°™μŠ΅λ‹ˆλ‹€.

"quickfix" 브랜치λ₯Ό λ§Œλ“€κ³  λ‚˜μ€‘μ— ν†΅ν•©ν•˜λŠ” 방법을 μ•Œμ•„λ‚Ό κ²ƒμž…λ‹ˆλ‹€.

μ’‹μ•„, λͺ‡ 가지 ν•΄ν‚ΉμœΌλ‘œ λΆ„κΈ°λ₯Ό λ§Œλ“­λ‹ˆλ‹€. https://github.com/guard/guard/tree/experimental_fixes

Gemfile μ—μ„œ μ‚¬μš©ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

gem 'guard', github: 'guard/guard', branch: 'experimental_fixes'

그런 λ‹€μŒ ν‰μ†Œμ™€ 같이 μ—…λ°μ΄νŠΈμ™€ bundle exec guard λ₯Ό λ²ˆλ“€λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

λ˜ν•œ μ•Œλ¦Όμ„ λΉ„ν™œμ„±ν™”ν•˜μ—¬ λ‹€μŒ μž‘μ—…μ—λ„ 도움이 λ˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

bundle exec guard -n f

문제 및 μˆ˜μ • 사항을 λ³΄κ³ ν•˜μ‹­μ‹œμ˜€.

ν•΄κ²°ν•΄μ•Ό ν•  λͺ‡ 가지 문제:

  1. ctrl-C둜 κ°€λ“œλ₯Ό μ’…λ£Œν•  λ•Œ Pryκ°€ μΆ©λŒμ„ 쀑지해야 ν•©λ‹ˆλ‹€.
  2. λ§ˆμ§€λ§‰ 쀄 μ΄ν›„μ˜ 좜λ ₯은 μ•„λž˜μ˜ μ…Έ ν”„λ‘¬ν”„νŠΈλ₯Ό μˆ¨κΈ°μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.
  3. TMux 및 TerminalTitle μ•Œλ¦¬λ―Έκ°€ λͺ¨λ‘ 좜λ ₯에 문제λ₯Ό μΌμœΌν‚€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
  4. ν™•μΈν•˜μ§€ μ•Šμ•˜μ§€λ§Œ LumberJack λ‘œκΉ…μ΄ μ‹œκ°„ ν”ŒλŸ¬μ‹±μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ•Ό ν•  λ•Œ μ‚¬μš©ν•˜κ³  μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. STDERR 슀트림이 더 이상 λ‹«νžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  6. PryλŠ” 더 이상 μ£½κ±°λ‚˜ ν•©λ₯˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  κΉ¨μ–΄λ‚©λ‹ˆλ‹€(λ”°λΌμ„œ λ‹€λ₯Έ 쑰정을 κ³ λ €ν•  λ•Œ "λ©ˆμΆ”μ§€" μ•Šμ•„μ•Ό 함).

일뢀 νšŒκ·€/문제:

  1. κ°€λ“œ/νƒœμŠ€ν¬κ°€ 컬러 좜λ ₯을 망치면 μˆ˜μ •λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(μ½˜μ†” μž¬μ„€μ •μ€ λΉ„ν™œμ„±ν™”λ¨).
  2. 이에 λŒ€ν•œ ν…ŒμŠ€νŠΈ μ—†μŒ(λ¨Όμ € 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λ €κ³  함)
  3. MRI 2.3.1 μ΄μ™Έμ˜ λ‹€λ₯Έ Rubiesμ—μ„œλŠ” ν…ŒμŠ€νŠΈλ˜μ§€ μ•ŠμŒ

기타 ν•΄κ²° 방법:

필사적이라면 Pry 및 μ•Œλ¦Ό 없이 Guardλ₯Ό μ‚¬μš©ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

bundle exec guard -n f -i

이것이 도움이 λ˜κ±°λ‚˜ λ‹€λ₯Έ λ¬Έμ œκ°€ μžˆλŠ” 경우 μ•Œλ €μ£Όμ‹œλ©΄ κ³΅μ‹μ μœΌλ‘œ μˆ˜μ • 및 λ¦΄λ¦¬μŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μˆ˜μ • 사항 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” PR을 자유둭게 μ œμΆœν•˜μ‹­μ‹œμ˜€(ν…ŒμŠ€νŠΈλŠ” μ’‹μ§€λ§Œ).

μ•½κ°„μ˜ μˆ˜μ •μ„ κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

λ³€κ²½ 사항을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€(λ˜λŠ” μœ„μ˜ Gemfile 행을 μ‚¬μš©ν•˜λŠ” 경우 bundle update ). 그런 λ‹€μŒ 이것을 Guardfile ν•˜μ—¬ 도움이 λ˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

UI.options.merge!(flush_seconds: 0, level: :debug, device: 'guard.log')
notification :off

λ˜ν•œ guard.log 였λ₯˜λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. (OSXμ—μ„œ 전체 디렉토리 검색을 νŠΈλ¦¬κ±°ν•  수 μžˆμ§€λ§Œ).

@e2 μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ 운이 쒋지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

  • Ctrl-C의 좩돌 λ™μž‘μ€ μΆ”κ°€ ν”Œλž˜κ·Έ 없이 μ‹€ν–‰ν•  λ•Œ "experimental_features" 뢄기와 λ™μΌν•˜κ²Œ μœ μ§€λ©λ‹ˆλ‹€.
  • -n f ν•˜λ©΄ 차이가 μ—†μŠ΅λ‹ˆλ‹€.
  • -i λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…ŒμŠ€νŠΈμ—μ„œ Ctrl-Cλ₯Ό λˆŒλ €μ„ λ•Œ 좩돌이 λ°©μ§€λ©λ‹ˆλ‹€(μ’…λ£Œν•˜κΈ° μ–΄λ ΅κΈ΄ ν•˜μ§€λ§Œ!).

Ctrl-D둜 μ’…λ£Œν•  λ•Œ μ’…μ’… λ‹€μŒ μ˜ˆμ™Έ 쀑 ν•˜λ‚˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ 경쟁 쑰건일 수 μžˆμŠ΅λ‹ˆλ‹€.

19:56:17 - INFO - Bundle already up-to-date
19:56:17 - INFO - Guard is now watching at '/mnt/data1/home/andrew/projects/042-joinly/joinly-app'
^Clog writing failed. can't modify frozen IOError
➜  joinly-app git:(master) βœ—
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/guard-d299ad21cfa8/lib/guard/commander.rb:69:in `stop': undefined method `destroy' for #<Guard::Jobs::Sleep:0x0056104497dd80> (NoMethodError)
        from /home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/guard-d299ad21cfa8/lib/guard/commander.rb:53:in `start'
        from /home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/guard-d299ad21cfa8/lib/guard/cli/environments/valid.rb:16:in `start_guard'
        from /home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/guard-d299ad21cfa8/lib/guard/cli.rb:122:in `start'
[...]

κ³Ό

19:56:29 - INFO - Bundle already up-to-date
19:56:30 - INFO - Guard is now watching at '/mnt/data1/home/andrew/projects/042-joinly/joinly-app'
^CE, [2016-08-01T19:56:38.584021 #10597] ERROR -- : run() in thread failed: stream closed:\n /home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:300:in `readpartial'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:300:in `readpartial'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:271:in `read_events'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:238:in `process'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:221:in `run'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb:39:in `_run'
[...]

Guardfile 와 μ„  bundle exec guard -n f 였λ₯˜μ— 지연을 μ†Œκ°œν•˜λŠ” 것 κ°™λ‹€. ν…ŒμŠ€νŠΈ μ‹€ν–‰ 쀑에 Ctrl-Cλ₯Ό λˆ„λ₯΄λ©΄ μ—¬μ „νžˆ ν™œμ„± ν”„λ‘¬ν”„νŠΈμ™€ ν˜Όν•©λœ STDOUT에 계속 μ“°λŠ” ν…ŒμŠ€νŠΈμ™€ ν•¨κ»˜ Pryκ°€ λΆ„λ¦¬λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 같은 λ°©μ‹μœΌλ‘œ λλ‚©λ‹ˆλ‹€.

[1] guard(main)> Error: Input/output error - read
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.4/lib/pry/repl.rb:198:in `readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.4/lib/pry/repl.rb:198:in `block in input_readline'
/home/andrew/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.4/lib/pry/input_lock.rb:115:in `interruptible_region'

확인해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ @Odaeus .

λ¨Όμ € non-pry μΈν„°λž™ν„°λ₯Ό λ§μ³€μŠ΅λ‹ˆλ‹€. (이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 방금 컀밋을 ν‘Έμ‹œν–ˆμŠ΅λ‹ˆλ‹€.)

λ‘˜μ§Έ, 이 rb-inotify 버그가 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: https://github.com/nex3/rb-inotify/pull/59

μˆ˜μ • 사항을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€(아직 λ³‘ν•©λ˜κ±°λ‚˜ λ¦΄λ¦¬μŠ€λ˜μ§€ μ•ŠμŒ).

κ·Έλ•ŒκΉŒμ§€λŠ” Gemfile μ—μ„œ 이것을 μ‚¬μš©ν•©λ‹ˆλ‹€.

gem 'rb-inotify', github: 'e2/rb-inotify', branch: 'e2-fix_ioerror_when_closed'

그러면 문제 2κ°€ ν•΄κ²°λ©λ‹ˆλ‹€.

문제 3의 경우 - μ•„λ§ˆλ„ 진행 쀑인 μž‘μ—…μΌ 수 μžˆμ§€λ§Œ Guardfile μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

UI.options.merge!(flush_seconds: 0, level: :debug, device: 'guard.log')
notification :off

그리고 λ‹€λ₯Έ 창의 좜λ ₯에 tail -f guard.log λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μˆ˜μ •ν•˜λ €λ©΄ 전체 Pry μ„Έμ…˜ 처리λ₯Ό λ‹€μ‹œ 섀계해야 ν•  것 κ°™μŠ΅λ‹ˆλ‹€. μ•„λ§ˆ ν† μš”μΌ 전체가 해결될 κ²ƒμž…λ‹ˆλ‹€ :(

더 이상 νŒ¨μΉ˜κ°€ 있으면 μ—¬κΈ° μžˆλŠ” λͺ¨λ“  μ‚¬λžŒμ—κ²Œ μ΅œλŒ€ν•œ 빨리 μ•Œλ € λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μ’‹μ•„, 이것은 (λ‚΄κ°€ 말할 μˆ˜μžˆλŠ” ν•œ) μž‘λ™ν•΄μ•Όν•©λ‹ˆλ‹€.

κ·€ν•˜μ˜ Gemfile :

 gem "guard", github: "guard/guard",
                branch: "experimental_fixes", ref: "c6ab8a0"

 gem "listen", require: false, github: "guard/listen",
                branch: "advanced_thread_debugging", ref: "31053de"

  gem "guard-rspec", require: false, github: "guard/guard-rspec",
                     branch: "ctrl_c_workaround", ref: "ee0b21d"

  gem "rb-inotify", require: false, github: "e2/rb-inotify",
                    branch: "e2-fix_ioerror_when_closed", ref: "99d2101"

κ½€ λ§Žμ€ νŒ¨μΉ˜μž…λ‹ˆλ‹€. ν…ŒμŠ€νŠΈν•˜κ³  κ°€λŠ₯ν•œ ν•œ 빨리 μ΄λŸ¬ν•œ 패치λ₯Ό λ¦΄λ¦¬μŠ€ν•  수 μžˆλ„λ‘ PR을 κ²€ν† ν•˜κ³ , λŒ“κΈ€μ„ 달고, PR을 λ³΄λ‚΄μ£Όμ‹­μ‹œμ˜€.

감사!

@e2 이 λ™μž‘μ€ 훨씬 더 μ’‹μŠ΅λ‹ˆλ‹€. ctrl-cλ₯Ό λˆ„λ₯Έ μœ„μΉ˜λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λͺ…λ Ή ν”„λ‘¬ν”„νŠΈλ‘œ λ‹€μ‹œ λ–¨μ–΄μ§€μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λŠ” μ€‘μž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰μ— μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³  벌λͺ©κΎΌμ—μ„œ λ‚˜μ˜€λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ 사양은 싀행을 멈μΆ₯λ‹ˆλ‹€. λ΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€!

^CGuard: INT signal, handling inside trap...                                                                                                             |  ETA: 00:02:03
Guard Pry job: handling interrupt
Guard Pry job: no thread, interrupting Guard

RSpec is shutting down and will print the summary report... Interrupt again to force quit.
Guard::RSpec: Interrupted by user. Waiting for RSpec to die...
➜  source_code git:(development) βœ—  3/17 |========== 17 ==========>                                                                                                                         |  ETA: 00:02:28
Pending: (Failures listed here are expected and do not affect your suite's status)

  1) items can export items pdf export
     # Temporarily skipped with xit
     # ./spec/features/items_spec.rb:38


Top 3 slowest examples (25.2 seconds, 83.1% of total time):
  items can click export button and walk through modals
    14.92 seconds ./spec/features/items_spec.rb:26
  items appear in proper time periods
    10.28 seconds ./spec/features/items_spec.rb:51
  items can export pdf export
    0.00005 seconds ./spec/features/items_spec.rb:38

Finished in 30.33 seconds (files took 1.14 seconds to load)
3 examples, 0 failures, 1 pending

Randomized with seed 54136

Coverage report generated for RSpec to /Users/justin/dev/source_code/coverage. 1759 / 3324 LOC (52.92%) covered.

➜  source_code git:(development) βœ—
10:18:10 - INFO - Inspecting Ruby code style: spec/features/items_spec.rb
Inspecting 1 file
.

1 file inspected, no offenses detected

10:18:11 - INFO - Bye bye...
/Users/justin/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/gems/lumberjack-1.0.10/lib/lumberjack/device/writer.rb:89:in `close': closed stream (IOError)
    from /Users/justin/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/gems/lumberjack-1.0.10/lib/lumberjack/device/writer.rb:89:in `close'
    from /Users/justin/.rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/gems/lumberjack-1.0.10/lib/lumberjack/logger.rb:140:in `close'
    from /Users/justin/dev/source_code/vendor/cache/guard-c6ab8a0b70a3/lib/guard/aruba_adapter.rb:51:in `execute'
    from /Users/justin/dev/source_code/vendor/cache/guard-c6ab8a0b70a3/lib/guard/aruba_adapter.rb:20:in `execute!'
    from /Users/justin/dev/source_code/vendor/cache/guard-c6ab8a0b70a3/bin/_guard-core:11:in `<main>'

@jetheredge - ν…ŒμŠ€νŠΈν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 λ„ˆλ¬΄ 빨리 쑰사할 μ‹œκ°„μ΄ 없을 κ²ƒμž…λ‹ˆλ‹€ :(

κ·Έλž˜λ„ ν™œμš©λ„κ°€ λ†’μ•„μ„œ λ‹€ν–‰μž…λ‹ˆλ‹€.

κ·€ν•˜μ˜ μ˜ˆμ— λ”°λ₯΄λ©΄ RSpec은 μ€‘μ§€λ˜μ–΄μ•Ό ν•˜κ³  GuardλŠ” Pry ν”„λ‘¬ν”„νŠΈλ‘œ λŒμ•„κ°€μ•Ό ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” Guardκ°€ INT μ‹ ν˜Έλ₯Ό νŠΈλž©ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 그러면 μ•ˆλ©λ‹ˆλ‹€. Pryλ₯Ό μ£½μ΄λŠ” 데만 μ‚¬μš©ν•΄μ•Ό ν•˜μ§€λ§Œ Pryκ°€ μ‹€ν–‰λ˜κ³  μžˆμ§€ μ•Šκ³  μž‘μ—…μ΄ μ—†λŠ” κ²½μš°μ—λŠ” 아무 μž‘μ—…λ„ μˆ˜ν–‰ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

λˆ„κ΅°κ°€ ν…ŒμŠ€νŠΈν•˜κ³  μ‹Άλ‹€λ©΄ 이에 λŒ€ν•œ PR을 μˆ˜λ½ν•˜κ² μŠ΅λ‹ˆλ‹€. (기본적으둜 "Guard Pry job: no thread, interrupting Guard"λŠ” λ°œμƒν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. μΈν„°λŸ½νŠΈλŠ” PryWrapperμ—μ„œ λ¬΄μ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.)

@e2 κ°μ‚¬ν•©λ‹ˆλ‹€! λ‹€μŒ 주에 PR을 λ§Œλ“œλŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@jetheredge- 이 쀄을 λŒ€μ²΄ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

https://github.com/guard/guard/blob/c6ab8a0/lib/guard/jobs/pry_wrapper.rb#L108

단지 "λ°˜ν™˜"으둜.

λ˜ν•œ Ctrl-CλŠ” μ–΄μ¨Œλ“  κ°€λ“œλ₯Ό μ’…λ£Œν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

@e2 - μ•ˆλ‚΄ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ΄λ²ˆμ£ΌλŠ” μ˜ˆμƒμ™Έλ‘œ λ°”λΉ΄μŠ΅λ‹ˆλ‹€. 곧 PR을 μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

우리 λͺ¨λ‘λŠ” λ‚˜λ₯Ό λ―ΏμœΌμ‹­μ‹œμ˜€ ;)

(믿을 수 μ—†λ‹€λ©΄ Guard의 문제 λͺ©λ‘μ„ ν™•μΈν•˜μ‹­μ‹œμ˜€.
거의 λͺ¨λ‘κ°€ κΈ°λŠ₯μž…λ‹ˆλ‹€).

2016λ…„ 8μ›” 11일 λͺ©μš”일 04:10:08AM -0700μ—μ„œ Justin EtheredgeλŠ” λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@e2 - μ•ˆλ‚΄ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ΄λ²ˆμ£ΌλŠ” μ˜ˆμƒμ™Έλ‘œ λ°”λΉ΄μŠ΅λ‹ˆλ‹€. 곧 PR을 μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/guard/guard/issues/842#issuecomment -239132345

μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것을 아직도 μžŠμ§€ λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 그것은 μ΅œκ·Όμ— 묻힌 λ‚΄ λͺ©λ‘μ— μžˆμŠ΅λ‹ˆλ‹€. 아직 ν•˜λ €κ³  ν•˜λŠ”λ° 생각보닀 μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λ„€μš”.

λ‚˜λ„ λ¬»ν˜”λ‹€. νŒ¨μΉ˜κ°€ μ™„λ£Œλ˜κ³  μΆœμ‹œλ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

관련이 μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ RSpec 쀑에 CTRL-Cλ₯Ό λˆ„λ₯΄λ©΄ λ‹€μ‹œ pry에 λΉ μ§€μ§€λ§Œ κ°€λ“œλŠ” λ‹€μ‹œλŠ” 아무 것도 μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 디버깅을 많이 μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ™μž‘μ€ λ²ˆλ“€ μ‹€ν–‰μ˜ μœ λ¬΄μ— 관계없이 λ™μΌν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ§€μ •ν•œ λΆ„κΈ°λ‘œ 싀행을 μ‹œλ„ν–ˆλŠ”λ° RSpec을 μ€‘μ§€ν•œ ν›„ κ°€λ“œκ°€ μ’…λ£Œλ˜λŠ” μœ„μΉ˜μ— 차이가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ 아이디어라도? 이것과 관련이 μžˆμŠ΅λ‹ˆκΉŒ? 이에 λŒ€ν•΄ 즉각적인 아이디어가 μ—†λŠ” 경우 λ‚΄λΆ€λ₯Ό νŒŒν—€μ³ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 느린 사양을 많이 가지고 있으며 쀑간에 사양을 쀑지할 수 있으면 λ§Žμ€ μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. :)

MacOs Sierraμ—μ„œλ„ 이 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μ·¨μ†Œν•˜λ©΄ νŒŒμΌμ— λŒ€ν•œ λ‹€μŒ λ³€κ²½ 사항이 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹œμ²­μ„ 멈μΆ₯λ‹ˆλ‹€.

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. macOS μΉ΄νƒˆλ¦¬λ‚˜ μ‚¬μš©.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰