Desejo executar meu script de malha localmente, o que, por sua vez, efetua login no servidor, alterna o usuário para implantar, ativa os projetos .virtualenv, que altera o diretório do projeto e emite um git pull.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Normalmente, uso o comando workon do virtualenvwrapper, que origina o arquivo de ativação e o arquivo de pós-atividade me colocará na pasta do projeto. Nesse caso, parece que, como a malha é executada dentro do shell, o controle é transferido para a malha, então não posso usar a fonte do bash incorporada para '$ source ~ / .virtualenv / myvenv / bin / enable'
Alguém tem um exemplo e explicação de como eles fizeram isso?
python
virtualenv
fabric
automated-deploy
Thomas Schreiber
fonte
fonte
workon
comoprefix
?Respostas:
No momento, você pode fazer o que eu faço, o que é desleixado, mas funciona perfeitamente bem * (esse uso pressupõe que você esteja usando o virtualenvwrapper - o que deveria ser - mas você pode substituir facilmente na chamada de "origem" que você mencionou , se não):
Desde a versão 1.0, o Fabric possui um
prefix
gerenciador de contexto que usa essa técnica para que você possa, por exemplo:* É provável que existam casos em que o uso da
command1 && command2
abordagem pode explodir em você, como quandocommand1
falha (command2
nunca será executada) ou secommand1
não for escapado adequadamente e contiver caracteres especiais do shell e assim por diante.fonte
workon
é desconhecido porsh
. Como podemos dizer ao tecido para usar o bash?source venv/bin/activate
. É mais fácil e funciona imediatamente.workon
é uma dependência adicional e, mesmo que esteja instalado, é necessário adicioná-lo.bashrc
- muito complicado para implantações de malha.Como uma atualização da previsão do bitprophet: Com o Fabric 1.0, você pode usar o prefix () e seus próprios gerenciadores de contexto.
fonte
source
é desconhecido porsh
. Como podemos dizer ao tecido para usar o bash?.
vez desource
cd()
quando você está especificando totalmente o caminho paraactivate
nosprefix()
?prefix()
não parece cd lá - veja esses documentos que fazem o mesmo. Queremoscd
lá para que, quandoyield
executarmos outros comandos (pip freeze
no meu exemplo), esses comandos possam ser relativos a esse diretório.Estou apenas usando uma função simples do invólucro virtualenv () que pode ser chamada em vez de run (). Ele não usa o gerenciador de contexto do cd, portanto, os caminhos relativos podem ser usados.
fonte
virtualenvwrapper
pode tornar isso um pouco mais simplesUsando a abordagem do @ nh2 (essa abordagem também funciona ao usar
local
, mas apenas para instalações do virtualenvwrapper em queworkon
está$PATH
, em outras palavras - Windows)Ou implemente seu arquivo fab e execute-o localmente. Essa configuração permite ativar o virtualenv para comandos locais ou remotos. Essa abordagem é poderosa porque funciona em torno
local
da incapacidade de executar .bashrc usandobash -l
:fonte
Esta é minha abordagem ao usar
virtualenv
com implantações locais.Usando o gerenciador de contexto path () da malha, você pode executar
pip
oupython
com binários do virtualenv.fonte
Obrigado a todas as respostas postadas e gostaria de adicionar mais uma alternativa para isso. Há um módulo, fabric-virtualenv , que pode fornecer a função como o mesmo código:
fabric-virtualenv faz uso
fabric.context_managers.prefix
, o que pode ser uma boa maneira :)fonte
Se você deseja instalar os pacotes no ambiente ou executar comandos de acordo com os pacotes existentes no ambiente, encontrei esse truque para resolver meu problema, em vez de escrever métodos complexos de fabric ou instalar novos pacotes do sistema operacional:
Dessa forma, talvez você não precise ativar o ambiente, mas pode executar comandos no ambiente.
fonte
Aqui está o código para um decorador que resultará no uso do Ambiente Virtual para qualquer chamada de execução / sudo:
e, em seguida, para usar o decorador, observe que a ordem dos decoradores é importante:
fonte
Essa abordagem funcionou para mim, você pode aplicar isso também.
Supondo que
venv
seja seu diretório virtual de env e adicione esse método sempre que apropriado.fonte