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-dev
bloque 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 install
y update
en 2013, las require-dev
dependencias ahora están instaladas por defecto (!), Siéntase libre de crear un composer.json con un require-dev
bloque y ejecutar un composer install
para 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 install
en 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.lock
nunca 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.lock
debe ser parte de.gitignore
.Respuestas:
Por qué
En mi humilde opinión, hay una buena razón por la cual Composer usará la
--dev
bandera 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 --dev
archivos json y lock se confirman en VCS.composer.phar install --dev
.composer.phar require <package>
agregue--dev
si desea el paquete en larequire-dev
sección (y commit).composer.phar install --dev
.composer.phar update --dev <package>
(y commit).composer.phar install --dev
.composer.phar install --no-dev
Como puede ver, el
--dev
indicador se usa (mucho) más que el--no-dev
indicador, especialmente cuando aumenta el número de desarrolladores que trabajan en el proyecto.Despliegue de producción
Bueno, el archivo
composer.json
ycomposer.lock
debe estar comprometido con VCS. No lo omitacomposer.lock
porque contiene información importante sobre las versiones de paquetes que deben usarse.Al realizar una implementación de producción, puede pasar el
--no-dev
indicador a Composer:El
composer.lock
archivo puede contener información sobre paquetes de desarrollo. Esto no importa La--no-dev
bandera 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 install
debe 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 install
sin instalar dependencias "dev".Sin relación
El
--optimize-autoloader
indicador 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-autoloader
por--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-autoloader
directamente 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 install
Larga 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 install
harí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.phar
etc.). 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-dev
está habilitado de forma predeterminada, para el desarrollo local puede hacerlocomposer install
ycomposer update
sin--dev
opción.Cuando desee implementar en producción, deberá asegurarse de
composer.lock
que 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-dev
opció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.lock
dependencias 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.lock
tuviera 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-dev
en producción, como locomposer install
hará el error. Técnicamente creo que tienes razón; esto no es obligatorio, pero es un nivel adicional de seguridad, que me gusta.dev/tool
yprod/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-dev
entonces necesita probarlo localmente, como mencioné en la respuesta. Todavía recomiendo no usar--no-dev
en absoluto.composer update
luego 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
vendor
avendor-<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 install
en 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.lock
harácomposer install
actuar 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 update
desatendido sin verificar que no haya roto nada.