6

我是 python 开发人员,最常使用buildout来管理我的项目。在这种情况下,我不需要运行任何命令来激活我的依赖项环境。

但是,有时我会使用 virtualenv,因为这种特殊情况的构建很复杂。

最近我开始玩红宝石。并注意到非常有用的功能。当我cd进入项目文件夹时,环境会自动改变。它在某种程度上与rvmnad.rvmrc文件有关。

我只是想知道是否有办法将某些脚本挂接到不同的 bash 命令上。所以我可以workon environment_name自动cd进入项目文件夹。

所以逻辑很简单:

当你cd在项目中时folder_name,脚本应该运行workon folder_name

4

3 回答 3

14

Unix shell 的一个特点是它们可以让你创建shell 函数,这很像其他语言中的函数。它们本质上是命名的命令组。例如,您可以编写一个名为的函数mycd,首先运行cd,然后运行其他命令:

function mycd () {
    cd "$@"
    if ... ; then
        workon environment
    fi
}

"$@"扩展为您传递给的参数mycd;因此mycd /path/to/dir将调用cd /path/to/dir。)

作为一种特殊情况,shell 函数实际上取代了同名的内置命令。因此,如果您命名您的函数cd,它将cd在您运行时运行而不是内置函数cd。在这种情况下,为了让函数调用内置函数来cd执行实际的目录更改(而不是调用自身,导致无限递归),它可以使用 Bash 的builtin内置函数来调用指定的内置命令。所以:

function cd () {
    builtin cd "$@"    # perform the actual cd
    if ... ; then
        workon environment
    fi
}

(注意:我不知道你识别项目目录的逻辑是什么,所以我留给...你填写。如果你在评论中描述你的逻辑,我会相应地编辑。)

于 2013-07-12T17:44:55.530 回答
2

我认为您正在寻找两件事之一。

autoenv是一个相对简单的工具,可以为您创建相关的 bash 函数。它本质上是按照 ruakh 的建议做的,但是您可以使用它而不必知道 shell 是如何工作的。

virtualenvwrapper充满了工具,可以更轻松地构建更智能的 bash 函数版本——例如,即使您cd进入其子目录之一而不是基础,也可以切换到 venv,或者跟踪存储在gitor中的 venv hg,或者……查看提示和技巧页。

食谱autoenv,展示了一些将两者结合使用的绝妙方法。

于 2013-07-12T18:26:10.000 回答
0

刚刚在virtualenvwraper这个话题的描述中找到

它准确地描述了我需要什么。

于 2013-07-12T18:27:02.633 回答