Fabric: "Keine Ahnung, was *etwas* ist!" nach dem Laufen von fabric2

Erstellt am 16. Aug. 2018  ·  18Kommentare  ·  Quelle: fabric/fabric

Ich bin neu in Stoff und habe Probleme, es zum Laufen zu bringen. Ich habe es zuerst über pip3 installiert, als ich versuchte, es auszuführen, bekam ich Befehl 'fab' nicht gefunden, ich fand es schließlich in /home/me/.local/bin/fab2.

Ist dies der richtige Ort?

Zweitens, wenn ich es so laufen lasse

/home/me/.local/bin/fab2 version

Ich bekomme

(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)

Ist /home/me/.local/bin/fab2 der richtige Speicherort?
Was ist 'Keine Ahnung, was 'Version' ist!' warum wird es angezeigt?

Hilfreichster Kommentar

@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:

from fabric import task

<strong i="8">@task</strong>
def hello(ctx):
  print("Hello World")

Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.

Alle 18 Kommentare

Es sucht nach einer Aufgabenfunktion namens "Version" in einer Fabfile und findet keine. fab --version macht dort was du willst.

In $HOME/.local/bin/ installiert pip ausführbare "Einstiegspunkte", wenn Sie pip install --user ... - Sie könnten $HOME/.local/bin zu Ihren PATH hinzufügen (z. B. in Ihrem ~/.bash_profile oder ~/.bashrc ). Wenn Sie sudo pip install Fabric (ohne --user ) ausgeführt haben, würde dies den ausführbaren Einstiegspunkt in /usr/local/bin/ setzen, der sich wahrscheinlich bereits in Ihrem PATH befindet. Oder Sie können stattdessen wahrscheinlich python -m fabric <fab args> .

Hallo danke Stoff --Version hat super funktioniert

Ich habe das Skript so geändert, dass es so aussieht

def hello():
    print("Hello world!")

Ich bekomme immer noch 'Keine Ahnung, was 'Hallo' ist!'

Gibt es ein Tutorial für Fabric 2. Ich habe eine verdammt gute Zeit, irgendetwas darin zum Laufen zu bringen. Ich habe das Tutorial für Fabric 1.14 gefunden, aber das ist im Moment nicht wirklich hilfreich, da keiner der Importe funktioniert. Ich gehe davon aus, dass Fabric 2 anders damit umgeht.

Wenn ich mit fab oder fab2 laufe, bekomme ich den gleichen Fehler

Ich habe Stoff in /home/me/fabric

@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:

from fabric import task

<strong i="8">@task</strong>
def hello(ctx):
  print("Hello World")

Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.

Ich habe sowohl from fabric import task als auch @task decorator.
Ich bekomme immer noch den Fehler "Keine Ahnung ...".

Zusätzliche Details :

$ 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 , ich kann bestätigen, dass es für mich funktioniert hat, obwohl ich eine Aufgabe in fabfile.py habe (ich denke, das ist das Problem in Ihrer env) und ich verwende die folgende Zeile, um anzurufen
$ fabelhaft gebaut

Ich denke, dies ist das Problem in Ihrer Umgebung

Wie kann ich Fehler beheben? Welche zusätzlichen Daten möchten Sie?

Welche Dateien haben Sie an diesem Ort? Ich denke, build() sollte in der fabfile.py sein, wenn es dort ist, nimmt Ihr Fab vielleicht eine falsche Datei auf ...

@mandarvaze in deinem Befehl fab build -f tasks.py gibt es mehrere Verwirrungen.

  • Argumente für Fab selbst müssen vor dem ersten Aufgabennamen stehen, wie fab -f tasks.py build
  • das Flag -f ist für eine Konfigurationsdatei, nicht für eine Aufgabensammlung, das ist das Flag -c , wie fab -c tasks build (keine „.py“-Erweiterung!)
  • Wenn für inv (aufrufen) die Datei mit den Aufgaben „tasks.py“ im aktuellen Verzeichnis ist, müssen Sie sie nicht angeben. Wenn die Datei mit den Aufgaben für fab (Fabric) fabfile.py im aktuellen Verzeichnis ist, müssen Sie sie nicht angeben.

@ploxiln fab -c tasks build funktioniert. 👍
Danke.

@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:

from fabric import task

<strong i="9">@task</strong>
def hello(ctx):
  print("Hello World")

Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.

Entschuldigung für die dumme Frage, aber warum brauchen wir 'ctx' arg? Was ist es?

In Fabric 2 benötigen Sie dieses ctx , um Befehle tatsächlich auf dem richtigen System auszuführen, z. B. ctx.run("hostname")

Wenn Ihr Problem darin besteht, dass Sie diesen Fehler für ein Aufgabenargument erhalten, kann es sein, dass Sie das Argument nicht im richtigen Format übergeben, sondern so, wie Sie Ihre Aufgabe benannt haben.

fab mytask --task-name value

nicht

fab mytask --task_name value

