RubyGems Navigation menu
가이드

“어떻게”보단 “왜죠”나 “이런 미친”에 대한 내용들

RubyGems 개발 팀은 여러 해에 걸쳐 많은 지원 요청을 받고 있습니다. 다음은 사용자의 경험과 관계없이 자주 나오는 질문들입니다.

또한 RubyGems Support 사이트와 #rubygems IRC에서도 질문에 대답하고 있습니다. support 사이트에서 찾을 수 있는 정보에는 이런 것들이 있습니다.

--user-install로 gem을 설치했더니 명령어를 사용할 수 없습니다.

--user-install 옵션을 사용할 때, RubyGems은 gem을 ~/.gem/ruby/1.9.1 같은 홈 디렉터리 안의 디렉터리에 설치합니다. 설치된 gem의 명령어는 ~/.gem/ruby/1.9.1/bin에 들어갑니다. 여기에 설치된 프로그램을 사용하려면, PATH 환경 변수에 ~/.gem/ruby/1.9.1/bin을 추가할 필요가 있습니다.

예를 들어, bash를 사용한다면 ~/.bashrc 파일에 이 코드를 넣어서 디렉터리를 PATH에 추가할 수 있습니다.

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

~/.bashrc 파일에 이 코드를 추가한 다음, 셸을 다시 시작해야 변경 사항이 반영됩니다. 새로운 터미널 윈도우를 열거나 이미 열린 윈도우에서 exec $SHELL을 실행해서 재시작 할 수 있습니다.

어떻게 자동으로 다운로드된 gem 코드를 신뢰할 수 있나요?

인터넷에서 설치한 다른 코드와 같은 방법으로 신뢰하면 됩니다. 궁극적으로는, 할 수 없습니다. 당신은 사용하는 gem의 소스를 알아야 할 책임이 있습니다. 보안이 중요한 곳에서는 알려진 좋은 gem만 사용해야 합니다. 그리고 가능하면 gem 코드의 보안 감사는 직접 수행하시는 게 좋습니다.

루비 커뮤니티는 앞으로 공개 키 인프라를 사용해 gem 코드를 보다 안전하게 하는 방법에 대해 토론하고 있습니다. 이 논의의 진행 상활을 보시려면, GitHub에 있는 rubygems-trust 조직을 방문하세요.

require 'some-gem'이 실패하죠?

모든 라이브러리가 gem의 이름과 require 해야 할 파일 이름이 엄격하게 일치하지는 않습니다. 먼저 파일이 일치하는지 확인하셔야 합니다.

$ gem list RedCloth

*** LOCAL GEMS ***

RedCloth (4.1.1)
$ ruby -rubygems -e 'require "RedCloth"'
/Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- RedCloth (LoadError)
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
  from -e:1
$ gem contents --no-prefix RedCloth | grep lib
lib/case_sensitive_require/RedCloth.rb
lib/redcloth/erb_extension.rb
lib/redcloth/formatters/base.rb
lib/redcloth/formatters/html.rb
lib/redcloth/formatters/latex.rb
lib/redcloth/formatters/latex_entities.yml
lib/redcloth/textile_doc.rb
lib/redcloth/version.rb
lib/redcloth.rb
$ ruby -rubygems -e 'require "redcloth"'
$ # success!

맞는 파일을 require 했다면, 아마 gemruby와는 다른 루비를 사용하고 있을 수 있습니다.

$ which ruby
/usr/local/bin/ruby
$ gem env | grep 'RUBY EXECUTABLE'
   - RUBY EXECUTABLE: /usr/local/bin/ruby1.9

이 인스턴스에서는 설치된 루비가 두 개입니다. 그래서 gem이 사용하는 루비가 ruby와 다르죠. 이는 symlink를 조정해서 바르게 고칠 수 있습니다.

$ ls -l /usr/local/bin/ruby*
lrwxr-xr-x  1 root  wheel       76 Jan 20  2010 /usr/local/bin/ruby@ -> /usr/local/bin/ruby1.8
-rwxr-xr-x  1 root  wheel  1213160 Jul 15 16:36 /usr/local/bin/ruby1.8*
-rwxr-xr-x  1 root  wheel  2698624 Jul  6 19:30 /usr/local/bin/ruby1.9*
$ ls -l /usr/local/bin/gem*
lrwxr-xr-x  1 root  wheel   76 Jan 20  2010 /usr/local/bin/gem@ -> /usr/local/bin/gem1.9
-rwxr-xr-x  1 root  wheel  550 Jul 15 16:36 /usr/local/bin/gem1.8*
-rwxr-xr-x  1 root  wheel  550 Jul  6 19:30 /usr/local/bin/gem1.9*

아마 irb도 같은 조치가 필요할 겁니다.

왜 gem에서 파일을 로드할 때 require가 false를 반환하나요?

로드가 맞게 되었다면 보통 require는 true를 반환합니다. gem에서 파일을 로드할 때 require가 false를 반환한다면 무엇이 잘못된 걸까요?

잘못된 건 없습니다. 음, 있을 순 있어요. 하지만 걱정할 정도는 아닙니다.

require 메소드가 false를 반환하는 것은 에러가 아닙니다. 그냥 그 파일은 이미 로드되어 있다는 의미입니다.

RubyGems에는 gem이 활성화될 때(예를 들면 선택될 때) 파일을 자동으로 로드하는 기능이 있습니다. 비활성화된 gem에서 파일을 require할 때, RubyGems 소프트웨어는 그 gem을 활성화합니다. 활성화하는 동안, 모든 자동으로 로드된 파일들이 로드됩니다.

그래서 require 문은 실제로 파일을 로드하는 작업을 수행하고, 이는 gem을 활성화할 때 이미 자동으로 로드되어, 이 구문은 false를 반환하게 됩니다.