Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Composer] Wiele projektów - jeden vendor
Forum PHP.pl > Forum > Kontrola i zarządzanie projektami
Tomplus
Nie wiem jak użyć jeden katalog vendor dla wielu projektów do których potrzebuję te same wersje pakietów. Jednak jedyne wyjście - najpewniejsze to inicjacja composera w katalogu projektu, ale gdy jest dużo większych bibliotek to nie ma sensu duplikowania bibliotek.

Przedstawię układ katalogów dla mojego projektu:

Kod
- \projekt
---- \vendor
---- \dev
-------- \libs
-------- composer.json
---- \public
-------- \libs
-------- composer.json


W katalogu ./dev i ./public zainicjowałem composer.json z następującymi danymi:

Kod
{
    "require": {
        "phpmailer/phpmailer": "^6.0",
        "mpdf/mpdf": "^7.1"
    },
    "autoload": {
        "psr-4": {
            "":"libs"
        }
    },
    "config": {
        "bin-dir":"libs",
        "vendor-dir": "../vendor"
    }
}


Niby działa, ale zawsze tylko dla jednego, czyli dla tego który ostatni otrzymał wywołanie: composer dump-autoload
Kod dla autoload_psr4.php mam taki:

  1. <?php
  2.  
  3. // autoload_psr4.php @generated by Composer
  4.  
  5. $vendorDir = dirname(dirname(__FILE__));
  6. $baseDir = dirname($vendorDir).'/dev';
  7.  
  8. return array(
  9. 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
  10. 'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'),
  11. 'Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'),
  12. 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
  13. '' => array($baseDir . '/libs'),
  14. );



Zmienia się jedynie wartość zmiennej $baseDir czyli albo /dev albo /public.

Czy jest jakaś recepta aby móc korzystać z wewnętrznych klas projektu osobno, a vendora wspólnie?
Pyton_000
Po co robisz sobie problemy? Na prawdę aż tak biedujesz transfer i sotrage?

Jak już tak chcesz to zrób

Kod
-|
   composer.json
   ./vendor
\__ dev
\_  public


Czyli composer wraz z json i lock katalog niżej i dołącz autoloader w każdym.
Dodatkowo jak chcesz miec autoloading w projektach to dodatkowo tam załóż composer jako autoload plików samego projektu.
Tomplus
Może nie bieduje, ale chodzi mi o pewną wygodę, i pewność że stabilne biblioteki są takie same w obydwu wersjach projektu.

W poście głównym zrobiłem korektę schematu katalogu, dopisałem tam gdzie obecnie mam pliki composer.json/lock

Ale wg Twojego zamysłu, na moich schemacie, ma być tak:
questionmark.gif

Kod
- \projekt
---- composer.json
---- \vendor
---- \dev
-------- \libs
---- \public
-------- \libs


viking
Przecież composer właśnie do tego służy żebyś miał wersję konkretnie jaką chcesz.
Tomplus
Nie przeczę, dlatego chce wersję bibliotek taką samą do dwóch wersji tego samego projektu.
Pyton_000
Raczej coś takiego:
Kod
o
|-- vendor
|-- composer.json
|-- dev
|   |-- vendor
|   `-- composer.json
`-- prod
    |-- vendor
    `-- composer.json

W takim układzie w `dev` załączasz 2x autoload (1-szy z root dir gdzie masz main libs, a 2-gi ze swojego katalogu)

Nie powiem Ci czy to zadziała na 100% ale powinno smile.gif
Tomplus
Nie udało mi się poprawnie skonfigurować. Więc po prostu zrobiłem to inaczej.

Zainstalowałem bibliotekę: https://packagist.org/packages/nette/robot-loader i wdrożyłem ją do projektu.

Teraz wszystko działa tak jak powinno.
sazian
skoro chcesz dokładnie to samo to nie możesz zwykłego symlinka zrobić?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.