Fabric: "Não faço ideia do que *algo* seja!" depois de correr fabric2

Criado em 16 ago. 2018  ·  18Comentários  ·  Fonte: fabric/fabric

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?

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" é:

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.

Todos 18 comentários

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.

  • argumentos para o próprio fab devem vir antes do primeiro nome da tarefa, como fab -f tasks.py build
  • o sinalizador -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"!)
  • Para 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:

Screenshot from 2020-11-16 22-43-32

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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

acdha picture acdha  ·  4Comentários

Grazfather picture Grazfather  ·  4Comentários

supriyopaul picture supriyopaul  ·  4Comentários

26huitailang picture 26huitailang  ·  3Comentários

zhaoguixu picture zhaoguixu  ·  5Comentários