Cuando comienzo un nuevo proyecto M2, lo primero que haría es instalar el núcleo a través del compositor:
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition
Ahora puedo escribir mi (s) módulo (s) personalizado (s) y tema (s) debajo app/code
. Luego agregaría mi composer.*
y toda la app/code
carpeta a mi VCS. Hasta ahora todo está bien.
Supongamos que ahora quiero usar algunas herramientas de compilación para mi proyecto, digamos Grunt o Gulp.
Si confirmo el mío
Gruntfile.js
, elmagento/magento2-base
paquete lo sobrescribirá cuando lo ejecutecomposer install
después de clonar el repositorio.Si confirmo mi
gulpfile.js
, realmente no puedo definir mis dependencias en apackage.json
, porque también sería sobrescrito pormagento/magento2-base
.Si decido usar la configuración de Magento's Grunt y quiero personalizarla editando los archivos en
/dev/tools/grunt
(pthemes.js
. Ej. ), No puedo porque mis cambios se sobrescribiránmagento/magento2-base
.
Entiendo que realmente no puedes hacer mucho en la raíz de tu documento. Por supuesto, hay muchas soluciones a este problema:
- Podría ejecutar un
git checkout -
derecho después de la instalación para restablecer mis propios archivos - Podría almacenar mis archivos de compilación en una carpeta dedicada,
/build
por ejemplo - Podría usar una herramienta de compilación diferente, como Phing, Ant o Rake (mis desarrolladores frontend no estarían tan contentos)
- Podría reemplazarlo
magento/magento2-base
con un paquete personalizado que tenga un mapeo personalizado para los archivos principales (no es realmente óptimo, pero bueno, es una opción)
Personalmente no me gustan todas estas opciones, por lo que me gustaría saber si hay una forma preferida o mejor de lograr lo que estoy tratando de hacer.
alguien esta teniendo el mismo problema? ¿Cómo lo resolviste? ¿Cómo estructura su proyecto bajo VCS?
ACTUALIZAR
Un punto extra relacionado con la configuración del proyecto. En mis experimentos, noté que el instalador del compositor Magento tiene una marca para anular archivos:
"extra": {
"magento-force": "override"
}
Se trata internamente como un booleano si no me equivoco, así que traté de configurarlo false
para omitir la anulación. Cuando ejecuto composer install
mi instalación falla debido a que los archivos ya están presentes. Básicamente, si no dejo que Magento anule mis archivos, no puedo instalarlo.
¿Cuál es el propósito de esta bandera entonces? ¿Se supone que solo debe realizar una verificación por mí? Para mí, no tiene mucho sentido ser honesto, pero tal vez alguien pueda arrojar algo de luz sobre el tema.
fuente
Gruntfile.js
,gulpfile.js
y elpackage.json
problema está resuelto. El problema abordado en esta pregunta todavía es aplicable a las versiones más recientes de Magento 2 cuando necesita cambiarthemes.js
,index.php
o.htaccess
por ejemplo.Respuestas:
A corto plazo, estamos buscando separar archivos que necesitan personalización. Por ejemplo, si la gente necesita modificar index.php, descubra cómo separar el archivo estándar que Magento envía de la necesidad de personalizaciones locales. Una vez logrado, es posible tener "un verdadero .gitignore para que todos los proyectos puedan usar". Es decir, es fácil comprometer todo el directorio del proyecto a Git con .gitignore de todo lo que la "instalación del compositor" le proporcionará (y todo lo que la "actualización del compositor" reemplazará al instalar un parche o actualización).
A largo plazo, el objetivo es acortar .gitignore tanto como sea posible. Por ejemplo, inserte más en módulos bajo el directorio 'proveedor'
Luego
De esa manera, aún puede hacer git commit de todo el árbol del proyecto de arriba hacia abajo, capturando los archivos composer.json y composer.lock (comprometer solo la aplicación / código no lo hace). El .gitignore excluirá el directorio 'vendor' y otros archivos no deseados.
Esto le brinda lo mejor de ambos mundos mencionados en la otra discusión. El problema actual es la longitud y la complejidad del archivo .gitignore, y la instalación del parche actualmente elimina algunas personalizaciones locales (por ejemplo, en index.php). Solución temporal a corto plazo: elimine index.php de .gitignore y, cuando instale un parche, verifique qué cambios perdió (git diff) y vuelva a aplicarlos manualmente.
fuente
"magento-force": "override"
bandera podría ser útil de alguna manera. Por el momento no está haciendo exactamente lo que esperaría. En caso de que haya editado / extendido suindex.php
o cualquier otro archivo "central", simplemente puede decirle a Magento que no sobrescriba sus cambios. ¿Tiene algún sentido?Hay una solución fácil para su problema de anulación: no cambie los archivos principales;) Magento se basa en extender el Código y no en cambiarlo.
Lo primero es que no debe poner toda su carpeta de aplicación / código en un repositorio vcs. Cada componente de Magento (módulo, tema, etc.) debe ser un repositorio.
Si desea cambiar / ampliar el frontend, debe crear un nuevo tema y tratar este tema como su proyecto gruñón, no como toda la instancia de Magento2.
Para instalar su tema en su Proyecto, puede extraerlo fácilmente a través del compositor directamente desde su repositorio vcs
fuente
app/code
carpeta está específicamente allí para personalizar Magento. Mi comprensión del M2 actual es queapp/code
reemplaza lo queapp/code/local
estaba en M1, y los módulos de la comunidad se pueden instalar a través del compositor debajovendor
. Tenemos algunos proyectos con una gran cantidad de módulos y varios temas también. Lo que está sugiriendo sería imposible de manejar.composer update
. ¿Dónde comprometes tucomposer.lock
entonces? Si tienes más de 10 desarrolladores trabajando en el mismo proyecto, podría resultar realmente complicado. Por supuesto, tenemos muchos módulos generales (e incluso temas) que instalamos a través del compositor, pero el código específico del proyecto debe versionarse bajo el mismo repositorio para mayor claridad.git blame
ogit log
cuando el código está disperso en múltiples componentes? ¿Ejecutas pruebas de integración para ver que todo funciona bien?Ok, parece que encontré una mejor solución para lo que estaba tratando de lograr. En el
composer.json
, es posible especificar qué archivos deben ser ignorados por el instalador de Magento Composer. Si no quieroGruntfile.js
que se anule, simplemente puedo especificarlo con la siguiente configuración:Ahora puedo extender la instalación estándar para satisfacer mis necesidades.
fuente
Desafortunadamente, la respuesta aceptada, aunque originalmente fue la forma de lograr el objetivo deseado, solo funciona para excluir archivos y directorios ubicados en la raíz, porque si queremos excluir un archivo ubicado en un subdirectorio (por ejemplo
dev/tools/grunt/configs/themes.js
, es necesario si agregamos un nuevo tema y desea utilizar las tareas de Magento Grunt), colocándolo en la configuración "magento-deploy-ignore", bloquea la implementación de todos los directorios principales (es decir, dev y todos sus subdirectorios).Esto sucede porque el método que procesa "magento-deploy-ignore" (
\MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored
) utilizastrpos
para hacer coincidir la ruta de destino con la lista de excluidos, por lo que cada ruta principal siempre devolverá verdadero.fuente
Usando parches
Lo que uso es crear y aplicar parches. Cuando necesitemos cambiar
dev/tools/grunt/configs/themes.js
,index.php
o.htaccess
apliquemos los cambios a una copia temporal del archivo y creemos un parche (cree unbuild/
directorio primero):Entonces podemos hacer que este parche se aplique automáticamente cuando se ejecuta
composer install
oupdate
agregando los comandos te a lascripts
sección de sucomposer.json
archivo:(También podría poner el
patch ...
comando anterior en un script bash, digamosbuild/themes_patch.sh
y llamar a ese script desde Composer para que sea reutilizable o ejecutable manualmente)¡Actualiza seguro! :RE
¡Esta solución es segura para actualizar! No está cambiando los archivos principales directamente sin respetar el archivo original. Está aplicando un parche al archivo Magento2 original. Cuando ese archivo cambia porque está actualizando, el parche fallará y sabrá que debe observar más de cerca los nuevos cambios y crear un nuevo parche.
fuente