RVM과 rbenv는 실제로 어떻게 작동합니까?
저는 RVM과 rbenv가 실제로 어떻게 작동하는지 관심이 있습니다.
분명히 그들은 다른 버전의 루비와 보석 세트를 교환합니다. 하지만 이것은 어떻게 이루어집니까?저는 그들이 단순히 심볼릭 링크를 업데이트하고 있다고 생각했지만, 코드를 깊이 연구했습니다(그리고 바시에 대한 제 지식은 피상적이라는 것을 인정해야 합니다). 그들은 이 이상의 일을 하고 있는 것처럼 보입니다.
간단한 설명: rbenv는 사용자의 환경을 파악함으로써 작동합니다.PATH
개념은 간단하지만 세부 사항에 악마가 있습니다. 아래에 전체 특종이 있습니다.
먼저, rbenv는 모든 명령에 대한 심을 생성합니다.ruby
,irb
,rake
,gem
Ruby 즉 설된모버치즉의 Ruby, 의모파에대에 파일에 입니다.~/.rbenv/versions/*/bin
이 프로세스를 재해싱이라고 합니다.새 버전의 Ruby를 설치하거나 명령을 제공하는 보석을 설치할 때마다rbenv rehash
모든 새 명령이 shimming되는지 확인합니다.
디렉토리에 있습니다.~/.rbenv/shims
는 userbenv 앞에 됩니다.PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
그럼 언제든지 도망갈 때ruby
이 shebang인 를 합니다.#!/usr/bin/env ruby
에서 당의운체찾것입니다을가제를 찾을 수 .~/.rbenv/shims/ruby
대신 합니다.ruby
설치했을 수 있는 실행 파일입니다.
로, 각심차례실작은는크다스니입트립되행은로▁that▁each다▁runs▁in니를 실행합니다.rbenv exec
, 그니러 Rbenv가당길에있다면신의,▁so면다있▁r,에,irb
는 와동합다니등다에 합니다.rbenv exec irb
,그리고.ruby -e "puts 42"
는 와동합다니등다에 합니다.rbenv exec ruby -e "puts 42"
.
그rbenv exec
명령은 사용할 Ruby 버전을 파악한 다음 해당 버전에 해당하는 명령을 실행합니다.방법:
- 에 약에만.
RBENV_VERSION
환경 변수가 설정되어 있으며, 해당 값에 따라 사용할 Ruby 버전이 결정됩니다. - 에 "" " " " " " 이 포함되어 있는
.rbenv-version
, 파일의 을 설정하는 데 사용됩니다.RBENV_VERSION
환경 변수입니다. - 없는
.rbenv-version
디렉터리에 는 각 하여 현재디 있파일는는다, rbenv리검색합니위렉를터상각디에렉리를 ..rbenv-version
파일 시스템의 루트에 도달할 때까지 파일을 저장합니다.하나가 발견되면 그 내용은 다음을 설정하는 데 사용됩니다.RBENV_VERSION
환경 변수입니다. - 한다면
RBENV_VERSION
되지 않고, . rbenv을사여정하니고려다하의 을 사용하여 .~/.rbenv/version
java. - 버전이 지정되지 않은 경우, rbenv는 "시스템" Ruby를 사용하기를 원한다고 가정합니다. 즉, rbenv가 경로에 없으면 실행되는 버전이 무엇이든 상관없습니다.
은 (Ruby 전버다같수있프다습니설할정이과음로은젝트별))로 설정할 수 있습니다.)rbenv local
령명, 이명생니다를 ..rbenv-version
파일을 현재 디렉토리에 저장합니다. 가지로찬마,로,rbenv global
는 명이수다니를 합니다.~/.rbenv/version
file으)로 됩니다.
으로 RBENV_VERSION
변수, 추가, rbenv 추가~/.rbenv/versions/$RBENV_VERSION/bin
의 네에 PATH
" 그다음전명및인실행다니"로 전달된 명령과 합니다.rbenv exec
Voila!
후드 아래에서 정확히 어떤 일이 발생하는지 자세히 알아보려면 설정을 시도하십시오.RBENV_DEBUG=1
Ruby 명령을 실행합니다.rbenv가 실행하는 모든 Bash 명령은 단말기에 기록됩니다.
Rbenv는 버전 전환에만 관심이 있지만, 성공적인 플러그인 에코시스템은 Ruby 설치에서 환경 설정, "젬셋" 관리, 자동화에 이르기까지 모든 작업을 지원합니다.
IRC 지원이 Ruby 버전 전환과 어떤 관련이 있는지 잘 모르겠고, rbenv는 지원이 필요 없을 정도로 간단하고 이해할 수 있도록 설계되었습니다.하지만 도움이 필요한 경우 몇 번 클릭하면 문제 추적기와 Twitter를 찾을 수 있습니다.
공개:저는 rbenv, ruby-build, rbenv-vars의 저자입니다.
저는 심층 기사를 썼습니다: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
기본적인 차이점은 셸 환경이 변경되는 위치입니다.
- RVM: 루비를 바꾸면 바뀝니다.
- rbenv: Ruby/gem 실행 파일을 실행하면 변경됩니다.
또한 RVM은 Rubies를 관리하는 것뿐만 아니라 다른 툴보다 훨씬 많은 기능을 갖추고 있습니다(RVM 및 rbenv 외에도 https://twitter.com/ #!/mpapis/status/171714479502401).
Freenode 서버의 "#rvm" 채널에서 IRC를 즉시 지원하는 것을 잊지 마십시오.
위의 우수한 답변을 요약하면 RVM과 rbenv의 실질적인 주요 차이점은 Ruby 버전을 선택했을 때입니다.
rbenv:
에 Rubyrbenv와 추가합니다.를 할 때ruby
명령줄에서 심이 대신 실행됩니다("심"이라고도 하며 경로에서 먼저 오기 때문). 또는 환경 변수를 ..rbenv_version
위임할 Ruby 버전을 알려주는 파일입니다.
RVM:
을 호출하여 Ruby 할 수 .rvm use
게다가, 그것은 또한 그것을 재정의합니다.cd
시스템 명령.당신이cd
를 .rvmrc
일파 안에 , 코드부.rvmrc
파일이 실행됩니다.이것은 루비 버전을 설정하거나 원하는 다른 모든 것을 설정하는 데 사용할 수 있습니다.
기타 차이점:
물론 다른 차이점들도 있습니다.RVM은 즉시 사용할 수 있는 기능을 제공하는 반면, rbenv는 약간의 해킹만 더 필요로 합니다(하지만 많이 필요하지는 않습니다).두 가지 모두 문제에 대한 기능적 해결책입니다.
가장 큰 차이점은 루비가 언제 어떻게 바뀌느냐에 있는 것 같습니다.루비가 전환됩니다.
- 수동으로(rvm 사용) 또는 디렉토리 변경 중에 자동으로
- rbenv의 경우 루비 명령이 실행될 때마다 자동으로
된 RVM 합니다.cd
by Ruby 명령 및 령명동수택선준기및준▁command기▁and▁of명▁manualrvm use
rbenv는 모든 기본 루비 명령에 대해 래퍼 또는 "심"을 사용하여 루비를 선택하는 기본 메커니즘으로 사용합니다.RVM은 Gem, Rake, Ruby와 같은 기본 명령줄 도구를 위한 래퍼를 만듭니다.예를 들어 CronJobs(http://rvm.io/integration/cron/ 참조)에서 사용되지만 Ruby 버전을 전환하는 기본 메커니즘은 아닙니다.
따라서 두 방법 모두 명령을 덮어쓰고 래퍼를 사용하여 올바른 Ruby 버전을 "자동으로" 선택합니다.rvm은 cd와 같은 셸 명령을 재정의합니다. rbenv는 루비, irb, 레이크 및 보석과 같은 모든 기본 루비 명령을 재정의합니다.
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before
대략적으로 다음을 제공합니다.
< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc
그리고 다음과 같이 추가됩니다.
$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin
$PATH
언급URL : https://stackoverflow.com/questions/9394338/how-do-rvm-and-rbenv-actually-work
'bestsource' 카테고리의 다른 글
안드로이드 레이아웃에서 텍스트에 밑줄을 그을 수 있습니까? (0) | 2023.06.03 |
---|---|
원격 데스크톱 연결 검색 중 (0) | 2023.06.03 |
SQLITE SQL 덤프 파일을 POSTGRESQL로 변환 (0) | 2023.06.03 |
Python 3.x 정수의 경우 비트 시프트보다 2배 더 빠릅니까? (0) | 2023.06.03 |
Android에서 EditText의 텍스트 길이를 제한하는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.03 |