Kolize mezi required verze PHP v composer.json a zapnutou verzí PHP syntaxe v PHPstormu

m.brecher
Generous Backer | 871
+
0
-

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
+
0
-

A proč chceš mít v composer.json jinou verzi PHP než kterou používáš? 🤷‍♂️

Marek Bartoš
Nette Blogger | 1274
+
0
-

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
+
0
-

@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
+
-3
-

@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í.

nightfish
Člen | 518
+
+1
-

@mbrecher PHPStorm nemá bug, nýbrž nastavení – Settings → PHP → Composer → Synchronize IDE settings with composer.json
Když si ten checkbox odškrtneš, tak se ti verze PHP automaticky měnit podle composer.json nebude.

Ozzrel
Generous Backer | 54
+
0
-

V Composeru nastavuješ verzi provozovaného PHP v platfom

    "config": {
        "platform": {
            "php": "8.1.10"
        }
    }

podle toho pak celý Composer loví ostatní

Šaman
Člen | 2662
+
+3
-

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
+
0
-

@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
+
0
-

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
+
+2
-
  • 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 > phpconfig > platform > php
  • composer.lock tě nezajímá, ani ho needituj, můžeš ho stejně jako složku vendor kdykoliv smazat a obnoví se příkazem composer install
Ozzrel
Generous Backer | 54
+
0
-

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
+
0
-

@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
+
0
-

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ěží.