Tartalom
Bevezető
A Drupal 2019. december 4-én adta ki a jelenleg legfrissebb alaprendszerét, a 8.8.0-át. Korábban már volt róla szó, hogyan frissíthetjük egyszerűen a Drupal alaprendszert, azonban ebben a kiadásban már több minden változott, így egy kicsit jobban a mélyére kell nyúlni a dolgoknak. Mivel a frissítés kicsit macerásabb, mint az apróbb patch-eket tartalmazó alaprendszer frissítések, ezért gondoltam megér itt egy misét. Ebben a leírásban tehát megnézzük, hogyan frissíthetjük Drupal alaprendszerünket a 8.7.10-es verzióról a 8.8.0-ára.
Elkészült a Drupal 9 alaprendszerhez is a frissítési útmutató:
Előfeltételek
A Drupal az alaprendszer frissítéséhez többféle módszert is kínál, itt most is a Composer segítségével fogjuk elvégezni a frissítést.
Itt most nem megyek bele olyan mélyen az egyes szükséges alapfeltételek részleteibe, mert ezeket a korábbi útmutatóban már bemutattam, így most csak felsorolom őket. Tehát a sikeres frissítés végrehajtásához az alábbiakra van most is szükségünk:
- Terminál, SSH hozzáférés
- Composer PHP csomagkezelő
- Git verziókezelő rendszer
- Drush
Biztonsági mentés
Frissítések előtt mindig készítsünk biztonsági mentést a weboldal teljes fájlstruktúrájáról és az adatbázisról. Erről egy másik leírásban lesz szó részletesebben.
Valamint, ha van rá lehetőségünk, akkor először egy tesztkörnyezetben végezzük el a frissítést, és csak azután az éles oldalunkon.
Frissítőcsomag letöltése és kicsomagolása
Töltsük le és csomagoljuk ki a Drupal 8.8.0 telepítőcsomagját a /tmp könyvtárunkba:
cd /tmp
wget https://ftp.drupal.org/files/projects/drupal-8.8.0.tar.gz
tar -xzf drupal-8.8.0.tar.gz
cd drupal-8.8.0/
Fájleltérések kezelése
A korábbi Drupal alaprendszer frissítős leírástól eltérően most pontosan tudjuk hogy mik az új kiadásban az eltérések, így ezeknek az összevetésére koncentrálunk. A Drupal 8.8.0 kiadás részleteiről itt olvashatunk.
composer.json
A Drupal rendszerünk webgyökerében lévő composer.json fájl írja le, hogy milyen extra modulokból épül fel az oldal. Nem minden modult lehet a webes felületen keresztül telepíteni, hanem ezeket a composer PHP csomagkezelő segítségével telepítjük. A composer.json fájl többek között az így felkerült modulok neveit is tárolja, hogy frissítéskor tudja a rendszer, hogy mely csomagokat kell újra letöltenie.
Első körben nézzünk bele a korábbi Drupal verzió (8.7.10) composer.json gyári fájljába:
{
"name": "drupal/drupal",
"description": "Drupal is an open source content management platform powering millions of websites and applications.",
"type": "project",
"license": "GPL-2.0-or-later",
"require": {
"composer/installers": "^1.0.24",
"wikimedia/composer-merge-plugin": "^1.4"
},
"replace": {
"drupal/core": "^8.7"
},
"minimum-stability": "dev",
"prefer-stable": true,
"config": {
"preferred-install": "dist",
"autoloader-suffix": "Drupal8"
},
"extra": {
"_readme": [
"By default Drupal loads the autoloader from ./vendor/autoload.php.",
"To change the autoloader you can edit ./autoload.php.",
"This file specifies the packages.drupal.org repository.",
"You can read more about this composer repository at:",
"https://www.drupal.org/node/2718229"
],
"merge-plugin": {
"include": [
"core/composer.json"
],
"recurse": true,
"replace": false,
"merge-extra": false
},
"installer-paths": {
"core": ["type:drupal-core"],
"modules/contrib/{$name}": ["type:drupal-module"],
"profiles/contrib/{$name}": ["type:drupal-profile"],
"themes/contrib/{$name}": ["type:drupal-theme"],
"drush/contrib/{$name}": ["type:drupal-drush"],
"modules/custom/{$name}": ["type:drupal-custom-module"],
"themes/custom/{$name}": ["type:drupal-custom-theme"]
}
},
"autoload": {
"psr-4": {
"Drupal\\Core\\Composer\\": "core/lib/Drupal/Core/Composer"
}
},
"scripts": {
"pre-autoload-dump": "Drupal\\Core\\Composer\\Composer::preAutoloadDump",
"post-autoload-dump": "Drupal\\Core\\Composer\\Composer::ensureHtaccess",
"post-package-install": "Drupal\\Core\\Composer\\Composer::vendorTestCodeCleanup",
"post-package-update": "Drupal\\Core\\Composer\\Composer::vendorTestCodeCleanup",
"drupal-phpunit-upgrade-check": "Drupal\\Core\\Composer\\Composer::upgradePHPUnit",
"drupal-phpunit-upgrade": "@composer update phpunit/phpunit phpspec/prophecy symfony/yaml --with-dependencies --no-progress",
"phpcs": "phpcs --standard=core/phpcs.xml.dist --runtime-set installed_paths $($COMPOSER_BINARY config vendor-dir)/drupal/coder/coder_sniffer --",
"phpcbf": "phpcbf --standard=core/phpcs.xml.dist --runtime-set installed_paths $($COMPOSER_BINARY config vendor-dir)/drupal/coder/coder_sniffer --"
},
"repositories": [
{
"type": "composer",
"url": "https://packages.drupal.org/8"
}
]
}
Ezután nézzük meg az újabb kiadásban lévőt (8.8.0):
{
"name": "drupal/legacy-project",
"description": "Project template for Drupal 8 projects with composer following drupal/drupal layout",
"type": "project",
"license": "GPL-2.0-or-later",
"homepage": "https://www.drupal.org/project/drupal",
"support": {
"docs": "https://www.drupal.org/docs/user_guide/en/index.html",
"chat": "https://www.drupal.org/node/314178"
},
"repositories": [
{
"type": "composer",
"url": "https://packages.drupal.org/8"
}
],
"require": {
"composer/installers": "^1.2",
"drupal/core-composer-scaffold": "^8.8",
"drupal/core-project-message": "^8.8",
"drupal/core-recommended": "^8.8",
"drupal/core-vendor-hardening": "^8.8"
},
"require-dev": {
},
"conflict": {
"drupal/drupal": "*"
},
"minimum-stability": "dev",
"prefer-stable": true,
"config": {
"sort-packages": true
},
"extra": {
"drupal-scaffold": {
"locations": {
"web-root": "./"
}
},
"installer-paths": {
"core": ["type:drupal-core"],
"libraries/{$name}": ["type:drupal-library"],
"modules/contrib/{$name}": ["type:drupal-module"],
"profiles/contrib/{$name}": ["type:drupal-profile"],
"themes/contrib/{$name}": ["type:drupal-theme"],
"drush/Commands/contrib/{$name}": ["type:drupal-drush"],
"modules/custom/{$name}": ["type:drupal-custom-module"],
"themes/custom/{$name}": ["type:drupal-custom-theme"]
},
"drupal-core-project-message": {
"include-keys": ["homepage", "support"],
"post-create-project-cmd-message": [
"<bg=blue;fg=white> </>",
"<bg=blue;fg=white> Congratulations, you’ve installed the Drupal codebase </>",
"<bg=blue;fg=white> from the drupal/legacy-project template! </>",
"<bg=blue;fg=white> </>",
"",
"<bg=yellow;fg=black>Next steps</>:",
" * Install the site: https://www.drupal.org/docs/8/install",
" * Read the user guide: https://www.drupal.org/docs/user_guide/en/index.html",
" * Get support: https://www.drupal.org/support",
" * Get involved with the Drupal community:",
" https://www.drupal.org/getting-involved",
" * Remove the plugin that prints this message:",
" composer remove drupal/core-project-message"
]
}
}
}
Már első ránézésre is látható, hogy van köztük rendesen különbség.
Ha eddig nem telepítettünk semmit a Composer PHP csomagkezelővel, akkor ezzel nincs semmi dolgunk, csak felül kell írnunk az újjal, amikor egyben elvégezzük a fájlműveleteket. Addig ne csináljunk vele semmit.
Ha viszont telepítettünk már modulokat a composerrel, akkor bizony megváltozott annak a tartalma. Ilyenkor össze kell fésülni a változásokat. Ez azt jelenti, hogy amilyen változások bekerültek a composer.json fájlunkba az eredetihez képest, pontosan ugyanezeket kell betenni a megfelelő helyekre az újban is.
Erre használhatjuk a linux diff parancsot is, de szerintem kényelmesebb és áttekinthetőbb, ha egy szerkesztőprogramban megnyitjuk az eredeti composer.json fájlt, és a sajátunkat, majd soronként összevetjük a különbségeket, amiket kiírunk egy átmeneti fájlba, csak hogy elkülönítve is meglegyenek a változások.
A saját konkrét példámmal bemutatva nálam ezek kerültek be a composer.json fájlba az elmúlt kb. 2 évben:
"require": {
...,
..., (fontos, hogy vesszővel végződjön minden olyan sor, ami után még van további sor!)
A hozzáadott rész:
"drush/drush": "^9.2",
"jackmoore/colorbox": "1.6.4",
"drupal/geshifilter": "^1.2",
"drupal/amptheme": "^1.0",
"drupal/superfish": "^1.2",
"drupal/amp": "^2.1",
"masterminds/html5": "2.3.1"
[...]
"extra": {
...,
"installer-paths": {
...,
...,
a hozzáadott rész (ez már benne van a Drupal 8.8 gyári composer fájljában is!):
"libraries/{$name}": ["type:drupal-library"]
[...]
"repositories": [
{
...
}, (vesszővel zárul!)
És a hozzáadott rész:
{
"type": "package",
"package": {
"name": "jackmoore/colorbox",
"version": "1.6.4",
"type": "drupal-library",
"dist": {
"url": "https://github.com/jackmoore/colorbox/archive/1.6.4.zip",
"type": "zip"
}
}
}
Itt tehát 3 részt különböztethetünk meg: require, extra/installer-paths és a repositories.
Nagyon fontos, hogy betartsuk a JSON struktúra szintaktikai szabályait, különben hibát fog dobni a frissítő.
Elsősorban a sorok végi vesszőkre kell figyelnünk. Tehát ha egy blokkba beteszünk egy újabb sort, akkor ügyeljünk, hogy az előző sort vesszővel zárjuk, ami után bekerült az újabb sor.
A fenti részekben csak azért kommenteltem, hogy jobban érthető legyen a beillesztés menete.
Ezután nyissuk meg az új Drupal kiadásban lévő (8.8.0) composer.json fájlt, majd tegyük be a megfelelő helyekre ezeket a módosításokat. Ennek megfelelően nálam így néz ki az új composer.json fájl:
{
"name": "drupal/legacy-project",
"description": "Project template for Drupal 8 projects with composer following drupal/drupal layout",
"type": "project",
"license": "GPL-2.0-or-later",
"homepage": "https://www.drupal.org/project/drupal",
"support": {
"docs": "https://www.drupal.org/docs/user_guide/en/index.html",
"chat": "https://www.drupal.org/node/314178"
},
"repositories": [
{
"type": "composer",
"url": "https://packages.drupal.org/8"
},
{
"type": "package",
"package": {
"name": "jackmoore/colorbox",
"version": "1.6.4",
"type": "drupal-library",
"dist": {
"url": "https://github.com/jackmoore/colorbox/archive/1.6.4.zip",
"type": "zip"
}
}
}
],
"require": {
"composer/installers": "^1.2",
"drupal/core-composer-scaffold": "^8.8",
"drupal/core-project-message": "^8.8",
"drupal/core-recommended": "^8.8",
"drupal/core-vendor-hardening": "^8.8",
"drush/drush": "^9.2",
"jackmoore/colorbox": "1.6.4",
"drupal/geshifilter": "^1.2",
"drupal/amptheme": "^1.0",
"drupal/superfish": "^1.2",
"drupal/amp": "^2.1",
"masterminds/html5": "2.3.1"
},
"require-dev": {
},
"conflict": {
"drupal/drupal": "*"
},
"minimum-stability": "dev",
"prefer-stable": true,
"config": {
"sort-packages": true
},
"extra": {
"drupal-scaffold": {
"locations": {
"web-root": "./"
}
},
"installer-paths": {
"core": ["type:drupal-core"],
"libraries/{$name}": ["type:drupal-library"],
"modules/contrib/{$name}": ["type:drupal-module"],
"profiles/contrib/{$name}": ["type:drupal-profile"],
"themes/contrib/{$name}": ["type:drupal-theme"],
"drush/Commands/contrib/{$name}": ["type:drupal-drush"],
"modules/custom/{$name}": ["type:drupal-custom-module"],
"themes/custom/{$name}": ["type:drupal-custom-theme"]
},
"drupal-core-project-message": {
"include-keys": ["homepage", "support"],
"post-create-project-cmd-message": [
"<bg=blue;fg=white> </>",
"<bg=blue;fg=white> Congratulations, you’ve installed the Drupal codebase </>",
"<bg=blue;fg=white> from the drupal/legacy-project template! </>",
"<bg=blue;fg=white> </>",
"",
"<bg=yellow;fg=black>Next steps</>:",
" * Install the site: https://www.drupal.org/docs/8/install",
" * Read the user guide: https://www.drupal.org/docs/user_guide/en/index.html",
" * Get support: https://www.drupal.org/support",
" * Get involved with the Drupal community:",
" https://www.drupal.org/getting-involved",
" * Remove the plugin that prints this message:",
" composer remove drupal/core-project-message"
]
}
}
}
Később még javítanunk kell ebben, most szándékosan benne hagytam egy kompatibilitási hibát okozó verziószámot, hogy majd az esetleges hibák orvoslását is el tudjuk végezni. Egyelőre most csak mentsük le ezt a composer.json fájlt egy külön helyre. Ha viszont tesztkörnyezetben dolgozunk, akkor már le is menthetjük a helyére.
.htaccess
A .htaccess fájlban is történt változás, viszont itt csak egy apróbb. Ezért ha már vannak saját kiegészítéseink benne, akkor egyszerűbb, ha ezt az apró változtatást végezzük el a sajátunkban.
A diff paranccsal lekérjük a két Drupal kiadás .htaccess fájljai közötti eltérést. Nálam a tesztkörnyezetem tárhelyének tmp könyvtárába le van töltve mindkét Drupal telepítőcsomag, így az alábbi paranccsal kényelmesen listázhatom ki a különbségeket:
diff drupal-8.7.10/.htaccess drupal-8.8.0/.htaccess
A kimeneten pedig jól látszik, hogy egyetlen sorban van csak eltérés:
Másoljuk ki a második példányt – ami az újabb fájból származik – majd illesszük be a .htaccess fájlunkba az eredeti sort felülírva. Ezt elvégezhetjük az éles oldalon is, nem fog hibát okozni.
settings.php
És végül a settings.php fájlban kell még elvégeznünk pár apróságot. A settings.php a Drupal webgyökérben lévő sites/default alkönyvtárában található, ami alapból írásvédett. Ahhoz hogy bele tudjunk nyúlni, előbb hozzá kell adni az írás jogot a fájlhoz. Ehhez a Drupal példányunk webgyökerében állva hajtsuk végre a következő parancsokat:
cd sites/default/
chmod u+w settings.php
Majd nyissuk meg szerkesztésre:
nano settings.php
És keressük meg az alábbi részt:
$config_directories['sync'] = 'beállított útvonalunk';
És módosítsuk erre:
$settings['config_sync_directory'] = 'beállított útvonalunk';
Majd pedig keressük ezt:
$config['system.file']['path']['temporary'] = 'temp könyvtárunk útvonala';
És cseréljük ki erre:
$settings['file_temp_path'] = 'temp könyvtárunk útvonala';
Tehát ezeknél a tömb változók és indexeik kerülnek lecserélésre, megtartva a benne lévő értékünket. Forrás.
Végül mentsük le a fájlt, és vegyük le róla az írás jogot:
chmod u-w settings.php
Alaprendszer frissítése
Ha megvagyunk a fenti fájlok módosításával, nekiállhatunk a frissítésnek.
Karbantartási mód
Első lépésként állítsuk az oldalt karbantartási módba, ahogyan az előző leírásban is tettük.
Fájlstruktúra műveletek
Következő lépésként írjuk felül a módosított fájlokkal az eredetieket, amennyiben nem a cél helyeken végeztük el a változtatásokat.
Ezután lépjünk be a Drupal rendszerünk webgyökerébe, és töröljük a core/ és vendor/ alkönyvtárakat. Ezek a könyvtárak tartalmazzák a Drupal alaprendszerét, valamint a 3. felektől származó modulokat. A saját beállításaink nem vesznek el, azok nem ezekben a könyvtárakban kerülnek tárolásra.
Lépjünk tehát a Drupal rendszerünk webgyökerébe, és adjuk ki a törlő parancsot:
rm -rf core/ vendor/
Ezután még töröljük le a composer.lock fájlt is, amit az ez után következő frissítés újra fog építeni:
rm composer.lock
Valamint adjunk írás jogot a sites/default könyvtárra. Alapból biztonsági okok miatt a rendszer leveszi erről a könyvtárról az írásjogot, viszont a composer futása közben törölni akarja ebből a könyvtárból a default.services.yml fájlt, hogy felülírja az újjal. Viszont jogosultság hiányában nem tudja törölni, ezért hibaüzenettel leáll a frissítés. Hogy ezt elkerüljük, adjunk tehát írásjogot erre a könyvtárra a webgyökérben futtatott paranccsal:
chmod +w sites/default/
Frissítés a composer paranccsal
A webgyökérben maradva futtassuk az alábbi parancsot:
composer update --with-dependencies
Eltérően a korábbi frissítős leírás ezen részétől itt most nem másoljuk be az új telepítőcsomagból a core és vendor könyvtárakat (persze így is lehetne), hanem egy teljes frissítést futtatunk, ami letölt minden szükséges csomagot, és újraépíti a core és a vendor könyvtárainkat a megfelelő verziókból álló komponensekkel.
Ha szerencsénk van, akkor minden lefut hibátlanul. Ebben az esetben ugorjuk is át a következő részt.
Kompatibilitási hibák elhárítása
Ha nincs szerencsénk, akkor a composer parancs leáll valamilyen hibaüzenettel. Ilyenkor rögtönöznünk kell, de ahogy fentebb már említettem, szándékosan benne hagytam egy nem megfelelő verziószámot a saját composer.json példámban, hogy itt most be tudjam mutatni ennek a fajta hibának a kiküszöbölését.
Nálam tehát megszakadt a frissítés az alábbi hibaüzenettel:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- drupal/core-recommended 8.9.x-dev requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- drupal/core-recommended 8.8.x-dev requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- drupal/core-recommended 8.8.0-rc1 requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- drupal/core-recommended 8.8.0-beta1 requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- drupal/core-recommended 8.8.0-alpha1 requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- drupal/core-recommended 8.8.0 requires masterminds/html5 2.3.0 -> satisfiable by masterminds/html5[2.3.0] but these conflict with your requirements or minimum-stability.
- Installation request for drupal/core-recommended ^8.8 -> satisfiable by drupal/core-recommended[8.8.0, 8.8.0-alpha1, 8.8.0-beta1, 8.8.0-rc1, 8.8.x-dev, 8.9.x-dev].
Ilyen akkor jön elő, hogyha a composer.json fájlban a "require" részben nem megfelelő verzió van megadva az aktuális alaprendszer számára.
Ugyan pontosan másoltam át a régi composer fájlomból a változott részeket, de ehhez az új alaprendszerhez nem felel meg ennek a komponensnek ez a verziója.
A megoldás
Nyissuk meg szerkesztésre a composer.json fájlunkat, és állítsuk át a hibaüzenetben feltüntetett verziószámra a megfelelő részt. Tehát nálam az alábbi sort kellett módosítanom:
"masterminds/html5": "2.3.1"
Erre:
"masterminds/html5": "2.3.0"
Tehát az újabb alaprendszernek valahogy inkább egy alacsonyabb verziójú mastermind/html5 csomag kellett.
A hibaüzenetünknek megfelelően javítsuk a composer.json fájlban lévő verziószámot, majd futtassuk újra a composer parancsot:
composer update --with-dependencies
Frissítés normál lefutása
Ha minden rendben zajlik, akkor elindul a frissítés, és a csomagok letöltése:
Hosszasan töltögeti a csomagokat, majd utána jönnek a javaslatok, hogy melyik csomag helyett mit használjunk inkább, stb. Ezekkel vagy foglalkozunk, vagy nem, nem számítanak hibának. Végül pedig felépíti a composer.lock fájlt:
Adatbázis frissítése a drush paranccsal
Ha minden szépen lefutott, akkor jöhet az adatbázis frissítése. Ezt elvégezhetjük a weben is az update.php futtatásával is, de én inkább a drush parancsot javaslom, mert itt ha bármi gond van, részletes tájékoztatást kapunk a problémáról. Ezzel szemben a webes frissítés ilyenkor megszakad egy Internal Server Error hibaüzenettel, amiből nem sokat tudunk meg, csak ha nekiállunk bogarászni a PHP hiba napló fájlokat.
Amennyiben nem rendelkezünk még a drush pranccsal, a korábbi leírásból megtudhatjuk, hogyan telepítsük azt.
Futtassuk tehát a drush-féle adatbázis frissítést a Drupal webgyökeréből végrehajtott paranccsal:
vendor/bin/drush updatedb
Ekkor felsorolja az esetleges frissíteni valókat, amikre természetesen nyomjunk Entert:
Itt elég sok mindent kellett frissítenie a rendszernek ebben a 8.8.0 kiadásban, de hiszen pont emiatt is készítettem el ezt a leírást, mert itt több változás történt, mint egy átlagos alaprendszer frissítésnél.
A parancs lefuttatja a szükséges frissítéseket, majd visszakapjuk a shell-ünket. Ilyenkor én még a biztonság kedvéért ki szoktam olvasni a ? környezeti változó értékét is, hogy biztos lehessek benne hogy nem volt semmi hiba:
echo $?
Cahce törlése és a rendszer állapotának lekérdezése
Ezután töröljük a cache-t:
vendor/bin/drush cr
Végül lekérdezzük a rendszerünk állapotát:
vendor/bin/drush status
Ha minden jól ment, akkor ilyesmi kimenetet kapunk:
Konklúzió
Nálam konkrétan így zajlott ennek a Drupal alapú oldalnak a frissítése, ami kicsit szöszölősebb volt, mint egy sima alverzió frissítés, de kis türelemmel ez is könnyedén elvégezhető.
A frissítés bonyolultsága attól függ, hogy ki mennyi és milyen – Composerrel telepített – modulokat használ az alaprendszeren kívül, ezért ez a forgatókönyv mindenkinél eltérő lehet. Az alap menet azonban minden esetben ugyanaz, így ha ez alapján haladunk, akkor kevesebb hibába ütközhetünk.
- Drupal 8 alaprendszer frissítése egyszerűen
- Drupal 8 CMS rendszer telepítése, élesztése
- Drupal 9 CMS rendszer telepítése, élesztése
- Drupal 9 alaprendszer frissítése kétféle módszerrel
- Enciklopédia - Composer
- Enciklopédia - Drush
- Mit tegyünk, ha a Composer PHP csomagkezelő nagyon lassan halad, akadozik a projektek frissítése közben
- Hogyan távolítsuk el az index.php részeket Drupal alapú CMS rendszerünk URL címeiből
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 85 megtekintés