当您更改目录时,RVM如何检测?

时间:2011-04-09 13:21:51

标签: rvm internals

RVM可以做的一件事是注意当你更改目录,寻找.rvmrc,并根据该文件的内容更改当前的Ruby版本和gemset。一旦您更改到该目录并相应地输出消息,它就会进行此更改。

它如何检测当前工作目录中的更改?我可以想象一种非常粗暴的方法:运行以当前用户身份运行的守护程序并继续检查{{{{ 1}}。但我确信这不是它的作用。

另一种方法可能是别名pwd来更改目录,但也检查cd并更改gemsets(如果有指示)。

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

3 个答案:

答案 0 :(得分:26)

  

[RVM]如何检测当前工作目录中的更改?

这完全取决于shell甚至shell版本。如所建议的,实现此目的的最简单方法是通过定义同名函数来覆盖cd。请务必调用内置的cd函数,否则会导致非常讨厌或非常有趣的副作用(取决于透视图)。

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

通过将其放入文本源文件并获取文件,您可以将此自定义cd功能加载到源文件的会话中。

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

如果您希望此功能始终对用户帐户中的交互式shell有效,请将功能定义放入~/.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的更多信息。

答案 1 :(得分:4)

安装rvm时,必须添加:

  

[[-s $ HOME / .rvm / scripts / rvm]]&&   来源$ HOME / .rvm / scripts / rvm

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

当你启动一个shell然后覆盖你的cd命令并在你移动时检查.rvmrc时,它会加载RVM。有关详细信息,请参阅$HOME/.rvm/scripts/cd的内容。

答案 2 :(得分:0)

只要需要解析gemset的内容,它是否只查看当前目录?有没有什么能让你认为它与改变目录同时进行,而不是按需求?