OSX Snow Leopard 에서 Rails 개발하게 됐습니다. 환경 세팅이 되야 본격적으로 개발을 진행 할 테니 이 글은 개발 환경 세팅에 관한 글입니다. 

1. Emacs Client 는 OSX 에서 사용하는 Aquamacs 입니다. Ruby-mode 는 내장된 것을 사용함 
2. 색 배정은 Color Theme 를 사용합니다. 
3. Rails Helper 는 Rinari 를 사용합니다. 
4. snippet 기능은 yasnippets 를 사용합니다. 
5. ruby-mode 에서 complete 기능은 ri-emacs 기능을 사용합니다. 


Aquamacs 는 설치가 되어 있다고 가정합니다. 

1. ~/Library/Preferences/Aquamacs Emacs/http://github.com/zhannes/Aquamacs-Emacs 에서 받은 파일들을 복사해 넣습니다. 



2. ~/Library/Preferences/Aquamacs Emacs/Preferences.el 을 열어서 다음과 같이 수정해 줍니다. 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load ruby-mode.el                 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;loads ruby-mode.el - activate with M-x ruby-mode
(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-mode.el")

; loads ruby mode when a .rb file is opened.
(autoload 'ruby-mode "ruby-mode" "Major mode for editing ruby scripts." t)
(setq auto-mode-alist  (cons '("\\.rb$" . ruby-mode) auto-mode-alist))
;;(setq auto-mode-alist  (cons '(".rhtml$" . html-mode) auto-mode-alist))
(setq auto-mode-alist  (cons '(".rhtml$" . rhtml-mode) auto-mode-alist))

(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-electric.el")


rhtml 확장자 파일이면 rhtml-mode 로 연결될 수 있도록 수정합니다.




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load emacs-code-browser           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;Allows syntax highlighting to work, among other things

;; ;These lines are required for ECB
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/eieio")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/speedbar")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/semantic")
;; (setq semantic-load-turn-everything-on t)
;; (require 'semantic-load)
;; ; This installs ecb - it is activated with M-x ecb-activate
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ecb")
;; (require 'ecb)

ECB 관련해서는 전부 comment 처리합니다. ECB 버젼이 낮아서 최신 버젼을 깔아주는 것이 좋겠더군요. 
 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load rails-mode.el                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; needed for rails mode
(require 'snippet)
(require 'find-recursive)
; The rails require needs to go after ECB
; otherwise it loads a new incompatible speedbar
; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails")

; blik.it's rhtml enhancements
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/rhtml/")
;;(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails/")
(require 'nxml-mode)
;; (require 'rhtml-mode)
;;(require 'rails)


기존에 포함된 emacs-rails 헬퍼부분을 comment 처리합니다. 이렇게 하는 이유는 Rinari 를 헬퍼로 사용하기 위해서 입니다. 

rhtml-mode 는 사용하는 모드인데 .emacs 에서 최신버젼으로 설정해 주기 위해서 기존 것을 로딩하는 부분을 comment 처리해 줍니다.

;(load "~/Library/Preferences/Aquamacs Emacs/nxhtml/autostart.el")

nxhtml-mode 는 검은색을 바탕으로 하는 색 테마에는 어울리지가 않더군요. comment 처리해 줍니다. 


(cua-mode t) -> (cua-mode nil) 

로 수정해 줍니다. 

3. ri-emacs 는 http://rubyforge.org/projects/ri-emacs/ 에서 다운 받아서 "~/.emacs.d/ri-emacs" 안에 내용을 풀어줍니다. 
.emacs 안에 


(add-to-list 'load-path "~/.emacs.d/ri-emacs")
(autoload 'ri "~/.emacs.d/ri-emacs/ri-ruby.el" nil t)
(setq ri-ruby-script (expand-file-name "~/.emacs.d/ri-emacs/ri-emacs.rb"))


와 같이 세팅해 줍니다. 

4.yasnippet 은 http://code.google.com/p/yasnippet/ 에서 다운 받을 수 있습니다. 오른쪽 중간쯤에 필요한 파일들이 나열되어 있는데요. yasnippet-bundle-0.6.1c.el.tgz 파일을 받아서 푸시고 "~/.emacs.d/plugins" 에 복사합니다. 그리고 .emacs 파일에 



(add-to-list 'load-path
             "~/.emacs.d/plugins")
(require 'yasnippet-bundle)

와 같이 지정해 주면 됩니다. 

5. rhtml-modehttp://github.com/eschulte/rhtml 에서 다운 받아서 "~/.emacs.d/rhtml" 에 압축을 풀어 줍니다. 그리고 .emacs 에 



(add-to-list 'load-path
             "~/.emacs.d/rhtml")
(require 'rhtml-mode)
(add-hook 'rhtml-mode-hook
          (lambda () (rinari-launch)))

와 같이 설정해 줍니다. 

6. yasnippet 모드에서 Rails 를 지원하기 위한 추가 팩입니다. http://github.com/eschulte/yasnippets-rails 에서 다운 받아서  "~/.emacs.d/plugins" 에 풀어줍니다
. 그리고 .emacs 에 


(load-file "~/.emacs.d/plugins/setup.el")
(add-hook 'rinari-minor-mode-hook
          #'(lambda ()
              (setq yas/mode-symbol 'rails-mode)))

와 같이 설정해 줍니다. 

7. ECB 파일을 따로 설치해 줍니다. 굳이 따로 설명을 드리지 않겠습니다. 다만 제 .emacs 파일에서는 



(add-to-list 'load-path "~/.emacs.d/cedet/common")
(add-to-list 'load-path "~/.emacs.d/cedet/contrib")
(require 'cedet)

(add-to-list 'load-path
                   "~/.emacs.d/ecb")
(require 'ecb)


이렇게 설정되어 있습니다. 

8. Rinari 모드를 설치해야 합니다. 이건 ELPA 방식으로 설치하는 것이 가장 편합니다. *scrach* 버퍼로 이동해서 모드를 lisp-interaction-mode 로 변경합니다. 그리고 다음 과 같은 내용을 버퍼에 삽입합니다. 



(let ((buffer (url-retrieve-synchronously
      "http://tromey.com/elpa/package-install.el")))
  (save-excursion
    (set-buffer buffer)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (eval-region (point) (point-max))
    (kill-buffer (current-buffer))))

내용 마지막에 커서를 위치시키고 C-xC-e 를 눌러서 버퍼를 실행시킵니다. 그리고 M-x package-list-packages 를 실행합니다. 


인스톨하고 싶은 패키치에 마우스나 커서를 위치시키고 (여기서는 Rinari) 'I' 키로 인스톨 대상을 확인 시키고 'X' 키로 인스톨을 실행합니다. 

9. html.erb 확장자 를 rhtml 모드로 동작시키기 위해서 .emacs 에 다음과 같은 내용을 채워 줍니다. 



(setq auto-mode-alist
      (cons '("\\.rhtml$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.erb$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.html\\.erb$" . rhtml-mode)
   auto-mode-alist))

10. ruby-mode 에서 yasnippets 확장을 쓰기 위해서 TAB 키에 바인딩된 함수 기능을 풀어줍니다. .emacs 에서 다음 과 같은 내용을 추가합니다. 


(add-hook 'ruby-mode-hook
          #'(lambda ()
              (define-key ruby-mode-map (kbd "TAB") nil)
              (define-key ruby-mode-map [(control return)]  'ri-ruby-complete-symbol)
              (define-key ruby-mode-map [(shift return)]  'ri-ruby-show-args)
              ))



여기까지 세팅을 하면 기본적으로 잘 동작이 될 것입니다. yasnippets 에 자주 쓰는 기능들을 등록시켜가면서 (추후에 몇개 공개하겠음) Rails 개발을 하면 Emacs 사용자로서 보람도 느끼고 상용 Rails 개발툴이 안 부러울 것입니다. (왜냐하면 우리는 이맥션 이기 때문이지요 캬오!!) 그런데 발생하는 중대한 문제가 있습니다. rhtml-mode 로 yasnippets 로 사용하다 보면 erb block 안에 { } <-- 이게 들어갈 때 문제가 발생하기 시작합니다. unclosed tag 에러가 발생하기 시작하는데 이거 수정이 매우 어렵습니다. 처음에 정규표현식을 바꿔서 수정해 볼까 하다가, 나중에는 포기하고 그냥 rhtml-mode 자체를 수정하기로 결심했습니다. 

rhtml-mode.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-mode.el 에 있습니다. 


(define-derived-mode rhtml-mode
;  html-mode "RHTML"
  html-helper-mode "RHTML"
  "Embedded Ruby Mode (RHTML)"
  (interactive)
  (abbrev-mode)
  ;; disable if you don't want it...
  (rhtml-activate-fontification))

html-mode "RHTML" 을 
html-helper-mode  "RHTML" 로 수정

rhtml-mode 가 html-mode 에서 상속받은 형태의 mode 였는데 이것을 html-helper-mode 에서 상속받게 바꾸어 주기만 하면 됩니다. 에 게다가 바꾸는 김에 조금 더 바꿔줍니다. rhtml-mode 일때 erb-block 을 highlight 시키는데 이게 눈에 상당히 거슬립니다. 

rhtml-fonts.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-fonts.el 에 있습니다. 



(defface erb-face
  '((((class color) (min-colors 88) (background dark))
;     :background "#383838")
    :background "black")
    (((class color) (min-colors 88) (background light))
     ;; :background "azure")
     :background "snow2")
    (((class color) (min-colors 16) (background dark))
     :background "blue3")
    (((class color) (min-colors 16) (background light))
     :background "azure")
    (((class color) (min-colors 8))
     :background "blue")
    (((type tty) (class mono))
     :inverse-video t)
    (t :background "gray"))
  "Default inherited face for ERB tag body"
  :group 'rhtml-faces)

이렇게 수정해 줍니다. 즉 

:background "#383838") 을 
:background "black") 으로 수정

자 이제 마지막으로 erb block 이 시작되는 델리미터까지 깔끔하게 수정해 주기로 합니다. rhtml-fonts.el 파일에서 



;; (defface erb-out-delim-face
;;   `((((background dark)) :foreground "#aaffff" :background "#383838")
;;     (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
;;   "Basic face for Ruby embedded into HTML"
;;   :group 'rhtml-faces)

(defface erb-out-delim-face
  `((((background dark)) :foreground "#aaffff" :background "black")
    (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
  "Basic face for Ruby embedded into HTML"
  :group 'rhtml-faces)


전체를 comment 처리한 것으로 보이지만 :background "#383838" 부분을 "black" 으로 바꿔주기만 한 것입니다. 

조금 길지만 충분히 따라할 만한 설정입니다. 즐겁게 Rails 코딩하세요 ~ 



책에서 나온대로 레일즈 프로젝트 따라하기 중인데 

depot> rake db:migrate 

명령을 치라는 부분을 치니, gem 에 mysql 이 기본으로 포함이 안되어 있다는 메시지가 발생 하더군요. 
시키는 대로 해도 몇몇 에러가 발생하더군요. 이래저래 돌아다니면서 알아보니 

처음에 발생한 에러 메시지 입니다. 

(in /Users/crazia/Documents/workspace/rails/depot)
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
no such file to load -- mysql

그래서 

gem install mysql 

라고 입력했습니다. 

crazia$ gem install mysql
WARNING:  Installing to ~/.gem since /Library/Ruby/Gems/1.8 and
 /usr/bin aren't both writable.
WARNING:  You don't have /Users/crazia/.gem/ruby/1.8/bin in your PATH,
 gem executables will not run.
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
ERROR: Failed to build gem native extension.

이런 에러가 발생하더군요. 

그래서 ~/.bash_profile 에 

export PATH=$PATH:/opt/local/bin:/opt/local/sbin:/usr/local/mysql/lib:~/.gem/ruby/1.8/bin

추가해줬습니다. 그리고 다시  gem install mysql 을 실행 

 gem install mysql
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
ERROR: Failed to build gem native extension.

다시 에러 입니다. 잠깐의 구글링을 통해서 헤더랑 라이브러리를 지정해줘야 하는것 같더군요. 

gem install mysql -- --with-mysql-include=/usr/local/mysql/include/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-config=/usr/local/mysql/bin/mysql_config 

이런식으로 입력하니 다시 에러 찾아보니 스노우레오파드의 아키텍쳐를 명시해줘야 한다고 합니다. 

env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-include=/usr/local/mysql/include/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-config=/usr/local/mysql/bin/mysql_config 

이렇게 등록해 주면 됩니다. mysql 은 스노우레오파드에 디폴트로 포함되어 있는 버젼입니다. 

그리고 다시  rake db:migrate 

crazia$ rake db:migrate
(in /Users/crazia/Documents/workspace/rails/depot)

성공!! 즐겁게 레일즈 코딩하세요 ~









Rails 개발을 시작하게 된 김에, 스타일을 텍스트 메이트 스타일로 바꿔줬습니다. 레일즈 개발하기에는 Textmate 가 정말 좋다고 하더군요. (텍메 살돈은 없으니 그냥 손에 익은 이맥스로 쿨럭..)



+ Recent posts