¿Por qué nunca debería ejecutar la 'actualización del compositor' en la producción? -- php campo con composer-php camp Relacionados El problema

Why should I never run 'composer update' in production?


16
vote

problema

Español

composer install se instalará cuando se indica en el archivo composer.lock4 , pero composer update actualizará todas las dependencias y creará una nuevo composer.lock Archivo basado en lo que se requiere en composer.json .

Muchos dijeron que solo ejecutan composer update en el desarrollo. Pero mi pregunta está haciendo composer update reemplazó el archivo viejo composer.lock10 , si su aplicación se romperá, se romperá, porque podría haber conflicto con las nuevas dependencias actualizadas.

Me encontré con una situación en la que debo hacer int i = 65537; char c = (char) i; printf("%d", c); 1111111 , el problema está relacionado con int i = 65537; char c = (char) i; printf("%d", c); 2 extensión. La única solución es hacer int i = 65537; char c = (char) i; printf("%d", c); 3 Instalación del módulo PCNTL PHP

No entiendo por qué las personas tienen miedo de correr int i = 65537; char c = (char) i; printf("%d", c); 4 en la producción.

Original en ingles

composer install will install whenever stated in the composer.lock file, but composer update will update all the dependencies and create a new composer.lock file based on what is required in composer.json.

So many said only run composer update in development. But my question is doing composer update did replaced the old composer.lock file, if your app is going to break it will break, because there might be conflict with the new updated dependencies.

I came across with a situation where I must do composer update, the issue is related to pcntl extension. The only solution is to do composer update PHP pcntl module installation

I don't understand why people are afraid of running composer update on production.

     

Lista de respuestas

20
 
vote

TLDR;

No ejecute composer update NOR composer install En la producción. Ejecutarlo en otro lugar y cargar el resultado en el servidor de producción, pero no al mismo directorio donde se aloje la aplicación. Como regla general, no debe modificar la solicitud que se está atendiendo mientras se está atendiendo. Cree una copia diferente de la aplicación y cuando esté listo. Reemplácelo con el comando más cercano a instantáneo que puede (por ejemplo, 9988777662 o ln -s ).

Pero si tiene que ejecutar cualquiera: siempre ejecute install y cree una nueva instalación; y nunca update . install es más predecible y confiable, con update Usted está a merced de cualquiera de las dependencias del proyecto.


compositor trabaja recursivamente. Por lo tanto, incluso si tiene restricciones de versiones muy ajustadas en su composer.json , ejecutando composer update usted actualizará no solo sus dependencias, sino las dependencias de sus dependencias.

Mientras la mayor parte del tiempo esto no introducirá la rotura, a veces lo hará. Una dependencia en la línea puede introducir un cambio de comportamiento que puede afectar su código de una manera en la que puede haber probado.

también, básicamente está usando la herramienta incorrecta para el trabajo. El compositor es una herramienta de gestión de dependencia, no una herramienta de implementación. Para implementar su código en la producción, debe estar usando algún tipo de herramienta de implementación de código (incluso si esa "herramienta" es tan simple como una carga FTP y un par de scripts).

El flujo apropiado es:

  • Haz todo el composer install0 y composer install111 Llamadas en su máquina de desarrollo, donde puede probar el proyecto sin riesgo. Esto genera un composer install2 , que es un estado conocido para todo el proyecto, con versiones instaladas discretas.
  • Crear una versión instalable nueva composer install3 . En este paso, también debe descargar un autocargador optimizado, ejecute los scripts después de la instalación, etc. Por lo general, sé esto en más de un paso:
  1. composer install4 :

    ^^ Esto para una instalación completa y silenciosa de todo, excluyendo las dependencias de desarrollo.

  2. composer install5

    ^^ Para descargar un script de autocargador optimizado adecuado para la producción.

  3. composer install6

    ^^ Esto es principalmente para Symfony, pero si tiene algún scripts posterior a la instalación para ejecutar (por ejemplo, para copiar los activos en su directorio "público", calentar algún tipo de caché, algo así), esto sería Un buen momento para hacerlo.

  • El resultado de la etapa anterior debe ser probada (en lo que normalmente es un entorno de estadificación), y luego presionó a la producción completa (su código de cliente, la carpeta del proveedor, la configuración adaptada para PROD, etc.); utilizando el método de implementación que prefiera.

Tenga en cuenta que si usa algún método de empuje "lento" (FTP, COPIA, composer install7 , etc.), no debe escribir directamente al sistema de archivos de la aplicación, pero cree una copia nueva de la aplicación Y una vez que la transferencia de archivos está lista, use un método rápido para reemplazar la "producción" con la nueva versión. Una forma popular y efectiva es usar un enlace simbólico como raíz de "producción", por lo que solo necesita actualizar el enlace simbólico una vez todo lo anterior se realiza y listo, sin impactar una aplicación en ejecución (que de otra manera podría ser temporalmente roto, en virtud de que contengan repentinamente los archivos que pertenecen a diferentes versiones de la aplicación).

 

