Eu sou novo no tecido e estou tendo problemas para fazê-lo funcionar. Instalei-o via pip3 primeiro quando tentei executá-lo, estava recebendo o comando 'fab' não encontrado, eventualmente o encontrei em /home/me/.local/bin/fab2.
Este é o lugar correto?
Segundo sempre que eu corro assim
/home/me/.local/bin/fab2 version
eu recebo
(2, 3, 1)
2.3.1
No idea what 'version' is!
import fabric
if hasattr(fabric, '__version__'):
# For fabric2
print(fabric.__version_info__)
print(fabric.__version__) # for a version tuple
else:
# for fabric1
from fabric.api import *
print(env.version)
/home/me/.local/bin/fab2 é o local correto?
O que é 'Não faço ideia do que é 'versão'!' por que aparece?
Ele está procurando uma função de tarefa chamada "versão" em um arquivo fab e não encontra uma. fab --version
faz o que você quer lá.
$HOME/.local/bin/
é onde o pip instala "entrypoints" executáveis quando você pip install --user ...
- você pode adicionar $HOME/.local/bin
ao seu PATH
(por exemplo, no seu ~/.bash_profile
ou ~/.bashrc
). Se você fizesse sudo pip install Fabric
(sem --user
), colocaria o ponto de entrada executável em /usr/local/bin/
que provavelmente já está em seu PATH
. Ou você pode provavelmente python -m fabric <fab args>
em vez disso.
Oi obrigado tecido --versão funcionou muito bem
Alterei o script para ficar assim
def hello():
print("Hello world!")
Ainda estou recebendo 'Não faço ideia do que seja 'olá'!'
Existe um tutorial para o tecido 2 Estou tendo um tempo enorme para conseguir qualquer coisa para trabalhar nele. Eu encontrei o tutorial para fabric 1.14, mas isso não é muito útil no momento, pois nenhuma das importações funciona. Estou assumindo que o tecido 2 lida com isso de maneira diferente.
se eu executo com fab ou fab2 recebo o mesmo erro
Eu tenho tecido em /home/me/tecido
@ajmcateer , eu também tive esse problema. O problema é que o novo método de tarefa de malha (como discutido aqui - http://docs.fabfile.org/en/1.14/usage/tasks.html) é usar o decorador @task . O exemplo equivalente "Hello World" é:
from fabric import task
<strong i="8">@task</strong>
def hello(ctx):
print("Hello World")
A execução de 'fab hello' produz a saída esperada.
Eu tenho tanto from fabric import task
quanto @task
decorador.
Ainda estou recebendo o erro 'Sem ideia ..'.
Detalhes adicionais :
$ fab --version
Fabric 2.3.1
Paramiko 2.4.1
Invoke 1.1.1
$ python --version
Python 3.6.2
$ more tasks.py
#!/usr/bin/env python
from fabric import task
<strong i="10">@task</strong>
def build(c):
import pdb; pdb.set_trace()
print("Building!")
$ fab build -f tasks.py
No idea what 'build' is!
@mandravaze , posso confirmar que funcionou para mim, embora eu tenha uma tarefa em fabfile.py (acho que esse é o problema no seu env) e uso a seguinte linha para chamar
construção $fab
acho que esse é o problema no seu env
Como posso solucionar problemas? Quais dados adicionais você gostaria?
Quais arquivos você tem neste local? Eu acho que build() deve estar no fabfile.py, se estiver lá, talvez seu fab pegue o arquivo errado ...
@mandarvaze em seu comando fab build -f tasks.py
existem várias confusões.
fab -f tasks.py build
-f
é para um arquivo de configuração, não para uma coleção de tarefas, esse é o sinalizador -c
, como fab -c tasks build
(sem extensão ".py"!)inv
(invoke), se o arquivo com as tarefas for tasks.py no diretório atual, você não precisa especificá-lo. Para fab
(fabric), se o arquivo com as tarefas for fabfile.py no diretório atual, você não precisa especificá-lo.@ploxiln fab -c tasks build
funciona. 👍
Obrigado.
@ajmcateer , eu também tive esse problema. O problema é que o novo método de tarefa de malha (como discutido aqui - http://docs.fabfile.org/en/1.14/usage/tasks.html) é usar o decorador @task . O exemplo equivalente "Hello World" é:
from fabric import task <strong i="9">@task</strong> def hello(ctx): print("Hello World")
A execução de 'fab hello' produz a saída esperada.
desculpe pela pergunta estúpida, mas por que precisamos de 'ctx' arg? O que é isso?
no fabric 2 você precisa deste ctx
para realmente executar comandos no sistema correto, por exemplo, ctx.run("hostname")
Se o seu problema é que você recebe esse erro para um argumento de tarefa, pode ser que você não esteja passando o argumento em seu formato correto, mas como você nomeou sua tarefa.
fab mytask --task-name value
não
fab mytask --task_name value
Eu percebo que isso não é o caso, mas desde que acabei aqui, vou deixar isso para qualquer outra pessoa que tenha o mesmo problema.
no fabric 2 você precisa deste
ctx
para realmente executar comandos no sistema correto, por exemplo,ctx.run("hostname")
Primeiramente obrigado pelas informações!!
Infelizmente, devo dizer que o Fabric 2 é completamente obtuso. A lógica do 2.x é muito contra-intuitiva e realmente não parece haver muitos bons tutoriais básicos sobre como usá-lo. Por exemplo, talvez esteja faltando alguma coisa, mas veja a lógica de 1.xe a qualidade deste tutorial 1.x: https://docs.fabfile.org/en/1.14/tutorial.html. Então procure um tutorial equivalente para 2.x ....
Não é à toa que existe uma porta não oficial de 1.xe eles estão - bastante ousados - chamando-o de 3.x
Apenas um FYI geral que _nenhum_ desse detalhe sobre a necessidade do decorador @task
, ter que passar um objeto de contexto etc. está presente na seção "Visão geral e tutorial" da documentação pública do Fabric: https://docs .fabfile.org/en/1.8/tutorial.html
Eu era um usuário pesado do Fabric 1 e ingenuamente assumi que este passo a passo estava me ensinando novas semânticas para o Fabric 2 antes de encontrar esse tíquete de problema. Isso pode realmente desencorajar a adoção, pois os documentos são essencialmente enganosos para as pessoas que estão embarcando.
Não tenho certeza de como você acabou nessa página, você deve estar olhando https://docs.fabfile.org/en/2.5/getting-started.html
Obrigado por isso! Talvez ajudaria futuros viajantes a lançar um cabeçalho gordo "DEPRECATED" nos documentos da série 1. Tenho certeza de que naveguei até isso a partir de um dos principais resultados do Google ou dos documentos oficiais do site do fabric e, em ambos os casos, acho que, embora o primeiro não seja algo que a equipe do Fabric possa controlar, suspeito que muitos adotantes em potencial estejam incorrendo essa frustração e pode se beneficiar de ser alertado para a necessidade de encontrar os documentos atualizados (os documentos oficiais hospedados em Python seguem um padrão semelhante iirc).
Isso pode realmente desencorajar a adoção, pois os documentos são essencialmente enganosos para as pessoas que estão embarcando.
Novo usuário do Fabric. Eu pesquisei "Fabric Python" e cliquei no link que dizia "Visão geral e tutorial". Sim, achei isso realmente confuso e estou bastante surpreso por ter conseguido seguir o caminho errado tão cedo no processo.
Suspeito que muitos adotantes em potencial estão incorrendo nessa frustração e podem se beneficiar de serem alertados sobre a necessidade de encontrar os documentos atualizados (os documentos oficiais hospedados em Python seguem um padrão semelhante iirc).
sim.
Além disso, observe que esta é a página de resultados:
Esses links recuados podem ser configurados se você controlar o domínio. Talvez seja possível limpar o material 1.x dos resultados da pesquisa, além de adicionar um cabeçalho "DEPRECATED" neles.
Acabei de tropeçar neste e finalmente consegui corrigi-lo. Não há nada de errado com o tecido.
Aqui está o que eu fiz.
╰─$ fab --version
Fabric 2.5.0
Paramiko 2.7.2
Invoke 1.4.1
No meu fabfile.py
:
from fabric.tasks import task
<strong i="11">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title:", title)
Se eu apenas executar a tarefa:
╰─$ fab test
'test' did not receive required positional arguments: 'title'
Isso significa que está esperando o title
como argumento.
Então, passe o argumento:
fab test title="hello world"
Saída:
ctx: <your current context. Don't worry about it>
title: title=hello world
Mas esteja ciente de que o argumento passado será uma string. Certifique-se de dividir com =
.
Por exemplo:
<strong i="28">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title type:", type(title))
print("title:", title)
print("title value:", title.split("=")[1])
corre:
fab test title="hello world"
Saída:
ctx: ...
title type: <class 'str'>
title: title=hello world
title value: hello world
Comentários muito úteis
@ajmcateer , eu também tive esse problema. O problema é que o novo método de tarefa de malha (como discutido aqui - http://docs.fabfile.org/en/1.14/usage/tasks.html) é usar o decorador @task . O exemplo equivalente "Hello World" é:
A execução de 'fab hello' produz a saída esperada.