typo-4.1 불만
Posted by 미스란디르
typo-4.1 혹은 typo-trunk를 설치하면 에러를 보게 된다.
superclass mismatch for class MacroPost
잠시 추적해보았다. (사실은 하다가 안되서 이틀이나 신경질을 부렸다)
lib/text_filter_plugin.rb 에서는 TextFilterPlugin 클래스와 Typo::Textfilter::MacroPost / MacroPre 클래스를 정의한다.
이름에서 보면 대충 텍스트필터를 위한 클래스 같다. 정체야 어쨌든, MacroPost 는 TextFilterPlugin을 상속받는데, 요 TextFilterPlugin이 전에 썼던거랑 다른거랜다. 상황을 보니 서버를 띄우고 첫번째 페이지로딩에선 괜찮고 두번째부터 그런다.
- 첫번째 의심. 혹시 TextFilterPlugin을 다른데서 정의하고 있나? - 전혀 없다.
- 두번째 의심. 혹시 루비버그? TextFilterPlugin이 수정되고 다시 상속되면 에러가 뜨나?. 해서 두번 load하는 테스트 파일을 만들어서 시도. - 역시 아니다.
- 세번째 의심. 혹시 Typo::Textfilter가 아니라 Typo::TextFilter아냐? ... 아니다 -_-;; TextFilter라는 이름은 model/text_filter.rb에서 이미 사용하고 있고 이건 그거랑 관련은 있지만 다른 놈이라 이름을 다르게 한건가보다.
- 네번째 의심. TextFilterPlugin이 이미 있는데 왜 또 로딩하나? 해서 TextFilterPlugin.object_id와 Typo::Textfilter::MacroPost.suplerclass.object_id 를 확인. 엇? 두번째 로딩부터 값이 달라진다. 그렇다면 역시 이름공간에서 TextFilterPlugin이 사라지고, 다시 로딩하는 과정에서 골때리는 문제가 생긴거다.
const_missing과 load를 다루는 rails 파트는 activesupport의 dependencies.rb 이다. 여기서 특정 상수가 없으면 파일을 찾아서 로딩하는데, 여길 보니 clear 라는 메서드가 있고, 이녀석이 동적으로 불러온 상수들을 이름공간에서 지워버린다.
그렇다면 해결책은? ...이랄까, 그냥 typo를 production 환경으로 돌리면 된다. 저건 development환경일때 매번 다시 로딩하기 위한 수단이었던거다. 뭐, 허무하기 짝이 없다.;