TLDR;

Do not run composer update nor composer install in production. Execute it somewhere else and upload the result to the production server, but not to the same directory where the application is hosted. As a general rule, you shouldn't modify the application that's being served while it's being served. Create a different copy of the application and when it's ready replace it with the closest to instantaneous command you can (e.g. mv or ln -s).

But if you HAVE to run either: always run install and create a fresh installation; and never update. install is more predictable and reliable, with update you are at the mercy of any of the project's dependencies.


Composer works recursively. So even if you have very tight version constraints in your composer.json, by running composer update you would be updating not only your dependencies, but your dependencies' dependencies.

While most of the time this won't introduce breakage, sometimes it will. One dependency down the line may introduce a change of behaviour that may impact your code in a way you may have not tested against.

Also, it's basically using the wrong tool for the job. Composer is a dependency management tool, not a deployment tool. To deploy your code to production you should be using some sort of code deployment tool (even if that "tool" is as simple as an FTP upload and a couple of scripts).

The appropriate flow is:

  • Do all the require and update calls on your development machine, where you can test the project without risk. This generates a composer.lock, which is a known state for the whole project, with discrete installed versions.
  • Create a new installable version doing install --no-dev. On this step you also should dump an optimized autoloader, run after-install scripts, etc. I usually separate this in more than one step:
  1. composer install --prefer-dist --no-scripts --no-progress --no-suggest --no-interaction --no-dev:

    ^^ This for a complete, silent installation of everything, excluding development dependencies.

  2. composer dump-autoload --optimize --no-dev

    ^^ To dump an optimized autoloader script suitable for production.

  3. composer run-script --no-dev post-install-cmd

    ^^ This is mostly for Symfony, but if you have any post-install scripts to run (e.g. to copy assets to your "public" directory, warm-up some type of cache, anything like that), this would be a good moment to do it.

  • The result of the above step should be tested (in what typically is a staging environment), and then pushed to production whole (your client code, the vendor folder, the configuration tailored for prod, etc); using whatever deployment method you prefer.

Note that if you use any "slow" push method (FTP, copy, rsync, etc), you shouldn't write directly to the application filesystem, but create a fresh copy of the application and once the file transfer is ready, use a quick method to replace "production" with the new release. A popular and effective way is use a symlink as "production" root, so you only need to update the symlink once all of the above is done and ready, without impacting a running application (that otherwise could be temporarily broken, by virtue of suddenly containing files that belong to different versions of the application).

 
 
         
         
10
 
vote

Mis pensamientos sobre esto son,

  • El estado de funcionamiento funciona de trabajo es muy importante, ya que supongo que se han ejecutado algunas pruebas en contra de ella.
  • Para hacer la actualización del compositor significaría que, las bibliotecas que forman parte de la aplicación tendrían sus actualizaciones y que pueden llevar a la rotura en el sistema. Porque son bibliotecas que dependen de las bibliotecas que dependen de las bibliotecas.
  • Finalmente, preferiría hacer esto si se necesita composer install8 :
    • PAGO EN UN AMBIENTE DE DEV Y composer install9 ,
    • Asegúrese de que la aplicación esté bien probada en un entorno de desarrollo
    • luego instale en vivo / producción con mv0
 

My thoughts about this are,

  • The current working state of the system is very important as I would assume some tests have been run against it.
  • To do composer update would mean that, libraries that are part of the app would have their updates and which may lead to breakage in the system. Because they are libraries that depends on libraries that depends on libraries.
  • Finally, I would rather do this if composer-update is needed:
    • Checkout on a dev environment and composer update,
    • Ensure the app is thoroughly tested on a dev environment
    • then install on live/production with composer install
 
 
     
     
0
 
vote

Mis pensamientos aquí:

Nunca debe usar la actualización del compositor sin argumento .

composer update Lee cada paquete listado en composer.json y lo actualiza a la última versión disponible compatible con las restricciones de versiones especificadas.

En un mundo perfecto, todas las librerías seguirían semver correctamente, y no debería tener efectos secundarios. Pero técnicamente, eso nunca siempre es cierto, y puede descargar una versión incompatible con la anterior, o simplemente una versión con errores no corregidos.

Por lo tanto, actualizar todos sus paquetes a la vez probablemente conduzcan a algunos problemas, a menos que tenga tiempo para revisar todo en su sitio web para asegurarse de que nada salió mal.

Pero, por supuesto, tendrá que actualizar paquetes específicos a veces, por lo que el uso de composer update xxx/xxx es útil, asumiendo que verificará todas sus implementaciones del paquete.

