Kolize mezi required verze PHP v composer.json a zapnutou verzí PHP syntaxe v PHPstormu
- m.brecher
- Generous Backer | 871
Ahoj,
Při práci na Nette projektu je obvykle ideální zapnout stejnou verzi syntaxe PHP v PHPStormu aby odpovídala nainstalované verzi PHP na lokálním serveru.
Mám doma instalovánu verzi PHP 8.1 a stejnou verzi jsem si nastavil v PHPStormu Settings – PHP – PHP language level. Zapne se požadovaná syntaxe, ale když vypnu a zapnu PHPStorm znovu tak je na spodním baru vidět, že začal s původně nastavenou verzí PHP 8.1, ale potom přepnul automaticky na PHP 7.2 – hodnotu kterou si vzal z composer.json v rootu projektu (nebo něco okolo 7.2, to není důležité):
{
"name": "nette/web-project",
"description": "Nette: Standard Web Project",
"keywords": ["nette"],
"type": "project",
"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
"require": {
"php": ">= 7.2",
.......
composer zjevně nerespektoval ani reálně nainstalovanou verzi php, ani ručně nastavenou hodnotu PHP v Settings, ale nesmyslně nastavil php 7.2 z podmínky required php >= 7.2
Vyřešil jsem to tím, že jsem ručně „php“: „>= 7.2“ zeditoval na „php“: „>= 8.1“ a potom už jsem měl trvale správnou PHP syntaxi v IDE.
Otázka: Také jste někdo narazili na podobný problém a jak se Vám podařilo vyřešit, aby PHPstorm trvale nastavil syntaxi např. 8.1 a mohla se ponechat správná hodnota v composer.json php >= 7.2?
- David Grudl
- Nette Core | 8227
A proč chceš mít v composer.json jinou verzi PHP než kterou používáš? 🤷♂️
- Marek Bartoš
- Nette Blogger | 1274
aby PHPstorm trvale nastavil syntaxi např. 8.1 a mohla se ponechat správná hodnota v composer.json php >= 7.2
A v čem je ta hodnota správná? Jestli používáš kód fungující od 8.1, tak ti na 7.2 nebude fungovat a hodnota je tak špatná. web-project jen nastavuje minimální možnou verzi, na které funguje sám o sobě, nijak ti nevnucuje aby ses té minimální verze držel.
Nastavuje ti to Composer plugin a měl bys mu v tomto věřit.
- m.brecher
- Generous Backer | 871
@DavidGrudl
A proč chceš mít v composer.json jinou verzi PHP než kterou používáš?
Myslel jsem, že hodnotu kterou tam nastavil web-project při stažení bych měl spíš nechat na composeru, aby si to nastavoval sám. Sice jsem tam de facto dával tu verzi, kterou jsem měl instalovanou – ale kvůli tomu, aby mě phpstorm nechal zapnutou tu verzi PHP kterou chci.
Editoval m.brecher (14. 3. 2023 18:47)
- m.brecher
- Generous Backer | 871
@MarekBartoš
Nastavuje ti to Composer plugin a měl bys mu v tomto věřit.
Já composeru věřím a ani bych mu do update zasahovat nechtěl, ale obvykle se nesejde verze, kterou v composer.json nastaví composer a kterou si doma nainstaluji. A potom PHPstorm vždy po restartu IDE změní ručně nastavenou verzi PHP podle composer.json a mě nebaví každý den v každém projektu to vždycky nastavovat znovu. Proto jsem ručně editoval required verzi php v composer.json.
Nicméně PHPstorm má dle mého názoru bug v tom, že ručně nastavenou verzi PHP vždycky po restartu vymaže a nastaví si to podle composer.json, což je chování které smysl nedává. Poslal jsem Jetbrains bugreport, tak to snad opraví.
- Šaman
- Člen | 2662
Je jedno, že máš reálně verzi 8.1. Pokud máš v composeru
"php": ">= 7.2"
, tak říkáš, že ten projekt má běžet
i na PHP 7.2. Takže je správné, že se pro tuto verzi nastaví
i vývojové prostředí a například to všechny PHP8 fičury označí za
syntax error.
Takže jestli chceš používat vychytávky PHP8, projekt už nebude
kompatibilní s PHP7 a onen řádek s verzí PHP v composeru je potřeba
aktualizovat podle skutečnosti.
- m.brecher
- Generous Backer | 871
@nightfish
Díky, ano máš pravdu, PHPstorm nemá bug, ale moje hlava nemá dostatek znalostí. V projektech, kde není composer se PHP language level nastavuje ručně v Settings a zůstane trvale nastavená i po restartu IDE.
V projektech s composerem je základní filozofie úplně jiná – nejvyšší prioritu má nastavení composeru a podle něj se automaticky nastaví PHPstrom – viz dokumentace PHPstromu https://www.jetbrains.com/…er-page.html :
„Because composer.json contains the most up-to-date information about the project configuration, this automatic synchronization ensures that the Source and Test folders exactly match the project structure, and the correct PHP language level is set automatically.“
Z toho vyplývá i z toho, co napsali @Šaman a @Ozzrel , že je žádoucí ponechat na IDE nastavení verze PHP a naopak si zapsat do composer.json na jaké minimální verzi PHP má projekt běžet. IDE to pak nastaví správně. Takže v projektech s composerem ruční nastavení PHP language level NEPOUŽÍVAT!! A NEVYPÍNAT automatickou synchronizaci composer.json s IDE.
- m.brecher
- Generous Backer | 871
Díky @Šaman a @Ozzrel za jasné vysvětlení konfigurace composer.json. Composer.json je jasný, composer.lock částečně.
Když to shrnu, mám v projektu který startoval z nette/web-project v této chvíli tyto composer konfigurační soubory:
composer.json
{
"name": "nette/web-project",
"description": "Nette: Standard Web Project",
"keywords": ["nette"],
"type": "project",
"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
"require": {
"php": ">= 8.1",
"nette/application": "^3.1",
"nette/bootstrap": "^3.1",
....... atd...
a composer.lock
{
........ atd..,
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">= 8.1"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
}
Doma mám PHP 8.2.3, na production serveru 8.1.xx, aby to běželo doma i na produkci stejně, musím nastavit composer.json na tu nižší z verzí a všechny vyšší. IDE to bude podporovat automaticky.
Composer.lock chápu jako kontrolní informaci pro composer, jaké verze php a jiných knihoven jsou povinně vyžadovány na konkrétním serveru a pokud instalovaná verze php nesouhlasí, vyhodí composer výjimku.
Aby mě composer běžel doma i na produkci tam tam musím nastavit:
// composer-lock
"platform": {
"php": ">= 8.1"
}
@Ozzrel radil, abych tam deklaroval nainstalovanou verzi PHP přesně, jenže málokdy se verze doma a na produkci sejdou, obvykle na hostingu nejnovější verzi PHP instalují s víceměsíčním zpožděním. Musel bych řešit aby na produkci byl jiný composer.lock než doma. Proto mě přijde lepší tam dát úplně stejné nastavení jako je v composer.json. Pak bude možné mít stejný composer.json i composer.lock doma i na produkci.
Otázka: mám nastavovat verzi php v composer.lock ručně, nebo stačí nastavit php v composer.json a nechat composer, aby to nastavil v composer.lock automaticky?
- David Grudl
- Nette Core | 8227
- do
composer.json
nastav tu nižší (tedy nejmenší společnou) verzi, aby ti to fungovalo na všech prostředích - musíš ji zapsat na dvou místech (ano, je to dementní), v
require > php
aconfig > platform > php
composer.lock
tě nezajímá, ani ho needituj, můžeš ho stejně jako složkuvendor
kdykoliv smazat a obnoví se příkazemcomposer install
- Ozzrel
- Generous Backer | 54
Není potřeba udržovat žádný composer na produkci. Ideálně tam ani
composer.* soubory nepřenášíš. Jedině že tam budeš chtít pustit
sebemrskačsky composer update
a počkáš co se stane.
U sebe na lokále/vývoji si nastavíš platform
podle verze
PHP na produkci a tím zaručíš že to na produkci možná pojede.
- m.brecher
- Generous Backer | 871
@Ozzrel
Není potřeba udržovat žádný composer na produkci.
Dík za comment, máš pravdu, že composer pro update na produkci vlastně nepotřebujeme, ale nesprávně nastavený composer.lock může na produkci vyhodit chybové hlášení composeru, že není splněna minimální verze php a stránka se nevykreslí. Hlídat nějaký soubor, že se nikdy nesmí nahrát na produkci je otravné.
Mě přijde nejjednodušší řešení mít správně nastavenu minimální verzi php v composer.json i composer.lock na stejnou hodnotu tak, aby vyhověla doma i na produkci.
- Pavel Kravčík
- Člen | 1195
Ozzrel napsal(a):
Není potřeba udržovat žádný composer na produkci.
Composer.lock
se může hodit nějaký health check, kde co na
produkci běží.