2012-09-03 10 views
9

Estoy desarrollando un paquete - myvendor/mylib - que planeo distribuir usando Composer, probablemente a través de Packagist. Este paquete contiene, entre otras cosas, un script PHP de línea de comandos bin/console.php que me gustaría poner a disposición de los proyectos, digamos myvendor/mymain, que importan el paquete mylib.Script en la ruta de necesidades de dependencia al autocargador Composer

Soy consciente de que puedo especificar en el paquete mylib un entorno config en composer.json con una serie de contenedores para importar:

{ 
    "name": "myvendor/mylib", 
    "config" : { 
     "bin" : ["bin/console.php"] 
    } 
} 

Cuando el proyecto mymain Qué instala un compositor/actualización, entonces este mylib/bin/console.php es un enlace simbólico como mymain/bin/console.php Además, soy consciente de que el proyecto mymain puede especificar - en su propia composer.json - donde que quiere contenedores de dependencia a tener un enlace simbólico:

{ 
    "name": "myvendor/mymain", 
    "config": { 
     "bin-dir": "scripts" 
    } 
} 

En este caso, la secuencia de comandos de la consola se enlaza simbólicamente como scripts/console.php.

Esto funciona bien, y es genial ya que todos salen, por cierto. ;-)

Sin embargo, la secuencia de comandos bin/console.php sí necesita incluir el generado por el compositor vendor/autoloader.php. Al desarrollar mylib de forma aislada, el script bin/console.php conoce su propia ubicación relativa a vendor/autoloader.php, por lo que puede incluirla fácilmente. Pero una vez que se importa como una dependencia a otro proyecto - myvendor/mymain, en este caso - entonces solo está el script mymain/vendor/autoloader.php. En principio, el script de consola no puede saber dónde reside en relación con el script del autocargador.

Does Composer proporciona alguna variable de entorno (accesible para el script de la consola) que permite al script ubicar el script correcto vendor/autoloader.php?

Por cierto: soy consciente de la Composer CLI environment variable, así que me imagino que podría hacer que el requisito de que el proyecto de importación - mymain - definir el var COMPOSER_VENDOR_DIR (y exportación). Entonces mi script de consola puede usar eso para encontrar el autocargador del proyecto. Pero eso parece potencialmente problemático, ya que:

  1. Queremos que el ajuste sólo se aplique a este proyecto, sino una var cáscara (y una exportación) se aplicaría a todos proyectos que se accede desde esa sesión de terminal. Parece presuntuoso de mi pequeña dependencia - myvendor/mylib - imponer eso en un proyecto de importación.

  2. En principio, la dependencia en sí - myvendor/mylib - debe ser capaz de encontrar lo que necesita. No parece correcto ponerle la carga al importador.

WDYT? Gracias por adelantado. Ideas bienvenidas

Respuesta

3

Un enfoque (que salió de las conversaciones con @igorw en el IRC de freenode #composer que estoy parafraseando y en la que estoy un poco en expansión) es dejar que el script bin console.php iterar hasta el sistema de archivos, a partir de __DIR__, buscando la presencia de autoload.php.

+2

No necesita iterar en realidad, solo puede mirar dos directorios ya que coincidiría con // – Seldaek

+0

@Seldaek: Bien, finalmente entendí su muestra de [jsonlint] (https: // github.com/Seldaek/jsonlint/blob/master/bin/jsonlint) e implementado de esa manera. Muchas gracias! –

+0

Parece que la gente todavía tiene problemas con esto (¡yo!) Encontré una respuesta aquí: http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-cli-via -composer-as-independiente-y-como-depend – VladFr

Cuestiones relacionadas