2009. 2. 2. 00:58
rubyscript2exe는 ruby 스크립트를 패킹해서 하나의 실행파일로 만들어주는 아주 유용한 툴이다. ruby는 스크립트 언어기 때문에 인터프리터가 필수고, 따라서 배포할 때에 루비 인터프리터와 함께 배포되어야 하는데다가 추가적인 gem을 사용했을 경우 전부를 한번에 패킹하기는 미친듯이 귀찮아진다. 게다가 대상이 윈도이기라도 하면 정말 여러가지로 골치가 아프지 않을 수 없다. 이러한 문제들을 해결할 수 있는 것이 rubyscript2exe라는 툴이다.

현재 ruby 1.8.6 patchlevel 287 이상에서 rubyscript2exe 0.5.3은 정상적으로 동작하지 않고 있다 -_-... $0이 freeze되어 있는데 수정하려 하는 문제인 것 같다. 하지만 ruby 홈페이지에서 원클릭 인스톨러로 받을 수 있는 윈도용 ruby 1.8.6 patchlevel 111에서는 문제가 없기 때문에 윈도 환경에서의 사용에는 큰 문제가 없을 것 같다.

이 것은 gem이기 때문에 gem 명령어를 통해서 간단하게 설치할 수 있다.
# gem install rubyscript2exe
그리고 대상 스크립트를 실행파일로 변환하고 싶을 때는 간단하게
$ rubyscript2exe target.rb
라고 치면 시간이 조금 걸리면서 완료된다.

그런데 다 좋은데... ruby-gnome2를 사용한 경우 글자 렌더링 엔진을 빼먹어서 글자가 하나도 찍히지 않는 불상사가 발생하는 문제점이 있다.

이 문제는 왜 발생하냐면, rubyscript2exe는 해당 루비 스크립트를 같이 패킹된 ruby 인터프리터를 사용하여 실행시키는데 여기에 포함된 GTK 라이브러리가 동작 할 때 필요한 파일이 같이 패킹이 되지 않았기 때문에 파일을 찾을 수 없어 발생하는 문제점이다.

이를 해결하기 위해서는 원리적으론, GTK 라이브러리에서 참조하는 파일들을 같이 패킹하여 실행시 언패킹되도록 하면 된다.

ruby가 설치된 곳이 C:\ruby 라고 한다면, ruby-gnome2를 설치하면 C:\ruby\lib\GTK 에 GTK가 설치된다. 이 곳에 있는 etc, share, lib 파일이 동시 패킹 대상이 된다.

rubyscript2exe는 인자로 루비스크립트가 아닌 디렉토리를 지정하게 되면 해당 디렉토리 안에 있는 모든 파일을 자동적으로 함께 패킹함과 동시에 그 안의 init.rb를 실행시키도록 구성되어 있다. 또한, RUBYSCRIPT2EXE 모듈 내의 method를 통해 여러 정보를 얻을 수 있는데, appdir은 패킹했던 파일들이 풀려 있는 디렉토리를 지칭한다. 이 것을 통해, 같이 패킹한 자료들에 접근할 수 있게 된다. 또 is_compiled? 라는 메소드가 있어, 이 스크립트가 rubyscript2exe를 통해 실행되고 있는지 아니면 일반적인 실행인지 체크할 수 있어 이 둘을 이용해 필요한 파일들을 준비시킬 수 있다.

rubyscript2exe는 패킹된 실행파일을 실행시킬 때, 대략 다음과 같은 트리구조를 갖도록 풀린다.
(홈 디렉토리)\eee\eee.application.nnn (nnn은 숫자)
└ app: 패킹했던 파일들을 풀어둔다.
└ bin: ruby 인터프리터와 필요한 dll들을 담아둔다.
└ lib: 사용한 gem이나 같이 패킹되지 않았지만 require를 통해 로드된 다른 ruby 스크립트들이 위치한다.
필요한  파일들인 etc 디렉토리와 lib, share 디렉토리들을 적당히 같이 패킹한 다음 프로그램 도입부에서 appdir을 통해 적당히 풀어주면 필요한 설정 파일들을 접근할 수 있게 되어 정상동작으로 한 걸음을 내딛을 수 있을 것이다.

그런데, 이렇게 해 주면 테마는 적용이 되어 이쁘게 나오는데 아직 한글이 정상적으로 나오지 않는다. 개발중인 머신에서는 잘 나오지만 말이다. 여기서 속으면 안된다.

이번엔 왜 안되느냐, 바로 pango의 글자 렌더링 엔진의 설정이 틀려버렸기 때문이다. etc 안에 설정파일이 존재하는데 열어보면 왜 문제가 되는지 바로 알 수 있을 것이다. 아마 ruby-gnome2가 설치된 경로로 절대경로가 되어 렌더링 엔진 dll파일들이 적혀 있는 것을 볼 수 있을 것인데, 이 것을 업데이트할 때는 pango-querymodules라는 유틸리티를 쓰는 것이 편하다. 이건 GTK 설치된 디렉토리의 bin에서 찾을 수 있다.

이제 이런 것들을 반영하여 언패킹때의 코드를 넣어주면 해결! 인데, 말로만 설명하면 와닿지 않기 때문에 gmemrb 에서 사용한 init.rb를 첨부하였다. 여기는 필요한 파일을 패킹/언패킹하기 위해 tar 파일을 썼으며(압축은 어차피 rubyscript2exe에서 한번 해 주기 때문에 생략했다) tar 파일을 핸들링하기 위해 archive-tar-minitar를 사용하였다. 하지만 전반적으로 이해하는덴 어렵지 않을 것이다.

require 'rubyscript2exe'
require 'archive/tar/minitar'
require 'fileutils'
if RUBYSCRIPT2EXE.is_compiled?
  Archive::Tar::Minitar.unpack(RUBYSCRIPT2EXE.appdir + "/env.tar", RUBYSCRIPT2EXE.appdir + "/..")
  Archive::Tar::Minitar.unpack(RUBYSCRIPT2EXE.appdir + "/locale.tar", RUBYSCRIPT2EXE.exedir)
  cmd = "\"#{RUBYSCRIPT2EXE.appdir}/../bin/pango-querymodules\" > \"#{RUBYSCRIPT2EXE.appdir}/../etc/pango/pango.modules\""
  cmd = cmd.gsub(/\//, "\\") if RUBY_PLATFORM =~ /win/
  system(cmd)
end

require 'gmemrb.rb'

GMemRB::GMemRB.new.show_all
Gtk.main

if RUBYSCRIPT2EXE.is_compiled?
  FileUtils.rm_rf RUBYSCRIPT2EXE.exedir + "/locale"
end
중요한 부분은 RUBYSCRIPT2EXE.is_compiled?로 묶여진 if 블록이다.

gmemrb의 경우 gettext를 쓰기 때문에 locale이 필요해서 실행파일이 위치한 곳에는 locale을 풀고 언패킹된 곳에는 gtk를 풀도록 되어 있다. 또한 pango-querymodules를 system 명령을 통해 실행시켜 그 결과를 바로 etc/pango/pango.modules 에 쓰도록 해서 위치를 업데이트하도록 되어 있다.

아마 저걸 참고로 해서 직접 작성해보면 가장 적절하게 느껴지는 형태로 쓸 수 있지 않을까 싶다.

rubyscript2exe 공식 홈페이지

'프로그래밍 > Ruby' 카테고리의 다른 글

공개 한글 폰트 다운로더  (0) 2009.11.16
Ruby-GNOME2 0.18 One-Click Installer for Windows  (0) 2009.10.20
rubyscript2exe 로 ruby-gnome2를 이용한 어플 패킹하기  (0) 2009.02.02
GMemRB 공개  (0) 2009.02.01
Ruby-GD2 in WIN32  (0) 2008.12.23
Ruby-GNOME2  (0) 2008.12.09
2009. 2. 1. 05:02
단어 연습 프로그램 GMemRB 1.0을 공개합니다.

특징으로는, multi-platform을 지원하는 ruby-gnome2로 작업하였기 때문에 OS를 크게 안따진다는 것이 있습니다.

그리고 단어장 정보를 text파일로 출력하기 때문에 급할 때 수정하기가 편하고, Microsoft Excel 등의 스프레드시트 프로그램에서 읽을 수 있도록 탭으로 구분된 표로 저장하고 있습니다.

윈도용의 경우, rubyscript2exe를 사용하여 독립 실행형으로 만들었습니다. 복잡하게 ruby 설치하고 ruby-gnome2 설치하고 gem 설치하고 할 필요 없이, 실행파일만 실행하면 실행되도록 했습니다.

ruby-gnome2의 경우 rubyscript2exe와 상성이 안 좋아서 만드는데 조금 고생도 했던거 같습니다 -_-

내일이나 조만간에 ruby-gnome2를 사용한 경우 rubyscript2exe를 이용하여 독립실행형 어플리케이션을 만드는 방법에 대해 포스팅 하도록 하지요. ruby-gnome2 홈페이지에 있는 내용은 “틀렸습니다”-_-...

홈페이지는 http://gmemrb.esperanza.kr/ 또는 http://plus17.postech.ac.kr/gmemrb 입니다. 도움말 페이지인데, 여기서 다운받을 수 있습니다.

'프로그래밍 > Ruby' 카테고리의 다른 글

Ruby-GNOME2 0.18 One-Click Installer for Windows  (0) 2009.10.20
rubyscript2exe 로 ruby-gnome2를 이용한 어플 패킹하기  (0) 2009.02.02
GMemRB 공개  (0) 2009.02.01
Ruby-GD2 in WIN32  (0) 2008.12.23
Ruby-GNOME2  (0) 2008.12.09
Ruby on Rails  (0) 2008.05.28