너무나도 동적인 루비인지라, 루비 위에 만들어진 프레임워크를 확장하는 방법은 기존의 것과 꽤 다르다. 이를 가장 잘 보여주는 것이 UJS4Rails가 아닐까? UJS4Rails 플러그인을 설치하기만 하면, 레일스 Tag Helper가 내뱉는 HTML 코드가 달라진다. 플러그인에서 이들 라이브러리를 확장하기 때문이다.

 

레일스 플러그인 디렉터리에만 400개가 넘는 플러그인이 등록되어있다. 플러그인 조립만으로도 그럴싸한 웹 애플리케이션을 만들 수 있을 정도이다. 실제로 현재 개발 중인 프로젝트에 OpenID 지원을 추가하려는데, OpenID Consumer 플러그인을 이용하니 아주 손쉽게 구현할 수 있었다.

 

하지만 분명하게 말할 수 있는 것은 '플러그인을 남발(?)하면 다친다'는 사실이다. 일례로 나는 새로 업데이트된 RSpec 플러그인 때문에 오늘 오전을 완전히 날려버렸다. 잘 돌던 애플리케이션이 유독 test environment에서만 뜨지를 않는 것이다. 찾아보니 Rspec 플러그인과 UJS4Rails 플러그인이 충돌하는 것이었다. 로드 되는 순서를 바꿔서 해결을 하기는 했지만, 원인 분석도 쉽지 않았고 플러그인들이 저지르는 못된 짓들(include, extend를 남발)도 너무 많이 보고는 지쳐버렸다. 게다가 현재 EdgeRails를 사용 중이라 플러그인으로 인해 겪는 문제가 더 심각하기도 했다.

 

암튼, 애플리케이션에 플러그인을 설치한다는 것은 그 플러그인 소스를 100% 읽고 이해하겠다는 전제 조건이 필요하다. 지금 잘 돌아가더라도, 언젠가는…

 

정말 간단한 팁이지만 필요할까 싶어 적어본다. 현재 진행 중인 프로젝트에서 내가 사용하는 플러그인들이다.

 

  • annotate_models
  • open_id_consumer
  • restful_authentication
  • rspec
  • selenium-on-rails
  • unobtrusive_javascript
  • visualize_models

 

이 중 production 환경에 필요한 플러그인은 open_id_consumer와 unobtrusive_javascript 뿐이다. 다른 플러그인은 꺼버리고 싶다.

 

config/environments/production.rb 파일에 아래 줄을 추가해주면 된다.

 

  1. config.plugins = ['open_id_consumer', 'unobtrusive_javascript']

 

rspec, selenium-on-rails를 test 환경에서만 사용한다든가 하는 설정도 같은 방법으로 가능하다.

 

플러그인 사이에 로딩 순서가 중요할 수도 있다. 일례로 내 test 환경에서는 rspec이 ujs4rails보다 늦게 구동되어야 올바른 동작이 보장되었다(원인은 현재 파악 중이다). 어떻게 해야 할까? 소스를 찾아보니 알파벳 순으로 플러그인을 로드한다. rspec를 가장 나중에 구동시키기 위해서 rspec 디렉터리를 z-rspec으로 바꿔버렸다. 하하. 너무 어이없는 꼼수지만 어쨌든 동작한다.

 

레일스 플러그인 구조가 변경될 거라는 말을 들은 적 있다. 애플리케이션을 만들 때마다 authentication_generator 등의 플러그인을 항상 설치하는 것은 낭비이기 때문에 이를 개선하려는 시도일 것이다.

 

플러그인 좋다. 좋다. 그런데 안정성만은 깨트리지 말아다오!

 

UPDATED:2006-12-16) SVN에 다음과 같은 변경이 커밋되었다.

> After all plugins are loaded, duplicates are removed from the load path.

> Plugins are loaded in alphabetical order.

> If an array of plugin names is specified in config.plugins, the plugins

> will be loaded in that order. Otherwise, plugins are loaded in alphabetical

> order.

이제 이름을 바꾸는 황당한 일은 하지 않아도 된다. 환경 파일에서 지정한 순서로 로딩되기 때문이다.

http://dev.rubyonrails.org/changeset/5720

 

 

Leave a Reply

Website

Email