Недавно я попросил объяснений по поводу поведения сценария 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.
Для работы на моей машине я получил следующее:
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
cd
в другом каталоге. Вы правы, в данном случае это было бесполезно, но это происходит из-за того, что я упростил контекст, чтобы избежать множества бесполезных строк во фрагментах. Ваш первый фрагмент работает при условии, что первыйcd
является абсолютным, а второй - относительным. Если они оба абсолютны, первый игнорируется, отсюда и моя проблема.cd
диски при относительном пути, я все еще надеюсь, что решение для абсолютных путей существует ...