Ruby gem 만들기(Make ruby gem)

요즘 좀 정신없이 지내다보니 벌써 10월이네요.. 써놓은 글도 마침 없는 상태인지라 이번에도 간략한 글 작성할까 합니다. (아 10월의 첫글이 메모글이라니…) 많은 ruby application 들이 단순히 코드를 clone 해서 쓰는 형태보단 gem으로 패키징하여 배포하고 사용하는 형태를 가집니다.

오늘은 ruby gem 만드는 방법에 대해 메모해둘까 합니다.

gem, how to make?

ruby gem을 만들 때 아래와 같은 구조를 유지하며 만드는게 좋다고 합니다(http://ruby-korea.github.io/rubygems-guides/patterns/#consistent-naming )

├── appname.gemspec    # gem 정보
└── lib                # gem이 될 파일의 path, 보통은 lib로
    └── appname.rb     # gem이 될 파일, 단일 파일로 만드는걸 추천한다고 하네요

우선 이런 구조로 만들어보죠. 앱 디렉토리에서 gemspec과 lib 하위경로를 추가해줍시다.

#> mkdir lib
#> cp your_app.rb ./lib/your_app.rb

구조는 만들었고 gem에 대한 설명이 들어가는 gemspec을 만듭시다.

#> vim ftc.gemspec
Gem::Specification.new do |s|
  s.name        = 'ftc'
  s.version     = '0.0.1'
  s.date        = '2018-04-28'
  s.summary     = "file to clipboard"
  s.description = "File to Clipboard gem"
  s.authors     = ["hahwul"]
  s.email       = 'hahwul@gmail.com'
  s.files       = ["lib/ftc.rb"]
  s.homepage    =
    'https://www.hahwul.com'
  s.license       = 'MIT'
end

대충 항목보면 어떤 내용이 들어가야할지 감 오실겁니다. 다 작성하면 gem command로 빌드해줍시다.

#> gem build ftc.gemspec
  Successfully built RubyGem
  Name: ftc
  Version: 0.0.1
  File: ftc-0.0.1.gem

빌드가 완료되면 gem 파일이 생성됩니다.

#> ls
drwxr-xr-x  4 root   root   4096 Oct  4 01:00 ./
drwxrwxr-x 16 hahwul hahwul 4096 Sep 15 23:26 ../
-rw-r--r--  1 root   root   4096 Oct  4 01:01 ftc-0.0.1.gem
-rw-r--r--  1 root   root    367 Oct  4 01:00 ftc.gemspec

일반 gem 파일 설치하는 것과 동일한 방식으로 install이 가능합니다.

#> gem install ftc-0.0.1.gem
Successfully installed ftc-0.0.1
Parsing documentation for ftc-0.0.1
Installing ri documentation for ftc-0.0.1
Done installing documentation for ftc after 0 seconds
1 gem installed

보통은 gem 자체가 라이브러리 역할도 많이하기 때문에 코드를 구성할 때 installer 개념이 아니라 library 만든다고 생각 후 적용하시는게 좋아보입니다. 또한 gem 네이밍 관련해서도 규칙이 있으니 아래 reference 부분 참고해주세요 :) (이게 gem 저장소에 올라가는 경우에는 중요할듯합니다..(아무래도 이름이 겹치는것도 문제가 되고, 이름에서 기능을 알 수 있어야하기 떄문이죠)

Reference

http://ruby-korea.github.io/rubygems-guides/make-your-own-gem/ http://ruby-korea.github.io/rubygems-guides/name-your-gem/ http://ruby-korea.github.io/rubygems-guides/patterns/#consistent-naming