Crear un bundle distribuible para Symfony 2

vendorsHoy voy a explicar como se puede hacer un bundle para Symfony 2 distribuible y descargable para otros proyectos tuyos o de tipo Open Source y que cualquiera lo pueda descargar y usar en su proyecto.

Después de buscar y buscar documentación acerca de crear tus propios bundles y poder distribuirlos para la comunidad, por fin encontré una mini-guia que explica por encima como se puede hacer. Os voy a hacer yo una pequeña explicación de como lo he hecho yo para que podais ir practicando con vuestros bundles.

Empezamos ¡

1 – Crear un nuevo proyecto

Lo primero es crearse un proyecto nuevo vacío de Symfony en el cual vamos a crear un bundle y meteremos ahí todo el código que necesitemos, limpito de cualquier cosa para que no de problemas. Para ello ejecutamos:

*Si tenemos el instalador de Symfony:

> symfony new distributable-project

*Si no, siempre nos quedara composer(global):

> composer create-project symfony/framework-standard-edition distributable-project

Esto nos creara una nueva carpeta con la estructura del proyecto en Symfony. A continuación debemos crearnos un nuevo bundle.

> php app/console generate:bundle

Nos saltara el asistente donde deberemos completar todas las preguntas que nos hace:

-Bundle namespace: Company/YourBundle

Bundle name [CompanyYourBundle]: YourBundle

Target Directory [src/]: (Pulsamos Intro)

Configuration format (annotation, yml, xml, php) [xml]: annotation (Elegid la que mas os guste)

Y listo, ya hemos creado nuestro nuevo bundle.

2 – Crear el repositorio

Lo siguiente que haremos sera crear un repositorio en Github dentro de nuestra cuenta para ir subiendo los cambios que vayamos metiendo y además poder descargar en otros proyectos el bundle desde allí.

2.1 – Github

Accedemos con nuestro usuario en Github y creamos un nuevo proyecto dandole un nombre.

2.2 – Inicializamos nuestro repositorio Git en local

Ahora viene la pieza clave de todo esto. Como lo que queremos es distribuir un bundle, nuestro repositorio Git deberá ser inicializado dentro de ese bundle:

> cd src/Company/YourBundle

>git init

> git add -A

> git commit -m «First commit»

> git remote add origin https://github.com/YourAccount/YourBundle.git

> git push -u origin master

De esta forma hemos metido todo el bundle dentro de Github.

2.3 – Crear el composer.json

Ahora otra pieza clave es crear el archivo composer.json dentro del bundle que queremos distribuir.

> sudo nano src/Company/YourBundle/composer.json

{
    "name" : "company/your-bundle",
    "version": "v1.0.0",
    "description" : "Fill with your description",
    "type" : "symfony-bundle",
    "authors" : [{
        "name" : "Your name",
        "email" : "Your email",
        "homepage": "Your site"
    }],
    "keywords" : [
        "put",
        "your",
        "keywords",
        "here"
    ],
    "license" : [
        "MIT"
    ],
    "require" : {
        "php": ">=5.4",
        "symfony/framework-bundle": ">=2.2",
        "symfony/symfony": ">=2.2",
        //Add your require libraries here...
    },
    "autoload" : {
        "psr-4" : {
            "Company\\NameBundle\\" : ""
        }
    }
}

Este es un ejemplo de como podría ser el composer.json. Podeis ajustarlo a vuestras necesidades según los requisitos de vuestro bundle.

Por descontado, tenemos que subir este fichero al repositorio en Github.

> git add -A

> git commit -m «Added composer json file»

> git push origin master

3 – Probar a instalar dicho bundle en otro proyecto

Ahora solo nos queda usar dicho bundle dentro de otro proyecto, ya sea nuevo o uno que ya estemos desarrollando. Para ello tenemos que añadir en nuestro composer.json del proyecto donde vayamos a usar nuestro bundle distribuido lo siguiente:

 

«require»: {

…,

«company/your-bundle»: «dev-master» //o la rama que queramos

},

repositories»: [{

«type»: «vcs»,

«url»: «https://github.com/YourAccount/YourBundle.git »

}]

Ahora solo nos queda actualizar nuestros vendors y ver si efectivamente se ha instalado nuestro bundle como un vendor dentro de nuestro proyecto:

>> composer update company/your-bundle

