2014-10-09 3 views
38

haben wir eine Mischung aus verschiedenen PHP-Versionen laufen auf den Servern (max 5.3.5) und Entwicklungsmaschinen (max 5.5.9) erforderlich ist.Force-Komponist PHP Version zwischen Version X und Y Version

Nun sind wir auf das Problem gestoßen, dass wir ein "Composer-Update" durchgeführt haben, um die neueste Version einiger externer Bundles zu erhalten. Da Ihr composer.json sieht aus wie

"require": { 
     "php": ">=5.3.3", 
     ..... 
    }, 

wir einige Bundles erhalten, die PHP 5.5 benötigt. Kein Problem auf unseren dev Maschinen, sondern auf dem Server :(

Gibt es eine Möglichkeit, Komponisten zu sagen, eine PHP-Version zwischen 5.3.3 und 5.3.5? Oder max verfügbar Version?

Ich habe versucht, zu verlangen,

"require": { 
     "php": ">=5.3.3, <=5.3.5", 
      ..... 
     }, 

und

"require": { 
      "php": "<=5.3.5", 
       ..... 
      }, 

aber beide nicht geklappt hat. ich bekommen ein „Das angeforderte Paket php nicht in jeder Version gefunden werden kann, da in dem Paketnamen ein Tippfehler sein können.“ Error.

Irgendwelche Ideen? Vielen Dank im Voraus

+2

https://getcomposer.org/doc/01-basic-usage.md#package-versions – Blackhole

Antwort

29

Ich finde es fraglich, um wenigstens zu sagen, dass Sie mit dem neuesten verfügbaren PHP entwickeln und Produktion mit einer sehr veralteten Version laufen. Es wird viele mögliche Probleme geben, nicht nur wegen der Sicherheitspatches, die Sie verpassen würden, sondern vor allem wegen der PHP-Bugfixes, die hauptsächlich in den Versionen 5.3.9 und 5.3.23 eingeführt wurden, die das PHP-Verhalten in einigen ändern Details ziemlich grundlegend. Ich spreche nicht über das Risiko, versehentlich Funktionen von 5.4 oder 5.5 zu verwenden.

Und es gibt wirklich keine Möglichkeit, Composer mit dieser Situation umzugehen. Die PHP-Version, die verwendet wird, wenn composer update ausgeführt wird, bestimmt die Auflösung von Abhängigkeiten, die von PHP-Version und installierten PHP-Erweiterungen beeinflusst werden.

Sie können nicht definieren, dass ein Paket nur für PHP-Versionen zwischen 5.3.3 und 5.3.5 verwendet werden soll, wenn das PHP, das Sie für das Update verwenden, nicht mit dieser Version übereinstimmt. Da die verwendete PHP-Version die obere Versionsbeschränkung überschreitet, kann ein solches Paket die Versionsanforderung nicht erfüllen, und Composer meldet, dass kein Paket gefunden wurde (nicht, dass es die Pakete gesehen hat, aber aufgrund von die Versionsbeschränkung).

Es gibt wahrscheinlich drei offensichtliche Auswege:

  1. degradieren Ihre Entwicklungsumgebung der Fertigungsversion Sie wirklich verwenden. Wenn mehr als einer verwendet wird: Der älteste. Auf diese Weise werden alle Anforderungen für PHP-Versionen erfüllt. Führen Sie dann composer update aus, und Sie sind fertig.

  2. Aktualisieren Sie Ihre Produktionsumgebung. Braucht keine weitere Erklärung, aber ich muss erwähnen, dass Sie nicht nur viele sehr schöne PHP-Funktionen vermissen, sondern auch eine wesentliche Leistungssteigerung vermissen, denn PHP 5.5 ist wirklich so viel schneller als 5.3.

  3. Fügen Sie der Composer.json des globalen Netzwerks oder des Projekts eine "platform.php" -Konfiguration hinzu. Dadurch wird Composer angewiesen, die PHP-Version mit Composer selbst zu überschreiben und stattdessen die Abhängigkeiten mit dieser anderen PHP-Version zu berechnen. composer config -g platform.php 5.3.5 für globale Einstellung (wirkt sich auf alle weiteren Composer-Läufe aus), ohne -g für lokale Einstellung (wirkt sich nur auf Composer-Operationen in diesem Projekt aus, falls Sie mehr als ein Projekt mit verschiedenen Produktionsversionen von PHP entwickeln).

+1

Ich habe eine neue dritte Option hinzugefügt, die für neuere Versionen von Composer gültig sein sollte, wahrscheinlich ab 1.0.0-beta1 und höher (ich werde jetzt nicht in die Alpha Release Notes einsteigen, um es dir genau zu sagen) . Verwenden Sie einfach die stabile Version 1.0.0. – Sven

+0

Wie wäre es mit 'composer.lock'? – Arcesilas

+0

@Arcesilas Was meinst du? Die Frage bezieht sich im Wesentlichen darauf, wie Composer während eines Updates ** auf die Auswahl von Paketen für zu erweiterte PHP-Versionen ** beschränkt werden kann - daher ist die Sperrdatei in diesem Kontext bedeutungslos, obwohl sie das Ergebnis eines Updates beeinflusst. – Sven

6

Was ist die Tilde Betreiber

Tilde Operator ~ 1.2 Sehr nützlich für Projekte versuchen, die semantische Versionierung folgen. ~ 1.2 ist entspricht> = 1.2, < 2.0. Für weitere Details lesen Sie den nächsten Abschnitt unten.

nächste signifikante Freisetzung (Tilde Operator) #

Der Operator ~ am besten durch Beispiel erklärt: ~ 1.2 entspricht

= 1,2, < 2.0, während ~ 1.2. 3 ist äquivalent zu> = 1.2.3, < 1.3. Wie Sie sehen können, ist es vor allem für Projekte nützlich, die die semantische Versionierung berücksichtigen. Eine übliche Verwendung wäre, die minimale Nebenversion zu markieren, auf die Sie angewiesen sind, etwa ~ 1,2 (was alles erlaubt, aber nicht einschließlich, 2,0). Da theoretisch bis 2.0 keine Abwärtskompatibilitätspausen auftreten sollten, funktioniert das gut. Eine andere Betrachtungsweise ist, dass die Verwendung von ~ eine Mindestversion angibt, aber die zuletzt angegebene Zahl erhöht werden kann.

Hinweis: Obwohl 2,0-beta.1 ausschließlich vor 2.0 ist eine Version Einschränkung wie ~ 1.2 wäre es nicht installieren. Wie oben gesagt ~ 1.2 bedeutet, dass nur die 0,2 aber der 1. Teil befestigt ist, ändern kann.

Hinweis: Der Operator ~ hat eine Ausnahme für das Verhalten der Hauptversionsnummer. Dies bedeutet für Beispiel, dass ~ 1 ist das gleiche wie ~ 1.0, da es nicht die Major-Nummer zu erhöhen versuchen Abwärtskompatibilität zu ermöglichen.

+0

Blackhole dort installieren gerade vor mir ... – Billy

2

Versuchen Sie, diese (Komma entfernen):

"require": { 
    "php": ">=5.3.3 <=5.3.5", 
     ..... 
    }, 
39

Da die Konfigurationsparameter in composer.json zur Verfügung steht. Man könnte so etwas wie folgt aus:

{ 
    "name": ".../...", 
    "config": { 
     "platform": { 
      "php": "5.3.5" 
     } 
    }, 
    "require": { 
     ... 
    } 
} 

https://getcomposer.org/doc/06-config.md#platform

+3

Obwohl dieser Parameter angegeben ist, installiert die Bibliothek immer noch eine Version, die größer als die angegebene PHP-Version ist. Zum Beispiel habe ich PHP Version 5.4.36 angegeben, aber Composer installiert immer noch Symfony Version 3.1.3, die 5.5+ benötigt. Fazit: funktioniert nicht. – Raptor

+0

Plattform ist vor allem zu lassen Sie gefälschte Plattform-Pakete (PHP und Erweiterungen), so dass Sie eine Produktion env emulieren können. require ist eine bessere Wahl zwischen Version X und Version Y –

+0

Das hat gut für mich funktioniert! Ich musste Pakete installieren, die mit PHP <= 7.0.16 kompatibel waren. – StockBreak

0

Entfernen Sie Ihre composer.lock und Anbieter Verzeichnis.

Jetzt Plattform Option Komponist platzieren.json

"config": { 

    "platform": { 
     "php": "7.0" 
    } 

}, 

und schließlich laufen Befehl Komponist