El principal tipo de repositorio es composer
, que utiliza un único archivo llamado packages.json
para describir todos los metadatos de los paquetes. Este es el tipo de repositorio que utiliza Packagist.
Para hacer referencia a un repositorio de tipo composer
, simplemente indica la ruta del archivo packages.json
. En el caso de Packagist, el archivo se encuentra directamente en la ruta /packages.json
, por lo que la URL del repositorio es simplemente packagist.org
. Si tuvieras un repositorio propio con el archivo en la ruta example.org/packages.json
, la URL del repositorio sería example.org
.
6.3.1. La propiedad packages
La única propiedad obligatoria es packages
y su estructura JSON es la siguiente:
{
"packages": {
"vendor/package-name": {
"dev-master": { @composer.json },
"1.0.x-dev": { @composer.json },
"0.0.1": { @composer.json },
"1.0.0": { @composer.json }
}
}
}
El valor @composer.json
hace referencia al contenido del archivo composer.json
de esa versión del paquete y debe incluir como mínimo las siguientes propiedades:
name
version
dist
osource
Este es un ejemplo de la configuración mínima de un paquete:
{
"name": "smarty/smarty",
"version": "3.1.7",
"dist": {
"url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
"type": "zip"
}
}
Este archivo puede definir cualquiera de las propiedades del esquema JSON de Composer explicadas en el capítulo anterior.
6.3.2. La propiedad notify-batch
La propiedad notify-batch
indica la URL a la que se realizará una petición cada vez que un usuario instale este paquete. La URL puede ser absoluta (siempre dentro del mismo dominio que el repositorio) o relativa. Ejemplo:
{
"notify-batch": "/downloads/"
}
Si el repositorio es example.org/packages.json
y se descarga el paquete monolog/monolog
, el resultado será una petición de tipo POST
a la URL example.org/downloads/
con el siguiente contenido:
{
"downloads": [
{"name": "monolog/monolog", "version": "1.2.1.0"},
]
}
El valor de la propiedad versión es la representación normalizada del número de versión.
Esta propiedad es opcional.
6.3.3. La propiedad includes
Si un repositorio tiene muchos paquetes, es posible dividir los contenidos del archivo packages.json
en varios archivos más pequeños. La propiedad fields
te permite incluir todos estos archivos individuales para formar el archivo packages.json
completo. Ejemplo:
{
"includes": {
"packages-2011.json": {
"sha1": "525a85fb37edd1ad71040d429928c2c0edec9d17"
},
"packages-2012-01.json": {
"sha1": "897cde726f8a3918faf27c803b336da223d400dd"
},
"packages-2012-02.json": {
"sha1": "26f911ad717da26bbcac3f8f435280d13917efa5"
}
}
}
El hash SHA-1 permite que el archivo sea cacheado y sólo se vuelva a solicitar si han cambiado sus contenidos.
Eta propiedad es opcional y resulta difícil que la necesites utilizar en tus propios repositorios.
6.3.4. Las propiedades provider-includes
y providers-url
En los repositorios que contienen muchos paquetes (como Packagist por ejemplo) es mejor utilizar estas propiedades. La propiedad provider-includes
permite definir una serie de archivos que contienen los listados de todos los paquetes que proporciona este repositorio. El hash utilizado en este caso es de tipo SHA 256
.
La propiedad providers-url
describe cómo encontrar estos archivos en el servidor. Su valor se considera la ruta absoluta respecto a la raíz del repositorio. Ejemplo:
{
"provider-includes": {
"providers-a.json": {
"sha256": "f5b4bc0b354108ef08614e569c1ed01a2782e67641744864a74e788982886f4c"
},
"providers-b.json": {
"sha256": "b38372163fac0573053536f5b8ef11b86f804ea8b016d239e706191203f6efac"
}
},
"providers-url": "/p/%package%$%hash%.json"
}
Cada uno de estos archivos contiene un listado de paquetes y hashes para poder verificar su integridad. Ejemplo:
{
"providers": {
"acme/foo": {
"sha256": "38968de1305c2e17f4de33aea164515bc787c42c7e2d6e25948539a14268bb82"
},
"acme/bar": {
"sha256": "4dd24c930bd6e1103251306d6336ac813b563a220d9ca14f4743c032fb047233"
}
}
}
El archivo del ejemplo anterior declara que los paquetes acme/foo
y acme/bar
se pueden encontrar en este repositorio si se carga el archivo siguendo el formato descrito por la propiead providers-url
(reemplazando el valor %name%
por el nombre del paquete y el valor %hash%
por su hash). El contenido de cada archivo es simplemente la definición de cada paquete, tal y como se describió en las secciones anteriores de este mismo capítulo.
Eta propiedad es opcional y resulta difícil que la necesites utilizar en tus propios repositorios.
6.3.5. Las opciones para el stream
El archivo packages.json
se descarga utilizando un stream de PHP. Si añades la propiedad options
puedes configurar las opciones de ese stream. Consulta las opciones para streams en el manual oficial de PHP para obtener más información.