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:
-
ako postoji, instalirati točno one verzije packagea koji se nalaze u toj datoteci
-
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:
-
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
-
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?
- Rekao si da te zanima Composer
- 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
.