> … Installing company/yourbundle (dev-master)

Si todo a ido bien, deberíamos tener dentro de /vendor/Company/YourBundle nuestro bundle ya instalado.

Ahora debemos inicializarlo en nuestro archivo appKernel.php para poder hacer uso de el:

$bundles = [

… ,

new Company\YourBundle\YourBundle()

];

Y ya esta ¡ Con esto ya podremos empezar a usar nuestro bundle en cualquier otro proyecto.

En symfony recomiendan seguir una serie de buenas practicas a la hora de hacer un bundle ditribuible y ademas ojear otros proyectos famosos para ver como lo han resuelto ellos. Os dejo aquí el enlace de las buenas practicas para que le pegueis un vistazo.

4 – Resumen

Eso es todo por hoy.

Por supuesto que el composer.json es un pequeño ejemplo y debereis buscar mas información acerca de todas las opciones que os ofrece Composer para ese fichero.

Tampoco cabe decir que, esto son algunas pruebas que voy haciendo yo y que me sirve de recordatorio para en un futuro acordarme como lo hice y poder hacerlo en otros proyectos. Este articulo esta sujeto a errores y fallos como todo en este mundo, asi que se comprensible y no me castigues muy duro. Es más, ayudame a mejorar y si ves algun fallo o sugerencia siempre seran bienvenidos.

Uno de mis objetivos a corto-medio plazo es el de crear un bundle que hice para uno de los proyectos en los que trabaje y distribuirlo ya que no encontre nada sencillo que se pudiera acoplar a lo que necesitaba, pero eso sera mas adelante.

Gracias por leer, y si me haces un favor, comparte este post con tu equipo, o en redes sociales y ayudame a difundir el conocimiento y aprendizaje con Symfony2.

Nos vemos pronto ¡

Fuentes:

-http://stackoverflow.com/questions/21523481/symfony2-creating-own-vendor-bundle-project-and-git-strategy
-https://github.com/LilaConcepts/LilaConceptsBestPracticeBundle/blob/master/composer.json

Actualización(29/02/2016):

Puede ocurrir que si el bundle no es «publico» quizas no encuentre el repositorio de donde descargarse el bundle para nuestro proyecto y composer nos arroje un error en consola al intentar descargase ese «vendor».

En ese caso, habria que rellenar lo siguiente para decirle la url del repositorio en nuestro composer.json:

"repositories": [{
    "type": "package",
    "package": {
        "name": "shtumi/useful-bundle",
        "version": "2.0",
        "source": {
            "url": "https://github.com/shtumi/ShtumiUsefulBundle.git",
            "type": "git",
            "reference": "2.0"
        }
    }
}],
"require": {
    ...
    "shtumi/useful-bundle": "2.0"
},

Despues hacemos >>composer update -o y listo.

Saludos ¡¡

 

 

 

 

6 comentarios en “Crear un bundle distribuible para Symfony 2

  1. Julietita

    Hola te hago una consulta que que nos ha traído bastantes problemas, por cuestiones contractuales tenemos un bundle que es privado pero que lo usamos en varios proyecto, lo hemos subido a bitbucket pero siempre tenemos problemas al tirar el comando composer para instalarlo, me podrías dar un ejemplo de como se agregar un bundle privado?. Desde ya gracias!!

    Me gusta

    1. davidT

      Hola Julietita. La verdad es que no he tenido ocasion de probarlo con un repositorio privado con Bitbucket pero deberia ser basicamente igual. Lo unico que te aconsejaria es que revises que la URL de tu repositorio dentro del composer.json sea HTTPS ya que a veces da algunos problemas si lo metes como SSH. Otra cosa a revisar es si la clave publica SSH de la maquina donde haces el composer install esta metida dentro del repositorio de Bitbucket como clave permitida.

      Dejame unos dias que pueda probarlo y te digo si he tenido algun problema.

      Saludos¡

      Me gusta

    1. davidT

      Me alegro que te haya gustado. Para que llegue a mas gente lo que hago es pediros que compartais este articulo en vuestras redes sociales. Sigue atento, pronto colgare algunos trucos nuevos. Saludos amigo ¡

      Me gusta

  2. Pingback: Parametros de configuracion de un bundle distribuible – Symfony 2 – Tricks and Cheats By David Teruel Jorge

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.