rails3 프로젝트에서 gem을 제거하는 가장 좋은 방법은 무엇입니까?


102

Gemfile을 통해 번 들러를 사용하여 모든 gem을 설치했습니다. 나는 Gemfile에서 gem을 삭제하고 'bundle install'을 실행하면 삭제 된 gem이 제거 될 것이라고 생각했습니다. 번 들러 도움말 파일을 살펴 봤는데, 내가 아는 한 gem을 제거 할 방법이 없습니다.

모든 것에 gem uninstall x를 사용합니까? 번 들러를 혼동할까요?

답변:


136

Bundler는 앱의 루트 디렉터리에서 시작되므로 앱이 작동하는 데 필요한 모든 gem이 있는지 확인합니다.

    gem uninstall gem_name 

위에서 언급했듯이 번 들러를 실행할 때마다 종속성을 다시 확인합니다.

수정-2014 년 12 월 24 일

나는 사람들이이 질문에 계속해서 내가 약간의 것을 추가하기로 결정했습니다. 내가 준 대답은 보석을 글로벌하게 유지하는 경우였습니다. 특정 프로젝트로 범위가 지정된 gem 세트를 유지하려면 rbenv 또는 rvm과 같은 gem 관리자를 사용하는 것이 좋습니다.

즉, 전역 수준에서 gem이 설치되지 않으므로 프로젝트의 Gemfile에서 하나를 제거하고 번들을 다시 실행하면 분명히 프로젝트에로드되지 않습니다. 그런 다음 bundle clean (프로젝트 디렉토리 사용)을 실행하면 Gemfile (동일한 디렉토리에 있음)에서 한 번 설치되었던 모든 gem이 시스템에서 제거되지만 현재로서는 더 이상 여기에 나열되지 않습니다 .... 긴 이야기 짧게-사용하지 않는 보석을 제거합니다.


98

번 들러가 설치 한 gem을 제거합니다 :

bundle exec gem uninstall GEM_NAME

이것은 던짐에 유의하십시오

오류 : gem을 실행하는 동안 ... (NoMethodError) # <Bundler :: SpecSet : 0x00000101142268>에 대해 정의되지 않은 메서드`delete '

그러나 보석은 실제로 제거됩니다. 다음에 실행할 bundle install때 gem이 다시 설치됩니다.


10
RVM 사용자의 경우 : 특정 프로젝트에 대한 gemset을 설정 한 경우이 방법을 사용해야합니다. 실행 gem uninstall pg대신에 들러의의 글로벌 / 시스템 레벨 gemset에서 페이지를 제거합니다 프로젝트 폴더에서
에릭 후

이것이 당신이 말하는 오류입니까? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833 2012

번들 컨텍스트에서 수행하는 경우 +1. 그 오류가 발생하지 않았 으면 좋겠습니다! 더 나은 방법은 -f update gemname을 번들로 만들 수 있기를 바랍니다.
pduey

2
RVM gemset을 사용하는 경우 @EricHu가 아닙니다. RVM gemset 안에 gem install xxx를 사용하여 gem을 설치할 때마다 그대로 유지되므로 RVM gemset에서 일반 gem uninstall xxx를 수행하면 시스템이 아닌 해당 gemset에 설치된 gem이 제거됩니다.
Esteban Feldman 2012

@EstebanFeldman 맞습니다. 지난 11 개월 동안 RVM이 변경된 것이라고 생각합니다.
Eric Hu

21

최신 버전의 번 들러에서는 정리 작업을 사용할 수 있습니다.

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

편집하다:

전역 gemset을 사용하는 경우 권장되지 않습니다 (예 : 모든 프로젝트가 보석을 같은 위치에 유지). 하지만 각 프로젝트의 gem을 분리하는 방법은 거의 없습니다.

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle install다음 옵션 중 하나 사용 : --deployment또는 --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

사용하면 bundle clean --force현재 프로젝트에서 사용하지 않지만 다른 프로젝트에서 사용하는 많은 보석이 제거되었습니다. 내가 길을 정해야 했나? 그냥 bundle clean"--path가 설정 또는 --force가 설정되어있는 경우에만 번들 깨끗한 사용할 수"를 반환합니다. 그러나이 --path옵션은 도움말에도 나타나지 않습니다.
Dennis

1
@Dennis 맞습니다. clean는 글로벌 gemset를 사용하는 경우 작업은 정말 이해가되지 않습니다. 그러나 원하는 경우 각 프로젝트는 개별 보석을 가질 수 있습니다. rvm gemsets ( rvm.io/gemsets/basics ) 를 통해 또는 ( bundler.io/v1.3/man/bundle-install.1.html )--pathbundle install
Evgenia

1

gem을 제거하려면 'gem uninstall gem_name'을 사용해야합니다.

시스템 전체에 gem을 설치 한 경우 (예 : sudo 번들 설치) gem에 속한 바이너리를 제거하려면 -n 옵션을 사용하여 바이너리 디렉토리를 지정해야 할 수 있습니다. 예를 들면

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

번 들러 ( "sudo bundler exec gem uninstall unicorn")를 통해 유니콘 젬을 수동으로 제거한 다음 다시 번들링 ( "sudo bundle install")하여이 문제를 해결하는 것 같습니다.

위의 수정이 작동하는 것처럼 보이지만 왜 발생했는지 확실하지 않습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.