Использование 2 вызовов cd () в одном и том же выполнении Fabric

1

Недавно я попросил объяснений по поводу поведения сценария Fabric, которого я не мог понять. Теперь, когда я понимаю, как работает Fabric, я все еще пытаюсь найти решение своей проблемы :-)

В принципе, я хотел бы cd() вызов 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 строки внутри уникального prefix(), разделенного символом && но мне по-настоящему кажется хакерским:

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

Есть ли другой/более элегантный способ сделать это? "Более элегантно", я имею в виду решение, которое будет использовать методы Fabric вместо моего взлома.

Конечно, для этого конкретного примера я мог бы использовать virtualenvwrapper, но потом он становится слишком специфичным и не работает для других подобных случаев, не основанных на virtualenv.

Теги:
virtualenv
fabric
cd

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") идеи из docs docs

EDIT:

Как обновление моего ответа: почему бы просто не использовать два абсолютных пути?

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

Ткань выполнит команду, аналогичную тому, что вы пытались ввести:

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

Затем он будет работать

./somefile.py
  • 0
    Спасибо за помощь @Greg. Я отредактировал мои фрагменты, чтобы уточнить причину, по которой мне нужен cd в другом каталоге. Вы правы, в данном случае это было бесполезно, но это происходит из-за того, что я упростил контекст, чтобы избежать множества бесполезных строк во фрагментах. Ваш первый фрагмент работает при условии, что первый cd является абсолютным, а второй - относительным. Если они оба абсолютны, первый игнорируется, отсюда и моя проблема.
  • 0
    Пожалуйста, дайте мне знать, если это не прояснит ситуацию или вам нужна дополнительная информация. Поскольку существует возможность вкладывать cd диски при относительном пути, я все еще надеюсь, что решение для абсолютных путей существует ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню