Plugin-Release: statische Code analyse

Die statische Code-Analyse meines Plugins schlägt fehl:

A not allowed file or folder was found, Context: [expected namespace: composer.json/, found namespace: src/]
the required composer.json file was not found
the required composer.json file was not found

Warnings:
Warnings of the static code analysis:
------ ------------------------------------------------------------------ 
  Line src/Subscriber/StoreFront.php                                     
 ------ ------------------------------------------------------------------ 
  36 Class Shopware\Storefront\Event\StorefrontRenderEvent not found.  
 ------ ------------------------------------------------------------------ 

 [ERROR] Found 1 error   

Zur composer.json: Ist vorhanden.

Bei den Warnings meckert er, dass das die Klasse nicht gefunden wurde, was geht hier schief? Meine StoreFront Klasse sieht in etwa so aus:

use Shopware\Storefront\Event\StorefrontRenderEvent;

class StoreFront implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            StorefrontRenderEvent::class => 'onStorefrontRender',
        ];
    }

Funktionieren tut das Plugin ebenfalls einwandfrei.

  1. Die composer.json muss ins Hauptverzeichnis, nicht in src/

  2. Du musst namespaces verwenden in deinem Plugin. namspace DeinPlugin/Storefront;

 

VG

  1. check

  2. check

ohne diese Vorraussetzungen wäre das Plugin ja gar nicht lauffähig - habe lediglich den augescheinlich relevanten Teil der Datei gepostet

Ich kann den Fehler reproduzieren, ich erhalte beim Upload eines SW 6 Plugins ebenfalls die Fehlermeldung:

A not allowed file or folder was found, Context: [expected namespace: composer.json/, found namespace: src/]
the required composer.json file was not found
the required composer.json file was not found

Ich vermute einen Fehler in der statischen Code-Überprüfung.

Moin!

Könntet ihr einmal den Inhalt eurer composer.json und euer Plugin Bootstrap Datei hier posten?

Ich habs rausgefunden, folgendermaßen klappt es:

./custom/plugins/{technischerName}/composer.json - Auszug der relevanten Direktiven darin:

{
  "extra": {
    "shopware-plugin-class": "{technischerName}\\{technischerName}",
  },
  "autoload": {
    "psr-4": {
      "{technischerName}\\": "src/"
    }
  }
}

/custom/plugins/{technischerName}/src/{technischerName}.php

Dann klappts auch mit der statischen Code-Analyse :slight_smile:

@oli_ das heißt, ohne dem Herstellernamen als Teil des Namespaces funktioniert es? Laut Doku soll dieser aber enthalten sein.

@Jens_K: ich werde bei Gelegenheit mal ein einfaches Beispiel vorbereiten.

1 „Gefällt mir“

@kilb_software‍ der Herstellername ist in meinem Fall im technischen Namen und damit auch im Namespace enthalten.

@oli_‍ Laut Dokumentation sollte aber Herstellername und Technischer Name getrennt sein, im Beispiel:

=> Der technische Name lautet “BaseClass”, nicht “SwagBaseClass”. Andernfalls wäre es auch redundant, weil im gesamten Namespace der Herstellername zwei mal erscheinen würde. Den Herstellernamen als Teil des Namespaces zu entfernen und dem Teil des technischen Namen hinzuzufügen - so wie es bei Shopware 5 war - dürfte doch eigentlich nicht richtig sein, weil dei Dokumentation klar etwas anderes aussagt. Es wundert mich, dass es für Dich funktioniert. Vielleicht ist für die Shopware 6 Plugins noch die statische Code-Analyse für Shopware 5 (zum Teil) aktiv?

Ich habe mal ein Beispiel-Plugin hochgeladen, bei dem der Fehler auftritt:

https://www.dropbox.com/s/qzqkbacxw2y5tca/TestPlugin.zip?dl=0

@Jens_K‍ vielleich kannst Du ja mal drauf schauen? Vielleicht übersehe ich auch etwas?

 

 

 

 

Ich habe mir die Sache noch einmal angeschaut.
Wenn ein neues Plugin im Herstellerbereich angelegt wird, muss ein „Technischer Name“ eingetragen werden. 

Das erste Level in der hochzuladenden ZIP-File muss ein Verzeichnis sein, das diesem Technischen Namen entspricht. Entsprechend muss der Namespace und der Bootstrap-Klassename heißen. @oli_‍ liegt also damit richtig, dass der Herstellername der beginnende Teil des technischen Pluginnamens ist - weil die Oberfläche in Shopware aktuell nicht erlaubt, einen technischen Namen ohne Hersteller-Prefix festzulegen . Trotzdem funktioniert es, wenn der Herstellername als weiterer Teil des Namespaces bestehen bleibt. 

Hier ein funktionierendes Beispiel:
https://www.dropbox.com/s/zm0k1825ysh6q58/KilbTestPlugin_working.zip?dl=0

Um die ZIP-Datei zu bauen, lege ich im Verzeichnis des Plugins parallel zum src-Verzeichnis und zur composer.json ein build.sh-Script mit folgendem Inhalt an:

#!/usr/bin/env bash
rm -f KilbTestPlugin.zip &&
cd .. &&
zip -9 -r KilbTestPlugin.zip ./KilbTestPlugin \
    -x "*.git*" \
       "*.idea*" \
       "*.DS_Store*" \
       "*build.sh" &&
mv KilbTestPlugin.zip KilbTestPlugin/

@Jens_K eventuell wäre es hilfreich, wenn in der Dokumentation

  • noch einmal darauf hingewiesen wird, dass der Plugin-Code in der Zip in einem Verzeichnis mit dem technischen Pluginname als Namen liegen muss

und

  • auf das Herstellerprefix im technischen Namen eingegangen wird (also „Swag/SwagBaseClass“ statt "Swag/BaseClass)
    oder
  • der Herstellername nicht mehr als Prefix für Shopware 6-Plugins vorausgesetzt wird.

Was ist eigentlich aus der Ausgangsfrage geworden?

Warum zeigt die statische Code-Analyse für das StorefrontRenderEvent einen Fehler an?

@zenit schrieb:

Was ist eigentlich aus der Ausgangsfrage geworden?

Warum zeigt die statische Code-Analyse für das StorefrontRenderEvent einen Fehler an?

Ich habe das gleiche Problem. Hat jemand eine Lösung gefunden? 

Die Code-Analyse bemängelt bei mir nach wie vor alle Parameter in Subscribern (das diese angeblich nicht existieren).
Ich hatte das dem Account-Team genannt mit der Antwort, dass die Code-Analyse noch fehlerhaft ist. Dementsprechend ignoriere ich die Meldungen, weil diese faktisch falsch sind.

Der häufigste Fehler, dass vergessen wird shopware/storefront zu requiren wenn man Storefront sachen benutzt.

@TeichDatensysteme‍ kannst du mir mal via PN den Fehler + Plugin Namen (technischen) sagen

1 „Gefällt mir“

Hi @Shyim‍ 

kannst Du das ein wenig genauer erläutern? Hier ein verinfachtes Beispiel. Fehlt da was? 

 

 'onStorefrontRender'
		];
	}

    /**
     * @param StorefrontRenderEvent $event
     */
	public function onStorefrontRender(StorefrontRenderEvent $event)
	{
        // foo
	}
}

 

Hast du shopware/storefront required?

@Shyim‍

achsooo Du meinst in der composer.json Sticking-out-tongue 
 

Genau