Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Kontrola i zarządzanie projektami _ [Composer] Wiele projektów - jeden vendor

Napisany przez: Tomplus 5.12.2018, 15:31:46

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 = http://www.php.net/dirname(http://www.php.net/dirname(__FILE__));
  6. $baseDir = http://www.php.net/dirname($vendorDir).'/dev';
  7.  
  8. return http://www.php.net/array(
  9. 'Psr\\Log\\' => http://www.php.net/array($vendorDir . '/psr/log/Psr/Log'),
  10. 'PHPMailer\\PHPMailer\\' => http://www.php.net/array($vendorDir . '/phpmailer/phpmailer/src'),
  11. 'Mpdf\\' => http://www.php.net/array($vendorDir . '/mpdf/mpdf/src'),
  12. 'DeepCopy\\' => http://www.php.net/array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
  13. '' => http://www.php.net/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?

Napisany przez: Pyton_000 5.12.2018, 16:05:52

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.

Napisany przez: Tomplus 5.12.2018, 16:35:09

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



Napisany przez: viking 5.12.2018, 18:09:15

Przecież composer właśnie do tego służy żebyś miał wersję konkretnie jaką chcesz.

Napisany przez: Tomplus 5.12.2018, 18:13:15

Nie przeczę, dlatego chce wersję bibliotek taką samą do dwóch wersji tego samego projektu.

Napisany przez: Pyton_000 5.12.2018, 19:41:31

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

Napisany przez: Tomplus 6.12.2018, 15:16:48

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.

Napisany przez: sazian 8.12.2018, 14:06:21

skoro chcesz dokładnie to samo to nie możesz zwykłego symlinka zrobić?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)