2011-04-09 52 views
22

RVM可以做的一件事是在您更改目录时寻找.rvmrc,并根据该文件的内容更改当前的Ruby版本和gemset。只要您切换到该目录并相应地输出消息,它就会进行此更改。当您更改目录时,RVM如何检测?

它如何检测当前工作目录中的更改?我可以想象一个非常简单的方法:运行一个作为当前用户运行的守护进程,并不断检查pwd的结果。但我肯定这不是它所做的。

另一种方法可能是别名cd更改目录,还检查了.rvmrc和改变gemsets如果是这样的指示。

是否有用于更改目录的Unix系统挂钩,或者是否存在RVM正在使用的其他一些技巧?

+1

由于密码是每个进程,而不是每个用户,我不认为守护进程会工作。 – 2011-04-09 13:27:05

+0

@TomAnderson绝对正确。我对这个概念感到困惑。 :) – 2015-03-23 14:17:59

+0

顺便说一句,我现在使用chruby,并[已定制其目录监视行为以适合我在zsh中的使用情况](http://nathanmlong.com/2015/01/optimizing-chruby-for-zsh/) – 2015-03-23 14:19:08

回答

26

[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手册中输入read more about Bash startup files

The Ruby enVironment Manager (RVM)被写入并主要针对Bash shell。RVM将在ZSH shell,它允许你一个cd动作之后函数调用添加工作。这是解决这一任务的最好方法。所以,如果你的shell允许的话,一定要用这个方法。 RVM确实。

对于一个广泛的例子,你可以look at RVM's cd functionality on GitHub

RVM利用此功能,装载per-project (directory, really) .rvmrc files以及为用户提供配置各种挂钩的能力。你可以阅读更多关于RVM's hooks on the documentation website

+0

真棒 - 谢谢你回答我的问题! – 2011-04-18 12:53:17

0

它只是在需要解析gemset的内容时才查看当前目录吗?有没有什么能让你认为它是在改变目录的同时,而不是根据需求呢?

+0

我澄清了我的问题:只要我更改为使用'.rvmrc'的项目目录,它就会更改我当前的Ruby版本和gemset,并输出一条消息,说明它现在使用的是什么。 – 2011-04-11 13:26:12

+0

我明白了。这是巧妙但可怕的行为! – 2011-04-11 17:23:00

4

当您安装RVM你必须添加:

[-s $ HOME/.rvm /脚本/ RVM] & & 源$ HOME/.rvm /脚本/ RVM

到你的shell配置(通常是.bashrc.zshrc)。

这将加载RVM当你启动一个shell,然后覆盖你的cd命令和检查.rvmrc S作为你走动。有关更多详细信息,请参阅$HOME/.rvm/scripts/cd的内容。

+0

为我安装的RVM自动完成了.bash_profile – Bogatyr 2013-04-11 16:55:52