Mir ist klar, dass dies nicht zum Thema passt, aber da ich hier gelandet bin, überlasse ich dies jedem anderen, der dasselbe Problem hat.

In Fabric 2 benötigen Sie dieses ctx , um Befehle tatsächlich auf dem richtigen System auszuführen, z. B. ctx.run("hostname")

Erstmal danke für die Infos!!

Leider muss ich sagen, dass Fabric 2 völlig stumpf ist. Die Logik von 2.x ist sehr kontraintuitiv und es scheint wirklich nicht viele gute grundlegende Tutorials zu geben, wie man es benutzt. Beispiel: Vielleicht fehlt mir etwas, aber schauen Sie sich die Logik von 1.x und die Qualität dieses 1.x-Tutorials an: https://docs.fabfile.org/en/1.14/tutorial.html. Dann schau dich nach einem gleichwertigen Tutorial für 2.x um....

Kein Wunder, dass es eine inoffizielle Portierung von 1.x gibt und sie - ziemlich dreist - 3.x nennen

Nur eine allgemeine FYI, dass _keine_ dieser Details bezüglich der Notwendigkeit des @task -Dekorators, der Übergabe eines Kontextobjekts usw. im Abschnitt "Übersicht und Tutorial" der öffentlichen Dokumentation für Fabric vorhanden sind: https://docs .fabfile.org/en/1.8/tutorial.html

Ich war ein intensiver Benutzer von Fabric 1 und ging naiv davon aus, dass diese exemplarische Vorgehensweise mir neue Semantik für Fabric 2 beibrachte, bevor ich dieses Problemticket fand. Es könnte die Einführung wirklich entmutigen, da die Dokumente für die Einarbeitung von Personen im Wesentlichen irreführend sind.

Ich bin mir nicht sicher, wie Sie auf dieser Seite gelandet sind, Sie sollten sich https://docs.fabfile.org/en/2.5/getting-started.html ansehen

Dank dafür! Vielleicht würde es zukünftigen Reisenden helfen, einen dicken "DEPRECATED"-Header auf die Dokumente der 1er-Serie zu werfen. Ich bin mir ziemlich sicher, dass ich entweder von einem Top-Google-Ergebnis oder den offiziellen Dokumenten der Fabric-Website dorthin navigiert bin, und in beiden Fällen denke ich, dass das Fabric-Team das Fabric-Team zwar nicht kontrollieren kann, aber ich vermute, dass viele potenzielle Adopter auftreten diese Frustration und könnten davon profitieren, wenn Sie auf die Notwendigkeit aufmerksam gemacht werden, die aktuellen Dokumente zu finden (die offiziellen von Python gehosteten Dokumente folgen einem ähnlichen Muster iirc).

Es könnte die Einführung wirklich entmutigen, da die Dokumente für die Einarbeitung von Personen im Wesentlichen irreführend sind.

Brandneuer Benutzer von Fabric. Ich habe "Fabric Python" gegoogelt und auf den Link "Übersicht und Tutorial" geklickt. Ja, ich fand das wirklich verwirrend und bin ziemlich überrascht, dass ich so früh im Prozess in die falsche Richtung gehen konnte.

Ich vermute, dass viele potenzielle Anwender diese Frustration erleiden und davon profitieren könnten, dass sie auf die Notwendigkeit aufmerksam gemacht werden, die aktuellen Dokumente zu finden (die offiziellen von Python gehosteten Dokumente folgen einem ähnlichen Muster iirc).

Ja.

Beachten Sie auch, dass dies die Ergebnisseite ist:

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

Diese eingerückten Links können konfiguriert werden, wenn Sie die Domain kontrollieren. Vielleicht ist es möglich, 1.x-Zeug aus den Suchergebnissen zu löschen, zusätzlich zum Hinzufügen eines "DEPRECATED"-Headers.

Ich bin gerade über diesen gestolpert und konnte ihn endlich reparieren. Dem Stoff fehlt nichts.
Folgendes habe ich getan.

╰─$ fab --version
Fabric 2.5.0
Paramiko 2.7.2
Invoke 1.4.1

In meinem fabfile.py :

from fabric.tasks import task

<strong i="11">@task</strong>
def test(ctx, title):
    print("ctx:", ctx)
    print("title:", title)

Wenn ich nur die Aufgabe ausführe:

╰─$ fab test                                                                                                                                                                                                                      
'test' did not receive required positional arguments: 'title'

Das heißt, es erwartet title als Argument.
Übergeben Sie also das Argument:

fab test title="hello world"

Ausgabe:

ctx: <your current context. Don't worry about it>
title: title=hello world

Beachten Sie jedoch, dass das übergebene Argument eine Zeichenfolge ist. Achten Sie darauf, mit = aufzuteilen.

Beispielsweise:

<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])

Lauf:

fab test title="hello world"

Ausgabe:

ctx: ...
title type: <class 'str'>
title: title=hello world
title value: hello world

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen