2016-03-22 16 views
0

Ich versuche, mit dem Komponisten zu arbeiten und wird eigene Pakete erstellen. Mein Paket Projekt hat die folgende Dateistruktur:Composer Autoload Fehler

scr/Scheduler.php 
.gitignore 
composer.json 

Die Testklasse:

namespace david\Scheduler; 

use Symfony\Component\Yaml\Parser; 

class Scheduler 
{ 
    private $yamlParser; 

    public function __construct() 
    { 
     $this->yamlParser = new Parser(); 
    } 
} 

und die composer.json Datei

... 
"require": { 
    "symfony/yaml": "~3.0.3" 
}, 
"autoload": { 
    "psr-4": { 
     "david\\Scheduler\\": "src/" 
    } 
} 

Das alles, was ich zu einem privaten Github begangen haben Repository. Momentan habe ich nur den Masterzweig und keine Tags. Mein zweiter Schritt wurde ein Client-Projekt mit der folgenden composer.json-Datei zu erstellen:

"repositories": [ 
    { 
     "type": "package", 
     "package": { 
      "name": "david/scheduler", 
      "type": "package", 
      "version": "dev-master", 
      "source": { 
       "url": "[email protected]:david/scheduler.git", 
       "type": "git", 
       "reference": "master" 
      } 
     } 
    } 
], 
"require": { 
    "david/scheduler": "dev-master" 
} 

Wenn ich renne Komponist des GitHub Projekt aktualisieren wird geklont und im Lieferantenverzeichnis gespeichert werden. Aber nur mein Paket. Die Abhängigkeit zu Symfony/Yaml wird nicht geladen.

vendor 
    composer 
    david/scheduler 

Erstellen Sie auch eine leere autoload_psr4-Datei.

$vendorDir = dirname(dirname(__FILE__)); 
$baseDir = dirname($vendorDir); 

return array(
); 

Ich denke, vielleicht gibt es einige Probleme in meiner Architektur ...

+0

zeigen Ihnen, wie Sie den privaten Repository in das Hauptprojekt registrieren? Sie können die URL verschleiern, um sie privat zu halten –

+0

@ChristopheCoevoet Ich habe das component.json-Snippet aktualisiert. Außerdem fügte ich der Beschreibung folgende Zeile hinzu: 'Momentan habe ich nur den Master-Zweig und keine Tags. – David

+0

Ich gehe davon aus, dass Sie den Abschnitt' Repositories' im falschen Teil des Code-Snippets hinzugefügt haben (da es keinen Sinn ergibt) im 'david/scheduler'-Repository auf' david/scheduler' verweisen. Ich antwortete unten basierend darauf. –

Antwort

1

Ihr Problem ist, dass Sie Ihre benutzerdefinierten Repository Registrierung eines package Typ verwendet wird, was bedeutet, dass das Root-Paket ist die Definition der Metadaten david/scheduler und die composer.json-Datei im Git-Repo wird vom Composer nicht verwendet. In dieser Paketdefinition gibt es keine Abhängigkeit von der Komponente symfony/yaml und kein Autoloading für Ihre Scheduler-Klasse.

Als allgemeine Regel sollte das package Repository immer als letztes Mittel betrachtet werden (es hat viele Nachteile). Wenn Sie das git-repository steuern, funktioniert das Einfügen einer composer.json-Datei in das Repository und die Verwendung eines vcs-Repository viel besser (da composer dann auf Metadaten von git selbst vertrauen kann und die Paketmetadaten im Paket git repo bereitgestellt werden).

sollte das Wurzelpaket wie folgt aussehen:

{ 
    "repositories": [ 
     { 
      "type": "vcs", 
      "url": "[email protected]:david/scheduler.git" 
     } 
    ], 
    "require": { 
     "david/scheduler": "dev-master" 
    } 
} 
Verwandte Themen