Laravel - Problem sa Composerom

Pozdrav.

Klonirao sam jedan repozitorij sa Githuba na kojem trenutno radim u kompaniji, ali sam naletio na nekoliko problema prilikom “instalacije” Laravela.O ovoj temi znam jako malo tako da ne zamjerite ako izleti neki pogresan pojam ili nesto slicno.

Uglavnom kada otvorim composer i upisem komandu composer install dobijem ovo:

Inace ni Back-end developer, koji je kreirao projekat na Gitu ne zna do cega je.

Imas konflikt u composer.json, medju verzijama mozda. Najbolje da postujes composer.json da pogledamo ako ima previse stvari koje povlacis jako tesko ces otkriti problem.

Probaj da povuces neku stariju verziju zizaco/entrust a ne dev-master.

{
	"name": "laravel/laravel",
	"description": "The Laravel Framework.",
	"keywords": ["framework", "laravel"],
	"license": "MIT",
	"require": {
		"laravel/framework": "4.2.*",
		"zizaco/entrust": "dev-master",
		"guzzlehttp/guzzle": "~4.0"
	},
	"autoload": {
		"classmap": [
			"app/commands",
			"app/controllers",
			"app/models",
			"app/database/migrations",
			"app/database/seeds",
			"app/tests/TestCase.php"
		]
	},
	"scripts": {
		"post-install-cmd": [
			"php artisan clear-compiled",
			"php artisan optimize"
		],
		"post-update-cmd": [
			"php artisan clear-compiled",
			"php artisan optimize"
		],
		"post-create-project-cmd": [
			"php artisan key:generate"
		]
	},
	"config": {
		"preferred-install": "dist"
	},
	"minimum-stability": "stable"
}

Prvo idemo vidjeti koja je razlika između komandi composer install i composer update te razliku između composer.lock i composer.json datoteka. U zagradama ću pisati terminologiju s kojom ćeš se susretati ukoliko se odlučiš služiti Composerom, što toplo preporučam.

Koja je razlika između composer.json i composer.lock datoteka te composer install i composer update komandi?

U composer.json datoteku navodimo koji paketi (packages) su nam potrebni/neophodni (dependency) za naš projekt, tako da kada pokrenemo composer install ili composer update, Composer može povući sve neophodne pakete koje smo izdefinirali i izgenerirati autoloader. Jako je bitno razlikovati što rade ove dvije komande kada postoji ili ne postoji composer.lock datoteka, te ću to objasniti nešto kasnije u tekstu.

composer.lock datoteku ne pišeš ručno niti ju editiraš. Nju generira sam Composer, a u njoj se nalaze popisi točnih verzija svih paketa koje je Composer preuzeo kad si ga zadnji put pokrenuo. Što mislim pod tim?
Ako si u composer.json datoteci definirao sljedeće:

"require": {
  "laravel/framework": "4.2.*"
}

to znači da za tvoj projekt prihvaćaš verziju i 4.2.1, 4.2.2, 4.2.3, 4.2.4… itd ali ne 4.3.

Jednom kada pokreneš composer update, on će pogledati u composer.json datoteku, pogledati što sve treba preuzeti i generirati će composer.lock datoteku gdje će zapisati točne verzije svakog paketa kojeg je preuzeo u tom trenutku.

Sad se možemo baciti na to što je composer.lock u cijeloj priči te razlici između composer update i composer install komandi.

Mislim da ćeš najbolje shvatiti na primjeru.
Dakle, praviš novi projekt, prazan ti je folder i u njega si samo kreirao composer.json datoteku gdje si definirao da želiš paket laravel/framework, te da ti odgovaraju 4.2.* verzije.

Sada je sasvim svejedno hoćeš li pokrenuti composer install ili composer update.
Ako pokrenemo composer install, Composer će provjeriti postoji li composer.lock datoteka (a u tom trenutku ona ne postoji jer smo rekli da si samo napravio composer.json datoteku), te će učiniti sljedeće:

  1. ako postoji, instalirati točno one verzije packagea koji se nalaze u toj datoteci
  2. ako ne postoji, sam će pozvati composer update kako bi ju stvorio (dakle mogli smo odmah jednostavno pozvati composer update)

composer update

Ok, dakle pokreće se composer update, te se događa sljedeće:
Composer će pogledati u composer.json datoteku i vidjeti što si sve definirao da ti je potrebno. Vidjet će laravel/framework package te kako si naveo da ti odgovaraju verzije 4.2.*.
U trenutku pisanja ovog posta posljednja verzija bi bila 4.2.17, te će nju Composer preuzeti i - ono bitno - stvorit će composer.lock datoteku u koju će zapisati da je instalirana točno verzija 4.2.17.
Zašto nam je ovo bitno? Radi djeljenja projekta s drugima. Kada želiš s nekim podijeliti projekt (npr na Github repozitorij ga staviti), a želiš da svatko tko će ga koristiti ima baš identično stanje kao i ti, onda je bitno da postoji composer.lock datoteka u kojoj su zapisane točne verzije svih packagea koje si instalirao, te da onaj tko preuzme može jednostavno pokrenuti composer install i imati iste datoteke koje imaš i ti (osim naravno ako nisi prčkao po sourceu paketa, a to nikad nećeš raditi ako si dobar developer nego ćeš submitati PR-ove :)).

Taj netko je preuzeo tvoj repozitorij (u kojemu se nalaze i composer.json i composer.lock datoteke), te će pokrenuti composer install.

composer install

Kada pokrenemo ovu komandu, Composer će provjeriti postoji li composer.lock datoteka (a sada već postoji, ako si ju inkludao u svoj repozitorij), te:

  1. ako postoji, instalirati točno one verzije packagea koji se nalaze u toj datoteci. U ovom slučaju će to biti package laravel/framework s verzijom 4.2.17
  2. ako ne postoji, sam će pozvati composer update (a opisali smo što ta komanda radi)

Ako ne postoji, composer update će onda opet odraditi već gore opisani proces, odnosno provjeriti composer.json i po njemu instalirati neophodne pakete.

E sad, zamisli da je prošlo nekoliko mjeseci i da je bilo brdo updatea u međuvremenu za laravel/framework package a ti nisi inkludao composer.lock datoteku u svoj repozitorij.

Ja sam preuzeo tvoj repozitorij, pokrenuo composer install ali ja neću dobiti 4.2.17 verziju (s kojom sve normalno radi) nego neku 4.2.62 verziju - samo zato jer nisi inkludao composer.lock datoteku u repozitorij. Ovo ne znači da moraš nužno svaki puta inkludati tu datoteku u repozitorij, ali nema neke prevelike štete (osim ukoliko ju iz nekog razloga ne želiš sakriti). Onaj tko želi updateati sve pakete jednostavno će pokrenuti sam composer update.

Zašto sve ovo pišem?

  1. Rekao si da te zanima Composer
  2. Rekao si nam da radiš composer install a kopirao si nam sve iz composer.json datoteke :]

Tvoj problem leži baš u tome da očito fali composer.lock datoteka. Kako znam? Zato jer je nekad za paket zizaco/entrust bio dev-master (odnosno posljednja dev verzija) zaista namijenjena za Laravel 4 (jer je i tada Laravel 4 bio najnoviji). Da imaš composer.lock datoteku, u njoj bi pisalo koja je točno verzija zizaco/entrust paketa bila instalirana i ne bi imao problema kada pokreneš composer install.
Danas, ako pogledaš njihov repozitorij, vidjet ćeš da je dev-master zapravo namijenjen za Laravel 5 i da je dependency tog paketa illuminate/console ~5.0. Ono što ti trebaš je promijeniti iz dev-master u 1.3.* (koja je najnovija verzija namijenjena za L4)

"require": {
  "laravel/framework": "4.2.*",
  "zizaco/entrust": "1.3.*",
  "guzzlehttp/guzzle": "~4.0"
}

i šibnuti composer update.

2 Likeova

Hvala Toni bas si ovo super objasnio.

Inace moj posao nije da baratam sa Laravelom i Composerom, ali uvijek se nadje neki problem a od viska znanja glava ne boli.

Hvala jos jednom :smile:

Nema problema, nekome će post biti koristan a nekome ne. Nadam se da je problem riješen.

Sto se tice problema, bas i ne.

Nisi procitao post iznad ili si ga procitao a nisi razumeo :slight_smile:

Uradio sam ono sto je napisao da uradim.

composer.lock datoteka postoji i ima jako puno linija koda u njoj :open_mouth:

  1. Napravi novi folder
  2. Povuci u njega repozitorij
  3. Ukoliko postoji, obriši composer.lock datoteku
  4. U composer.json datoteci promijeni "zizaco/entrust": "dev-master" u "zizaco/entrust": "1.3.*"
  5. Pokreni composer update

Sad sam vidio da je dodano i ovo pod require:

"curl/curl": "dev-master"

Da li treba ovako biti, ili ne ?

I opet, samo sto je sad stalo na omnipayu:

Evo kako sada izgleda composer.json:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "laravel/framework": "4.2.*",
        "zizaco/entrust": "1.3.*",
        "guzzlehttp/guzzle": "~4.0",
        "way/generators": "~2.0",
        "omnipay/paypal": "~2.0",
        "omnipay/omnipay": "~2.0",
        "guzzlehttp/guzzle": "~4.0",
        "curl/curl": "dev-master"
        
    },
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    },
    "minimum-stability": "stable"
}

Pa lijepo ti piše -> “git was not found, check that it is installed and in your PATH”.

Instaliraj git i postavi ga u PATH i radit će.

Nemoj da se ljutis, ali ja i dalje ne kontam sta ovo znaci.Ja sam front-end tako da je sve ovo za mene spansko selo.

Jesi mislio na ovaj Git http://git-scm.com/ ? Ako jesi ja sam ga instalirao isao next,next, next i opet isto :open_mouth:

Napisao sam i da ga postaviš u path, ne samo da ga instaliraš. Nisam siguran hoće li instalacija to sama odraditi.

U tome i jeste problem.Kako ga postaviti u PATH…

ADD: Provalio sam ovo oko patha ali sada je nastao problem oko php artisan migrate:refresh --seed

ADD: Sve je fixano, problem je bio u 127.1.0.1 odnosno komunikaciji sa bazom.

Hvala Toni.