Compositore richiedono pacchetto

Ho un paio di librerie [Foo e Bar] che sto sviluppando in concerto, ma sono ancora tecnicamente cose separate. In passato ho appena ri-definito l’autoloader per come "Foo\\": "../Foo/src", ma ora che ho aggiunto un Gozzovigliare dipendenza di Foo, Bar ribalta il coperchio perché non è una delle sue dipendenze.

Struttura di Directory:

/home/user/src/
    Foo/
        src/
            FooClient.php
        composer.json
    Bar/
        src/
            BarClient.php
        composer.json

Teorico Autoload Dichiarazione: [in Bar/compositore.json]

"require": {
    "local": "../Foo/composer.json"
}

Codice di esempio:

require('vendor/autoload.php');

$f = new \Bar\BarClient(new \Foo\FooClient());

Come posso risolvere questo senza la creazione di un locale Compositore repo? Voglio mantenere questi come pacchetti separati, solo che richiede uno l’altro, e quindi i processi di altre dipendenze.

post-risposta edit:

Grazie a infomaniac ho fatto le seguenti:

Inizializzare il repository git:

cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"

Aggiunto il compositore config:

"require": {
    "sammitch/foo": "dev-master"
},
"repositories": [{
    "type": "vcs",
    "url": "/home/sammitch/src/Foo"
}],

E poi composer update!

  • Come funziona questo json specificare l’identità tra il riferimento a “sammitch/pippo” e l’indirizzo “/home/sammitch/src/Pippo” ? È a seguito di una convenzione?
  • sammitch/foo è il nome del pacchetto e ha letteralmente nulla a che fare con dove si trova. Costruire un elenco dei pacchetti disponibili secondo la configurazione pronti contro termine, in questo caso il recupero del compositore.json da quella specificata nel repository git locale, e poi compositore gestisce tutto il resto. Il sammitch/foo pacchetto viene copiato l’attuale app vendor cartella come qualsiasi altro pacchetto.
  • Oh, credo di aver capito ora. È solo una custom repo, come in APT, che potrebbe accadere a contenere il “sammit/pippo” del pacchetto. Non ho capito giusto?
  • ci puoi scommettere
InformationsquelleAutor Sammitch | 2015-05-01

 

3 Replies
  1. 129

    Il link ad un locale, in-pacchetto di sviluppo per aggiungere nella vostra principale del progetto composer.json un repository, come questo:

    "repositories": [
        {
            "type": "path",
            "url": "/full/or/relative/path/to/development/package"
        }
    ]

    È inoltre necessario avere una versione specificata nel pacchetto di sviluppo del composer.json o il mio modo di fare è richiedere il pacchetto utilizzando @dev, come questo:

    composer require "vendorname/packagename @dev"

    Dovrebbe uscita:

    - Installing vendor/packagename (dev-develop)
    Symlinked from /full/or/relative/path/to/development/package

    Il @dev nel richiedere il comando è importante, compositore utilizza questo per pick-up il codice sorgente e simbolico per il nuovo pacchetto.

    È una stabilità bandiera aggiunta alla versione vincolo (vedi pacchetto link).

    Questi consentono di limitare ulteriormente o espandere il
    la stabilità di un pacchetto di là della portata del minimo di stabilità
    l’impostazione.

    Minimo di stabilità e le bandiere sono:

    Opzioni disponibili (in ordine di stabilità) sono dev, alpha, beta, RC, e stable.

    • Nota, che non è consentito dal compositore per specificare un percorso che si trova nella stessa directory del compositore.json è posto.
    • Punto interessante, MaPePeR non sapevo di questo. Tuttavia, credo che tutti i framework web già prendersi cura di questo, mettendo tutte le dipendenze in un “venditore”, la cartella? Yii2 questo, almeno.
    • Penso di aver confuso con qualcos’altro. Non è consentito di avere un archivio in una cartella principale. Un bambino cartella dovrebbe andare bene, ma ha causato qualche strano errore per me.
    • composer require "vendorname/packagename @dev" si traduce in "require":{ "vendorname/packagename": "@dev" } nell’applicazione del compositore.json se si desidera eseguire il compositore installare
    • Si prega di aggiungere questo: compositore config repository.locale percorso /completo/o la/relativa/percorso/del/di sviluppo/il pacchetto e il corretto modo di aggiungere i repository
  2. 0

    Dopo aver trascorso qualche tempo, ho finalmente capito la soluzione. Forse può essere utile per qualcuno, come me, e vi farà risparmiare un po ‘ di tempo, quindi ho deciso che devo condividere qui.

    Supponendo che si ha la seguente struttura di directory (relativa al progetto di root directory):

    composer.json
    config
    config/composition-root.php
    local
    local/bar-project
    local/bar-project/composer.json
    local/bar-project/src
    local/bar-project/src/Bar.php
    public
    public/index.php
    src
    src/Foo.php

    In questo esempio si può vedere che il local cartella si intende per nidificato i progetti della vostra azienda, per esempio bar-project. Ma si potrebbe configurare qualsiasi altro formato, se lo si desidera.

    Ogni progetto deve avere un suo composer.json file, ad esempio root composer.json e local/bar-project/composer.json. Quindi il loro contenuto sarà come segue:

    (root composer.json🙂

    {
      "name": "your-company/foo-project",
      "require": {
        "php": "^7",
        "your-company/bar-project": "@dev"
      },
      "autoload": {
        "psr-4": {
          "YourCompany\\FooProject\\": "src/"
        }
      },
      "repositories": [
        {
          "type": "path",
          "url": "local/bar-project"
        }
      ]
    }

    (local/bar-project/composer.json🙂

    {
      "name": "your-company/bar-project",
      "autoload": {
        "psr-4": {
          "YourCompany\\BarProject\\": "src/"
        }
      }
    }

    Se, per esempio, si desidera individuare ogni progetto in un separato directory sorella, come segue:

    your-company
    your-company/foo-project
    your-company/foo-project/composer.json
    your-company/foo-project/config
    your-company/foo-project/config/composition-root.php
    your-company/foo-project/public
    your-company/foo-project/public/index.php
    your-company/foo-project/src
    your-company/foo-project/src/Foo.php
    your-company/bar-project
    your-company/bar-project/composer.json
    your-company/bar-project/src
    your-company/bar-project/src/Bar.php

    – allora avete bisogno di link alle rispettive directory repositories sezione:

      "repositories": [
        {
          "type": "path",
          "url": "../bar-project"
        }
      ]

    Dopo di che non dimenticare di composer update (o anche rm -rf vendor && composer update -v come i documenti suggeriscono)!
    Sotto il cofano, il compositore crea un vendor/your-company/bar-project link simbolico che gli obiettivi di local/bar-project (o ../bar-project rispettivamente).

    Supponendo che il vostro public/index.php è solo un front controller, ad esempio:

    <?php
    require_once __DIR__ . '/../config/composition-root.php';

    Quindi il tuo config/composition-root.php sarebbe:

    <?php
    
    declare(strict_types=1);
    
    use YourCompany\BarProject\Bar;
    use YourCompany\FooProject\Foo;
    
    require_once __DIR__ . '/../vendor/autoload.php';
    
    $bar = new Bar();
    $foo = new Foo($bar);
    $foo->greet();

Lascia un commento