Composer tiene la opción de cargar varias dependencias solo mientras está en desarrollo, por lo que las herramientas no se instalarán en producción (en el servidor en vivo). Esto es (en teoría) muy útil para los scripts que solo tienen sentido en el desarrollo, como pruebas, herramientas de datos falsos, depurador, etc.
El camino a seguir es agregar un require-devbloque adicional con las herramientas que necesita en dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
y luego (teóricamente) cargar estas dependencias a través de
composer install --dev
Problema y pregunta:
Composer ha cambiado el comportamiento de forma dramática instally updateen 2013, las require-devdependencias ahora están instaladas por defecto (!), Siéntase libre de crear un composer.json con un require-devbloque y ejecutar un composer installpara reproducir.
Como la forma más aceptada de implementar es presionar al compositor. bloquear (que contiene la configuración actual de su compositor) y luego hacer un composer installen el servidor de producción, esto también instalará las cosas de desarrollo.
¿Cuál es la forma correcta de implementar esto sin instalar las dependencias -dev?
Nota: Estoy tratando de crear un Q / A canónico aquí para aclarar la extraña implementación de Composer. Siéntase libre de editar esta pregunta.
fuente

composer.locknunca debe agregarse al repositorio de Git, NUNCA. El enfoque correcto es utilizar la actualización del compositor en la preparación y luego sincronizar el archivo en producción (si todo funciona, por supuesto). La puesta en escena debe ser la copia exacta de un entorno de producción.composer.lockdebe ser parte de.gitignore.Respuestas:
Por qué
En mi humilde opinión, hay una buena razón por la cual Composer usará la
--devbandera de forma predeterminada (en instalación y actualización) hoy en día. Composer se ejecuta principalmente en escenarios donde este es el comportamiento deseado:El flujo de trabajo básico de Composer es el siguiente:
composer.phar install --devarchivos json y lock se confirman en VCS.composer.phar install --dev.composer.phar require <package>agregue--devsi desea el paquete en larequire-devsección (y commit).composer.phar install --dev.composer.phar update --dev <package>(y commit).composer.phar install --dev.composer.phar install --no-devComo puede ver, el
--devindicador se usa (mucho) más que el--no-devindicador, especialmente cuando aumenta el número de desarrolladores que trabajan en el proyecto.Despliegue de producción
Bueno, el archivo
composer.jsonycomposer.lockdebe estar comprometido con VCS. No lo omitacomposer.lockporque contiene información importante sobre las versiones de paquetes que deben usarse.Al realizar una implementación de producción, puede pasar el
--no-devindicador a Composer:El
composer.lockarchivo puede contener información sobre paquetes de desarrollo. Esto no importa La--no-devbandera se asegurará de que esos paquetes de desarrollo no estén instalados.Cuando digo "despliegue de producción", me refiero a un despliegue destinado a ser utilizado en producción. No estoy discutiendo si se
composer.phar installdebe hacer en un servidor de producción o en un servidor de ensayo donde las cosas se pueden revisar. Ese no es el alcance de esta respuesta. Simplemente estoy señalando cómo hacerlocomposer.phar installsin instalar dependencias "dev".Sin relación
El
--optimize-autoloaderindicador también puede ser deseable en la producción (genera un mapa de clase que acelerará la carga automática en su aplicación):O cuando se realiza la implementación automatizada:
Si su base de código lo admite, puede cambiarlo
--optimize-autoloaderpor--classmap-authoritative. Más información aquí.fuente
--optimize-autoloader. Considere también--classmap-authoritative: de la documentación aquí getcomposer.org/doc/03-cli.md puede ver esto: "Clases de carga automática solo desde el mapa de clase. Activa implícitamente --optimize-autoloader" para que pueda usarlo si conoce las clases "son allí ", que probablemente debería ocurrir en su entorno de producción a menos que genere clases dinámicamente.optimize-autoloaderdirectamente encomposer.json:{"config": { "optimize-autoloader": true } }En realidad, recomendaría encarecidamente CONTRA instalar dependencias en el servidor de producción.
Mi recomendación es verificar el código en una máquina de implementación, instalar dependencias según sea necesario (esto incluye NO instalar dependencias de desarrollo si el código va a producción) y luego mover todos los archivos a la máquina de destino.
¿Por qué?
composer installLarga historia corta: use Composer en un entorno que pueda controlar. Su máquina de desarrollo califica porque ya tiene todas las cosas necesarias para operar Composer.
El comando a usar es
Esto funcionará en cualquier entorno, ya sea el servidor de producción en sí, o una máquina de implementación, o la máquina de desarrollo que se supone que debe hacer una última verificación para determinar si algún requisito de desarrollo se usa incorrectamente para el software real.
El comando no instalará ni desinstalará activamente los requisitos de desarrollo declarados en el archivo composer.lock.
Si no le importa implementar componentes de software de desarrollo en un servidor de producción, la ejecución
composer installharía el mismo trabajo, pero simplemente aumentaría la cantidad de bytes movidos y también crearía una declaración de autocargador más grande.fuente
app-1.34.pharetc.). Hay un mecanismo separado que se notifica y decide cuándo tomar ese archivo, a dónde transferirlo y luego qué hacer con él. Algunos equipos optan por desempaquetar el phar una vez que está en el servidor y algunos equipos lo ejecutan tal cual. Ha prestado mucha confianza a la estabilidad y reproducibilidad de nuestros despliegues.Ahora
require-devestá habilitado de forma predeterminada, para el desarrollo local puede hacerlocomposer installycomposer updatesin--devopción.Cuando desee implementar en producción, deberá asegurarse de
composer.lockque no tenga ningún paquete que provenga derequire-dev.Puedes hacer esto con
Una vez que haya probado localmente
--no-dev, puede implementar todo en producción e instalar segúncomposer.lock. Necesita la--no-devopción nuevamente aquí; de lo contrario, el compositor dirá "El archivo de bloqueo no contiene información de solicitud de desarrollo" .Nota: ¡ Tenga cuidado con cualquier cosa que tenga el potencial de introducir diferencias entre desarrollo y producción! Generalmente trato de evitar require-dev siempre que sea posible, ya que incluir herramientas de desarrollo no es una gran sobrecarga.
fuente
composer.lockdependencias de desarrollo. Simplemente ejecutarácomposer install --no-dev, y obtendrá solo las dependencias regulares instaladas; de hecho, Composer también eliminará cualquier dependencia de desarrollo en este paso.composer.locktuviera dependencias de desarrollo (y potencialmente afectara las versiones de los paquetes que no son de desarrollo), me gustaría actualizarlo para reflejar cómo estaría en producción. Esto también te obliga a corrercomposer install --no-deven producción, como locomposer installhará el error. Técnicamente creo que tienes razón; esto no es obligatorio, pero es un nivel adicional de seguridad, que me gusta.dev/toolyprod/lib:~1.0. El prod / lib más nuevo es 1.3, pero también se requiere dev / toolprod/lib:1.1.*. Resultado: instalará la versión 1.1.9 (la más nueva de la rama 1.1.x) y la usará durante su desarrollo. Yo diría que NO es seguro simplemente actualizar--no-dev, por lo tanto, incluya el prod / lib 1.3 más nuevo y asuma que todo funciona sin pruebas. Y tal vez las pruebas sean imposibles debido a la falta de desarrollo / herramienta. Supongo que debido a que dev / tool no es necesario en la producción, no debe implementarse, pero el software debe usar prod / lib 1.1.9 entonces.--no-deventonces necesita probarlo localmente, como mencioné en la respuesta. Todavía recomiendo no usar--no-deven absoluto.composer updateluego haz algo de desarrollo, luego hazlocomposer update --no-dev, luego haz las pruebas de lanzamiento, luego pasa a producción y hazlocomposer install --no-dev. Dos problemas: 1. No puedo probar la versión sin dependencias de desarrollo, y 2. No puedo instalar con, por ejemplo, Git en producción.En servidores de producción renombre
vendoravendor-<datetime>, y durante el despliegue tendrá dos directorios de proveedores.Una cookie HTTP hace que mi sistema elija el nuevo proveedor
autoload.php, y después de probarlo, realizo un cambio totalmente atómico / instantáneo entre ellos para deshabilitar el antiguo directorio del proveedor para todas las solicitudes futuras, luego elimino el directorio anterior unos días después.Esto evita cualquier problema causado por los cachés del sistema de archivos que estoy usando en apache / php, y también permite que cualquier código PHP activo continúe usando el directorio del proveedor anterior.
A pesar de otras respuestas que recomiendan no hacerlo, personalmente ejecuto
composer installen el servidor, ya que esto es más rápido que rsync desde mi área de preparación (una VM en mi computadora portátil).Yo uso
--no-dev --no-scripts --optimize-autoloader. Debe leer los documentos de cada uno para verificar si esto es apropiado para su entorno.fuente
Creo que es mejor automatizar el proceso:
Agregue el archivo composer.lock en su repositorio git, asegúrese de usar composer.phar install --no-dev cuando lo lance, pero en su máquina de desarrollo podría usar cualquier comando composer sin preocupaciones, esto no irá a producción, el Production basará sus dependencias en el archivo de bloqueo.
En el servidor, comprueba esta versión o etiqueta específica y ejecuta todas las pruebas antes de reemplazar la aplicación, si las pruebas pasan, continúa la implementación.
Si la prueba depende de las dependencias del desarrollador, ya que el compositor no tiene una dependencia del alcance de la prueba, se podría ejecutar una solución no muy elegante con las dependencias del desarrollador ( instalación composer.phar ), elimine la biblioteca del proveedor, ejecute la instalación composer.phar - -no-dev nuevamente, esto usará dependencias en caché, por lo que es más rápido. Pero eso es un truco si conoce el concepto de ámbitos en otras herramientas de compilación
Automatiza esto y olvida el resto, ve a tomar una cerveza :-)
PD .: Como en el comentario de @Sven a continuación, no es una buena idea no retirar el archivo composer.lock, porque esto hará que la instalación del compositor funcione como una actualización del compositor.
Podrías hacer esa automatización con http://deployer.org/ es una herramienta simple.
fuente
composer.lockharácomposer installactuar comocomposer update. Entonces, las versiones que implementa no son las que desarrolló. Es probable que esto genere problemas (y más aún a la luz del único problema de seguridad resuelto recientemente con "reemplazar" en Composer). NUNCA debe ejecutarsecomposer updatedesatendido sin verificar que no haya roto nada.