Как RVM обнаруживает, когда вы изменили каталоги? - PullRequest
24 голосов
/ 09 апреля 2011

Одна вещь, которую может сделать RVM, это заметить, когда вы изменили каталоги, найдите .rvmrc и измените текущую версию Ruby и набор гемов в соответствии с содержимым этого файла.Он вносит это изменение, как только вы переходите в этот каталог, и выдает соответствующее сообщение.

Как он обнаруживает изменение в текущем рабочем каталоге? Я могу представить чрезвычайно грубый способДелаем это: запускаем демон, который работает как текущий пользователь и продолжает проверять результаты pwd.Но я уверен, что это не то, что он делает.

Другой подход может заключаться в том, чтобы использовать псевдоним cd для изменения каталогов, а также для проверки .rvmrc и изменения наборов гемов, если это указано.Есть ли системная ловушка Unix для смены каталогов, или есть какой-то другой прием, который использует RVM?

Ответы [ 3 ]

26 голосов
/ 14 апреля 2011

Как [RVM] обнаруживает изменение в текущем рабочем каталоге?

Это полностью зависит от оболочки и даже версии оболочки.Как было предложено, самый простой способ сделать это - переопределить cd, определив функцию с тем же именем.Обязательно вызовите встроенную функцию cd, иначе вы вызовете очень неприятные или очень забавные побочные эффекты (в зависимости от перспективы).

cd() {
  builtin cd $*
  echo "Changed directories from '${OLDPWD}' to '${PWD}'."
}

Поместив это в исходный текстовый файл и получив файл, вы можете загрузить эту пользовательскую функцию cd в сеанс, использующий файл.

wayneeseguin$ cd /tmp
Changed directories from '/home/wayneeseguin' to '/tmp'.

Если вы хотите, чтобы это всегда действовало для интерактивных оболочекв вашей учетной записи пользователя либо поместите определение функции в ~/.bash_profile.В качестве альтернативы вы можете получить исходный текстовый файл, в котором вы сохранили функцию, из ~/.bash_profile.Вы можете узнать больше о файлах запуска Bash в руководстве по Bash.

Ruby enVironment Manager (RVM) написан и предназначен в основном для Bashоболочки .RVM будет работать в оболочке ZSH , которая позволяет добавлять вызовы функций после действия cd.На сегодняшний день это лучший способ подойти к решению этой задачи.Так что, если ваша оболочка это позволяет, обязательно используйте этот метод.RVM делает.

Для обширного примера вы можете посмотреть на функциональность CD RVM на GitHub .

RVM использует эту функцию для загрузки для каждого проекта (каталогдействительно) .rvmrc файлы , а также предоставляя пользователям возможность настраивать различные хуки.Подробнее о хуках RVM вы можете прочитать на сайте документации .

4 голосов
/ 11 апреля 2011

При установке rvm необходимо добавить:

[[-s $ HOME / .rvm / scripts / rvm]] && исходный код $ HOME / .rvm / scripts / rvm

в конфигурацию вашей оболочки (обычно .bashrc или .zshrc).

Это загружает RVM, когда вы запускаете оболочку, которая затем переопределяет вашу команду cd и проверяет наличие .rvmrc s при перемещении. См. Содержимое $HOME/.rvm/scripts/cd для получения более подробной информации.

0 голосов
/ 09 апреля 2011

Он просто смотрит на текущий каталог, когда ему нужно разрешить содержимое набора гемов? Есть ли что-то, что заставляет вас думать, что это происходит параллельно с изменением каталогов, а не по требованию?

...