1

我最近要求解释我无法理解的 Fabric 脚本行为。现在我了解了 Fabric 的工作原理,我仍在努力寻找解决问题的方法 :-)

基本上,我想嵌套一个cd()调用,一个prefix()调用(将从当前路径加载一些东西)和另一个cd()调用最终run()评论。

我想到的最好的例子如下:

with cd('/my/virtualenv/dir/'):
  with prefix('source bin/activate'):
    with cd('/my/project/dir/'):
      run('pip install -r requirements.txt')
      run('./run_something')

这是行不通的,因为它cd('/my/project/dir')会优先于cd('/my/virtualenv/dir'),这将被上下文完全覆盖。

我能看到的唯一解决方案是将前 3 行连接到一个 uniqueprefix()中,用 s 分隔,&&但它对我来说真的很骇人:

with prefix('cd /my/virtualenv/dir/ && source bin/activate && cd /my/project/dir/'):
  run('pip install -r requirements.txt')
  run('./run_something')

是否有另一种/更优雅的方式来做到这一点?“更优雅”是指使用 Fabric 方法而不是我的 hack 的解决方案。

当然,对于这个特定的示例,我可以使用 virtualenvwrapper,但是它变得过于具体,并且不适用于其他不基于 virtualenv 的类似情况。

4

1 回答 1

1

我已经在我自己的机器上完成了以下工作:

with cd("~/somedir"), prefix("source ~/.virtualenvs/venv/bin/activate"):
    with cd("anotherdir"):
        run("ls")

我真正的问题是,一旦激活了 virtualenv,为什么需要 cd 进入另一个目录?如果您只想使用 pip 安装某些东西,这应该可以很好地满足您的目的

with cd('/my/virtualenv/dir/'), prefix('source bin/activate'):
   run('pip install something')

顺便说一句,我从面料文档with cd("dir"), prefix("stuff")中得到了这个想法

编辑

作为对我的回答的更新:为什么不只使用两个绝对路径?

with cd("/abs/path/to/my/file"), prefix("source /abs/path/to/my/venv/bin/activate"):
    run("pip install something")
    run("./somefile.py")

Fabric 将执行类似于您尝试输入的命令:

Executed: /bin/bash -l -c "cd /abs/path/to/my/file && source ~/abs/path/to/my/venv/bin/activate && pip install something"

然后它将运行

./somefile.py
于 2013-09-22T07:39:45.293 回答