Cuando el paquete actualizado está totalmente probado, puede comprometer su código a la producción / producción, y luego ejecutar composer install para asegurarse de que tendrá la misma versión exacta de paquete y dependencias en todas sus plataformas .

Long Story Short, aquí está el proceso que uso:

  • composer require xxx/xxx para instalar nuevos paquetes
  • composer update xxx/xxx para actualizar un paquete específico
  • composer install En todos los entornos cuando el archivo Package.lock se ha actualizado.

PENSAMIENTOS ADICIONALES

Me tropezó una vez una implementación que le daría la versión exacta del paquete en Composer.json. El desarrollador explicó que de esta manera podría usar composer update sin daños.

No estoy de acuerdo con esta opción, ya que incluso con las versiones exactas en composer.json, las dependencias no están fijas, y una actualización de compositor podría llevar a posibles errores en ellos.

 

My thoughts here :

You should never use composer update without argument.

composer update reads every package listed on composer.json, and updates it to the latest available version compatible with the specified version constraints.

In a perfect world, all librairies would follow semver correctly, and it shouldn't have any side effects. But technically, that is never always true, and you could download a version incompatible with the previous one, or just a version with uncorrected bugs.

So, updating all your packages at once would probably lead to some issues, unless you have the time to check everything on your website to ensure nothing went wrong.

But of course, you'll have to update specific packages sometimes, so using composer update xxx/xxx is useful, assuming you'll check all your implementations of the package.

When the updated package is fully tested, you can commit your code to staging/production, and then run composer install to ensure you'll have the same exact version of package and dependencies on all your platforms.

Long story short, here's the process I use :

  • composer require xxx/xxx to install new packages
  • composer update xxx/xxx to update a specific package
  • composer install on all environments when the package.lock file has been updated.

Additional thoughts

I stumbled once upon an implementation which would give the exact version of the package in composer.json. The developer explained that this way you could use composer update without damage.

I disagree with this option, since even with the exact versions in composer.json, the dependencies are not fixed, and a composer update could lead to potential bugs in them.

 
 

Relacionados problema

1  Compositor no está leyendo mis paquetes locales satis.json archivo  ( Composer is not reading my local satis packages json file ) 
He configurado mi repo de SVN local para mantener todos los repositores externos (política de la compañía), utilizando SATIS He creado el archivo Paquetes.Jso...

3  Cómo crear mi propio comando compositor de compositores  ( How to create my own plugin composer command ) 
He investigado en Google para encontrar cómo se puede crear el comando compositor para mi complemento CakePHP. He creado mi plugin y quiero publicar otro co...

0  Compositor no encuentra coincidencia para una dependencia más profunda  ( Composer does not find match for deeper dev dependency ) 
Tengo una aplicación SymFony, que requiere un paquete de un repositorio privado: { "name": "app", "repositories": [ { "type": "vcs", "url":...

2  No se puede actualizar la versión Symfony usando compositor  ( Unable to update symfony version using composer ) 
Quiero actualizar la versión Symfony de nuestra aplicación de 2.7.13 a 2.7.38. Actualicé Composer.Json, pero cuando intento actualizarlo, tira un error. Com...

1  Instalación de solo paquetes nuevos de composer.json  ( Installing only new packages from composer json ) 
Estoy tratando de hacer que el compositor actualice solo los paquetes recién agregados a composer.json , es decir, cuando agrego una dependencia del paquete ...

5  Instalar propulsado usando compositor  ( Install propel using composer ) 
Estoy tratando de usar impulsar con compositor, pero estoy recibiendo errores. My composer.json es: div0 y el error es: div111 ¿Alguien sabe qué...

0  Clase de error fatal PHP no encontrado - compositor  ( Php fatal error class not found composer ) 
Estoy configurando un proyecto con compositor y estoy recibiendo este error en el registro de errores de PHP cuando intento ejecutarlo: ERROR FATAL PHP: er...

0  Error fatal: Clase 'CDBTSTASTCASE' NO SE ENCUENTRA  ( Fatal error class cdbtestcase not found ) 
Soy nuevo en PHP y tengo que hacer las pruebas para una aplicación. Estoy tratando de hacer pruebas de la unidad, pero se muestra un mensaje de error. Hace mu...

1  Agregar yii 1.1.x Como dependencia a la aplicación basada en YII, con compositor?  ( Adding yii 1 1 x as dependency to yii based app with composer ) 
Mientras esta ruta está bien para dev env: 1) php - & gt; Compositor - & gt; Yii - & gt; APP DE YII Al desplegar, quiero usar: 2) php - & gt; Compositor...

1  Conseguir variables de entorno en Symfony 2.4  ( Getting environement variables in symfony 2 4 ) 
He estado luchando para obtener las variables envases necesarias en una aplicación SymFony 2.4. La idea es poner la solicitud en un contenedor de Docker que s...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos