Dijeljenje izvornog koda
Zahvaljujući web-servisima kao što je GitHub, u zadnjih nekoliko godina slobodno dijeljenje izvornog koda (engl. source code) je eksplodiralo. Neovisno o tome o kojem programskom jeziku se radi, ljudi žele dijeliti svoj izvorni kod sa svijetom, i to pod slobodnim licencama. Izvorni kod koji ljudi dijele može biti u obliku jedne skripte, nekoliko skripti koje čine paket (engl. package), pa i u obliku čitavih aplikacija.
Dijeljenje izvornog koda u slobodnom obliku omogućuje drugim programerima da se prilikom izrade neke aplikacije koriste tim kodom kao postojećim rješenjem za neki problem. Dakle, programer ne mora izmišljati „toplu vodu“, nego može koristiti tuđi izvorni kod u svojem projektu (u skladu s licencom), što može drastično ubrzati razvoj aplikacije.
Kada jedan programer podijeli samo isječak svog izvornog koda, drugom programeru nije problem taj isječak kopirati i iskoristiti ga u svojoj aplikaciji. No, problem se javlja kada programer želi podijeliti skup datoteka, npr. skup nekih skripti koje zajedno obavljaju neki zadatak te su ovisne jedna o drugoj. Rješenje za taj problem je u alatima za upravljanje paketima (engl. package managers).
U trenutku pisanja ovog članka najpopularniji jezici na GitHubu su JavaScript, Java, Python, CSS, PHP, Ruby, C++ itd. (http://githut.info/, 2016). Praktički svaki spomenuti programski jezik ima svoj alat za upravljanje paketima:
- JavaScript - npm, yarn
- Java - jpm4j, Maven, ivy
- Python - pip
- PHP - composer
- Ruby - RubyGems, bundler
- C++ - conan.
Iako gore spomenute alate često zovemo alatima za upravljanje paketima, njih treba razlikovati od klasičnih alata za upravljanje paketima u operacijskim sustavima, kao što su dnf i apt, koji služe za upravljanje paketima (aplikacijama) na sistemskoj razini (razina operacijskog sustava, u ovom slučaju Linux sustava), dok alati kao što su npm, composer i ostali, služe za upravljanje paketima na razini projekta, tj. aplikacije. Zbog toga se ti alati na engleskom često nazivaju dependency management tools, a ne package management tools. Dakle, alati kao što su npm, composer i ostali služe za upravljanje ovisnim paketima unutar jedne aplikacije koju programer razvija.
U ovom članku napravit ćemo kratki pregled korištenja alata Composer te pokazati kako nam može pomoći iskoristiti postojeće PHP pakete i aplikacije.
Što je Composer?
Composer je alat za upravljanje ovisnim paketima u aplikacijama napisanim u PHP programskom jeziku. Pomoću alata Composer moguće je instalirati i ažurirati sve pakete koji su navedeni kao potrebni u aplikaciji koju programer razvija. (getcomposer.org, 2016)
Instalirati paket u tom slučaju znači preuzeti (engl. download) sve datoteke određenog paketa i spremiti ih u određeni direktorij unutar same aplikacije. Composer može preuzeti točno određenu verziju ovisnog paketa prema specifikaciji koju sami postavimo.
Instalacija alata Composer
Da bi Composer radio, na operacijskom sustavu potrebno je imati instaliran PHP interpreter.
Composer radi dobro i na Linux i na Windows operacijskim sustavima, a za svaki sustav postoji uputa kako ga instalirati:
- uputa za instalaciju na Linux sustavima: https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx
- uputa za instalaciju na Windows sustavima: https://getcomposer.org/doc/00-intro.md#installation-windows.
Definiranje projekta za Composer
Za potrebe ovog članka napravit ćemo početni direktorij s imenom „composer-demo“. Taj direktorij će biti početni direktorij projekta i sadržavat će sve datoteke potrebne za rad aplikacije.
Za definiranje postavki Composera u početnom direktoriju potrebno je napraviti novu datoteku s nazivom „composer.json“. Između ostalog ta datoteka služi za definiranje paketa o kojim aplikacija ovisi. U datoteci je potrebno unijeti JSON tekst (JavaScript Object Notation) s određenim ključevima (engl. keys).
Za definiranje paketa o kojima aplikacija ovisi koristi se ključ „require“. Taj ključ mora sadržavati objekt u kojem su navedeni svi paketi o kojima aplikacija ovisi. Paketi moraju biti navedeni kao par imena paketa i verzije paketa, u string obliku, npr. ovako:
Sljedeće pitanje koje se nameće jest gdje pronaći dostupne pakete? Odgovor je Packagist.org.
Packagist.org
Packagist.org je glavni izvor za javne PHP pakete koji se mogu instalirati pomoću alata Composer. Na tom portalu moguće je pretraživati pakete dostupne za instalaciju.
Za primjer, instalirat ćemo paket „nesbot/carbon“ koji nudi dodatne mogućnosti u radu s datumima i vremenom u PHP okruženju. Dostupan je na adresi https://packagist.org/packages/nesbot/carbon.
Dakle, za definiranje ovisnog paketa u našu composer.json datoteku unijet ćemo „nesbot/carbon“ i oznaku zadnje verzije paketa.
Naziv razvijatelja i naziv paketa ponekad znaju biti isti. Naziv razvijatelja koristi se kako bi se izbjegle kolizije u nazivima paketa. To znači da različiti razvijatelji mogu koristiti iste nazive paketa, npr. „nesbot/carbon“, „cicnavi/carbon“.
Dostupne verzije paketa vidljive su na stranici samog paketa Packagist.org. U našem slučaju koristimo verziju 1.21.0. To je čitava oznaka verzije, ali inače možemo koristiti i zamjenske znakove za oznaku verzije. Npr. mogli smo definirati da želimo verziju „1.21.*“. Znak * (zvjezdica) u ovom slučaju znači bilo koja verzija koja počinje s „1.21.“. Za pregled svih načina definiranja verzije korisno je proučiti dokumentaciju na stranici: https://getcomposer.org/doc/articles/versions.md
Inače, verzije paketa koje su vidljive na Packagist.org povučene su iz oznaka (engl. tags) u Git repozitoriju paketa. Na primjer, ako pogledamo oznake za „nesbot/carbon“ repozitorij na GitHub stranici https://github.com/briannesbitt/Carbon/releases, možemo vidjeti da se oznake podudaraju s verzijama navedenim na Packagist.org stranici https://packagist.org/packages/nesbot/carbon.
Instalacija paketa
Neovisno o operacijskom sustavu, Composer se koristi iz naredbenog retka. Composer nudi određeni skup naredbi pomoću kojih možemo obavljati različite radnje na projektu. Prije samog korištenja alata Composer, u naredbenom retku potrebno je postaviti se u početni direktorij projekta (aplikacije), a u ovom primjeru to je direktorij „composer-demo“. Nakon toga možemo pokrenuti instalaciju paketa definiranih u datoteci „composer.json“ pomoću naredbe:
composer install
Kao što je vidljivo na gornjoj slici, uz sam paket „nesbot/carbon“ instalirana su još dva paketa. Razlog tomu je što je „nesbot/carbon“ ovisan o paketima „symfony/polyfill-mbstring“ i „symfony/translation“. Composer ih je automatizmom preuzeo jer su navedeni u konfiguraciji paketa „nesbot/carbon“.
Uz navođenje paketa u datoteci „composer.json“ postoji i drugi način kako dodati ovisni paket u aplikaciju. Može se koristiti i naredba:
composer require naziv-razvijatelja/naziv paketa {verzija-paketa}
Dakle, umjesto da uređujemo datoteku „composer.json“ i u njoj definiramo koje pakete želimo instalirati, možemo direktno unijeti naredbu Composer koja će ovisni paket instalirati i dodati ga u listu potrebnih paketa u datoteku „composer.json“. Na primjer, idemo u aplikaciju instalirati i paket „fzaninotto/faker“ i to verziju koja je >= 1. i < 2. Prema dokumentaciji na stranici https://getcomposer.org/doc/articles/versions.md, oznaka koju možemo koristiti za takvo definiranje verzije paketa je „^1“.
Oznaka verzije ^1 znači da će Composer instalirati zadnju dostupnu verziju koja je 1 ili veća, ali manja od sljedeće velike verzije, što u ovom znači manje od verzije 2. Inače, ako se oznaka verzije u potpunosti izostavi, instalirat će se zadnja stabilna verzija paketa.
Kada se koristi naredba „composer require“, Composer sam doda instalirani paket u datoteku „composer.json“. Nakon izvršene gore spomenute naredbe datoteka „composer.json“ izgleda ovako:
Nakon instalacije paketa Composer će u direktoriju napraviti još dvije stvari: direktorij „vendor“ i datoteku „composer.lock“.