2015-07-07 12 views
8

Ho un progetto che contiene, tra gli altri, i seguenti composer.json dipendenze:Le singole dipendenze del Composer possono essere soppresse dal caricamento (automatico)?

"propel/propel1": "dev-master"`, 
"halleck45/phpmetrics": "dev-master" 

Recentemente ho fatto un composer update e ha scoperto che una nuova versione di una libreria richiesta da PhpMetrics, chiamato Hoa, introduce una nuova classe \EngineException a emulare una nuova classe PHP7. Sfortunatamente, Propel 1 definisce anche \EngineException e quindi risulta un conflitto.

La correzione corretta per questo sarebbe l'aggiornamento a Propel 2, che utilizza gli spazi dei nomi. Tuttavia questo è ancora in alpha ed è soggetto alle interruzioni di BC, quindi non è davvero praticabile per me.

mio attuale correzione è quello di bloccare Hoa a una versione specifica che non ha la nuova classe:

"hoa/core": "2.15.04.*" 

che non è una cattiva soluzione, ma non è del tutto soddisfacente per bloccare una libreria per un vecchio versione.

Nel codice Hoa, l'unico modo per non caricare la nuova classe è eseguire PHP 7, che non è ancora possibile. Tuttavia, mi viene anche in mente che Hoa deve solo essere require d quando PhpMetrics viene eseguito. Questo è uno strumento di analisi del codice stand-alone e si trova solo nella radice del progetto per comodità; il resto del progetto non usa questa libreria.

Quindi, sarebbe bello se potessi chiamare qualcosa in Composer per chiedere che questa classe non sia (automatica) caricata, o forse qualcosa che faccia lo stesso nel composer.json. Al momento è caricato inutilmente, non so se è stato caricato automaticamente in modo errato o se è in corso require d da Composer.

Può essere utile sapere che le classi Hoa sono state aggiunte da Composer allo script generato automaticamente autoload_psr4.php. Per quanto posso fare, understand the docs, questo significa che è caricato automaticamente, e nel mio progetto non c'è nulla che richiederebbe una delle classi Hoa.

+0

Dipende da come la classe è caricato automaticamente. Il normale caricamento automatico non dovrebbe causare danni, poiché dovrebbe fermarsi dopo che la classe è stata trovata una sola volta, presupponendo che entrambi offrano la stessa funzionalità. Se, tuttavia, il file viene caricato automaticamente con il caricatore automatico "file", non c'è molto che tu possa fare. Vedi https://getcomposer.org/doc/04-schema.md#autoload –

+0

Grazie a @Bert. Il tuo commento mi induce a pensare che l'approccio di Hoa sia infranto: la classe '\ EngineException' [appare in un file chiamato Consistency.php] (https://github.com/hoaproject/Core/blob/2.15.07.05/Consistency.php # L952), quindi la classe di eccezioni viene caricata indipendentemente dal fatto che mi piaccia o meno. Tuttavia, non so cosa costringa Consistency.php a caricare - che semplicemente non è richiesto dal mio progetto. – halfer

risposta

2

Ero curioso, così ho cercato. Hoa infatti ha un approccio non funzionante, avendo sempre incluso il file Core.php da un "file" autoload nel compositore che a sua volta include Consistency.php. Quest'ultimo definisce la tua classe.

È possibile sollevare un problema con gli sviluppatori di Hoa, per utilizzare il metodo class_exists per verificare il metodo anziché il controllo della versione di prova che stanno utilizzando. Ciò potrebbe causare il caricamento automatico del caricatore automatico di propel. Un altro modo sarebbe definire il loro autoloading correttamente, ma preferiscono caricare manualmente come sembra.

+0

Aha, buon punto! Dato che 'Core' appare in' autoload_psr4.php', non pensavo che sarebbe apparso in 'autoload_files.php'. Bel lavoro, rilascerò un biglietto con loro per vedere se possono passare a un approccio di autoloading appropriato. – halfer

+0

[Problema archiviato] (https://github.com/hoaproject/Core/issues/88) con gli sviluppatori Hoa. – halfer

3

Risolto da https://github.com/hoaproject/Core/commit/8ed00fe9345c4f8b2679a256926d6d24994ea842.

La nuova architettura di eccezione introdotta in PHP7 [1] è stata completamente ridisegnata [2]. Questa patch aggiorna le classi di compatibilità retro in base a questa nuova architettura. Di conseguenza, è stata rimossa la classe , insieme a EngineException e ParseException. Sebbene questi ultimi possano essere implementati (non come ), preferiamo, finora, implementare solo l'interfaccia Throwable. Vediamo se possiamo implementare (ancora per la retro-compatibilità) la classe Error, TypeError e ParseError.

[1]

: https://wiki.php.net/rfc/engine_exceptions_for_php7

[2]: rfc/throwable interfaccia

+0

Grazie ancora Ivan, e benvenuti a Stack Overflow ':-)'. – halfer

Problemi correlati