2013-07-02 5 views
30

Ich bin ein Komponist Anfänger und ich versuche, ein Projekt von einem anderen abhängig zu machen, während beide Projekt nur auf meinem lokalen Rechner existieren.Composer - mit einem lokalen Repository

Die composer.json in meiner Bibliothek-Projekt (ProjectA) ist:

{ 
    "name" : "project/util", 
    "type" : "library" 
} 

I git im Basisordner des Projekts initialisiert.

Mein composer.json im Projekt auf der ersten je (ProjectB):

{ 
    "repositories": [ 
     { 
      "name" : "util", 
      "type" : "git", 
      "url" : "/d/workspaces/util" 
     } 
    ], 

    "require": { 
     "project/util" : "*" 
    }, 
} 

Wenn ich composer install von ProjectB laufen lasse, erhalte ich folgende Fehlermeldung:

[RuntimeException] 
Failed to clone , could not read packages from it 
fatal: repository '' does not exist 

ich etwas asume stimmt nicht mit der URL des Repository überein, aber ich bin mir nicht sicher, was ich sonst noch schreiben soll.

Antwort

23

Ich denke, Sie haben gerade die Syntax falsch. Der Typ sollte nur VCS sein, und der Composer ermittelt dann, um was für einen VCS es sich handelt.

Also in Ihrem Projekt B, sollte der Eintrag für Repositorys sein:

"repositories": [ 
    { 
     "type": "vcs", 
     "url" : "/d/workspaces/util" 
    } 
], 

Sie müssen in /d/workspaces/util verfügbar nicht nennen, welche Bibliothek ist. Composer scannt die Datei composer.json in diesem Verzeichnis und weiß, welcher Projektname dort verfügbar ist, und verwendet das Projekt aus diesem Verzeichnis anstelle einer Version, die in einem Paket oder einem anderen Repository aufgeführt ist.

+0

Okay, wenn ich in vcs ändere, erhalte ich folgende Meldung: [Runtime Exception] Verzeichnis existiert nicht:/d/workspaces/util – Banana

+3

Äh, vermutlich ist das Verzeichnis dann nicht vorhanden oder nicht zugänglich? – Danack

+2

Ich denke, das Verzeichnis ist nur falsch geschrieben. Sind Sie sicher, dass Sie es als '/ d/workspaces/util' und nicht als' d:/workspaces/util' angeben müssen? –

1

Zusätzlich zu Danacks Lösung: Den Pfad von/d/zu d:/zu ändern, funktionierte für mich.

So:

"repositories": [ 
    { 
     "type": "vcs", 
     "url" : "d:/workspaces/util" 
    } 
], 
24

Autoload lokales Paket Composer (ohne jedes Mal, wenn Sie ändern, um packagist zu gehen).

Es gibt viele Möglichkeiten, dies zu tun, werde ich zwei von ihnen werden zu verdecken:

In allen Fällen haben wir 2 Parteien:
- das lokale Paket (der Code, den wir nicht tun möchte auf packagist veröffentlichen, um es in unserem Projekt-Composer automatisch laden zu können).
- das Hauptprojekt (die Codebasis, die den lokalen Paketcode verwenden muss, kann ein anderes Paket und/oder ein beliebiges Projekt sein).


Methode 1: (direkte Namespace)

öffnen Sie das Hauptprojekt composer.json Datei und automatische Laden den lokalen Paket Namensraumes mit einem beliebigen Methode (PSR-4, PSR-0, ...).

Beispiel:

wenn in den Komponisten.json des lokalen Paket, das wir haben:

"autoload": { 
    "psr-4": { 
     “Local\\Pack\\": "library" 
    } 
    }, 
    "autoload-dev": { 
    "psr-4": { 
     "Local\\Pack\\Tests\\": "tests" 
    } 
    }, 

dann im composer.json des Hauptprojekts sollten wir haben:

"autoload": { 
    "psr-4": { 
     "Mahmoudz\\Project\\": "src", 
     "Local\\Pack\\": "../path/to/local/pack/library”     << referencing the other local package 
    } 
    }, 
    "autoload-dev": { 
    "psr-4": { 
     "Mahmoudz\\Project\\Tests\\": "tests" 
    } 
    }, 

Vorteile:
- Sie mit dem Verkäufer nicht touche Verzeichnis (versehentliches Ausführen der Composer - Aktualisierung überschreibt Ihre lokalen Änderungen nicht)
- Sie brauchen Ihr Paket nicht, um es zu verwenden.
- Sie arbeiten an einem Ort (dem lokalen Paket ge) und die Änderungen werden in das Hauptprojekt
Nachteile automatisch geladen:
- Sie nicht die composer.json über die Produktion (Bedürfnisse veröffentlichen Bearbeitung vor dem eigentlichen Paket)

Methode 2 erfordert die Veröffentlichung: (lokales Repository)

Laden Sie das lokale Paket von einem lokalen Repository herunter.

lokale Paket:
1. initialize git im Paket (auch wenn Sie wollen ihn nicht verwenden - keine Notwendigkeit, etwas zu begehen)
2. Add composer.json Datei. In der Datei sollten Sie folgende Voraussetzungen erfüllt sein:

"name": “vendor-name/package-name", 

"autoload": { … // use whichever method you prefer, but make sure it’s being loaded correctly 

"minimum-stability": “dev" 
  1. composer dump-autoload

Hauptprojekt:
1. bearbeiten Ihre composer.json enthalten die folgende:

"repositories": [ 
    { 
     "type": "vcs", 
     "url": “/full/path/to/the/local/package/package-name" 
    } 
    ], 
    "require": { 
    "vendor-name/package-name": "dev-master" 
    }, 
  1. Komponist Update hersteller Name/package-name
  2. jetzt Ihren Händler-Verzeichnis überprüfen sollten Sie den Lieferanten-Name/Paket- Name

HINWEIS: wenn Sie Änderung der lokalen Paket machen (nicht der Verkäufer) Sie verpflichten sich git benötigen, dann können Sie Komponist Update das Hauptprojekt, wird es die neueste Kopie des Repo in das Hauptverzeichnis des Projektanbieters bekommen.

Vorteil:
- Sie touche nicht an den Hersteller-Verzeichnis (Lauf Komponist Update versehentlich nicht Ihre lokalen Änderungen außer Kraft setzen) - Sie müssen nicht Ihr Paket auf packagist sein, es zu benutzen
Nachteil:
- Sie müssen weiterhin Ihre Änderungen (im lokalen Paket) und dann Composer-Update im Hauptprojekt
- Sie können nicht die composer.json auf Produktion veröffentlichen (muss vor der Veröffentlichung zu erfordern, um das echte Paket erforderlich Commit))

+4

Danke, sehr gut! ** Hinweis: ** Wenn Sie die Methode _vcs_ (# 2) verwenden, vergessen Sie nicht, Ihre composer.json-Änderungen zu übernehmen. Einfach zu vergessen, und Sie werden sich am Kopf darüber kratzen, warum Composer Ihr Paket mit "Paketversion nicht gefunden" -Fehlern in den Bann schlägt. – mangonights

+2

Ihre erste Methode hat mein Leben gerettet! Kudos! –

+0

zweite Methode und @mangonights Kommentar speicherte mich auch ... danke dir allen bro –