Dicas de uso do compositor

Composer é uma ferramenta para o gerenciamento de dependência em PHP. Ele permite que você declare as bibliotecas das quais seu projeto depende e as instale e atualize para você. Nós aprenderemos:

  • como instalar o Composer
  • utilizá-lo em projetos novos ou existentes

Instalação

O Composer é um arquivo executável .phar que você pode baixar e instalar da seguinte forma.

Windows

Use o instalador oficial Composer-Setup.exe.

Linux, macOS

Tudo que você precisa são 4 comandos, que você pode copiar a partir desta página.

Além disso, ao copiar para a pasta que está no sistema PATH, o Composer torna-se acessível globalmente:

$ mv ./composer.phar ~/bin/composer # or /usr/local/bin/composer

Uso em Projeto

Para começar a usar o Composer em seu projeto, tudo o que você precisa é um arquivo composer.json. Este arquivo descreve as dependências de seu projeto e pode conter também outros metadados. O mais simples composer.json pode se parecer com este:

{
	"require": {
		"nette/database": "^3.0"
	}
}

Estamos dizendo aqui que nossa aplicação (ou biblioteca) depende do pacote nette/database (o nome do pacote consiste de um nome de fornecedor e o nome do projeto) e quer a versão que corresponda à restrição da versão ^3.0.

Portanto, quando temos o arquivo composer.json na raiz do projeto e executamos:

composer update

O Composer irá baixar o banco de dados Nette no diretório vendor. Ele também cria um arquivo composer.lock, que contém informações sobre exatamente quais versões de biblioteca ele instalou.

O compositor gera um arquivo vendor/autoload.php. Você pode simplesmente incluir este arquivo e começar a usar as classes que estas bibliotecas fornecem sem nenhum trabalho extra:

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

Pacotes de atualização para as versões mais recentes

Para atualizar todos os pacotes usados para a versão mais recente de acordo com as restrições de versão definidas em composer.json use o comando composer update. Por exemplo, para a dependência "nette/database": "^3.0" será instalada a versão mais recente 3.x.x, mas não a versão 4.

Para atualizar as restrições da versão no arquivo composer.json para, por exemplo, "nette/database": "^4.1", para permitir a instalação da versão mais recente, use o comando composer require nette/database.

Para atualizar todos os pacotes Nette usados, seria necessário listá-los todos na linha de comando, por exemplo

composer require nette/application nette/forms latte/latte tracy/tracy ...

O que é impraticável. Portanto, use um simples roteiro Composer Frontline que o fará por você:

php composer-frontline.php

Criando um novo projeto

O novo projeto Nette pode ser criado através da execução de um simples comando:

composer create-project nette/web-project name-of-the-project

Em vez disso, o name-of-the-project você deve fornecer o nome do diretório para seu projeto e executar o comando. O compositor buscará o repositório nette/web-project no GitHub, que já contém o arquivo composer.json, e logo em seguida instalará o próprio Nette Framework. A única coisa que resta é verificar as permissões de escrita nos diretórios temp/ e log/ e você está pronto para ir.

Se você sabe em que versão do PHP o projeto será hospedado, não deixe de configurá-lo.

Versão PHP

O Composer sempre instala as versões dos pacotes que são compatíveis com a versão do PHP que você está usando atualmente (ou melhor, a versão do PHP usada na linha de comando quando você executa o Composer). Que provavelmente não é a mesma versão que seu web host está usando. É por isso que é muito importante adicionar informações sobre a versão do PHP em sua hospedagem ao seu arquivo composer.json. Depois disso, somente versões de pacotes compatíveis com o host serão instaladas.

Por exemplo, para configurar o projeto para rodar no PHP 8.2.3, use o comando:

composer config platform.php 8.2.3

Esta é a forma como a versão é escrita no arquivo composer.json:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

No entanto, o número da versão PHP também está listado em outra parte do arquivo, na seção require. Enquanto o primeiro número especifica a versão para a qual os pacotes serão instalados, o segundo número diz para qual versão o aplicativo em si é escrito. (É claro, não faz sentido que estas versões sejam diferentes, portanto, a entrada dupla é uma redundância). Você define esta versão com o comando:

composer require php 8.2.3 --no-update

Ou diretamente no arquivo `composer.json':

{
	"require": {
		"php": "8.2.3"
	}
}

Ignorando a versão do PHP

Normalmente, os pacotes especificam a versão mais baixa do PHP com a qual são compatíveis e a versão mais alta com a qual foram testados. Se você planeja usar uma versão ainda mais recente do PHP, talvez para fins de teste, o Composer se recusará a instalar esse pacote. A solução é usar a opção --ignore-platform-req=php+, que faz com que o Composer ignore os limites superiores da versão do PHP necessária.

Falsos relatórios

Ao atualizar pacotes ou mudar números de versão, conflitos acontecem. Um pacote tem requisitos que entram em conflito com outro e assim por diante. No entanto, o Composer ocasionalmente imprime uma mensagem falsa. Ele relata um conflito que realmente não existe. Neste caso, ele ajuda a apagar o arquivo composer.lock e tenta novamente.

Se a mensagem de erro persistir, então o objetivo é sério e você precisa ler a partir dela o que modificar e como.

Packagist.org – Repositório Global

Packagist é o principal repositório de pacotes, no qual o Composer tenta pesquisar pacotes, se não for dito o contrário. Você também pode publicar seus próprios pacotes aqui.

E se não quisermos o Repositório Central

Se temos aplicações internas ou bibliotecas em nossa empresa, que não podem ser hospedadas publicamente na Packagist, podemos criar nossos próprios repositórios para esse projeto.

Mais sobre os repositórios na documentação oficial.

Carregamento automático

Uma característica chave do Composer é que ele fornece auto-carga para todas as classes que ele instala, que você começa por incluir um arquivo vendor/autoload.php.

Entretanto, também é possível utilizar o Composer para carregar outras classes fora da pasta vendor. A primeira opção é deixar o Composer escanear as pastas e subpastas definidas, encontrar todas as classes e incluí-las no autoloader. Para fazer isso, configure autoload > classmap em composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      #  includes the src/ folder and its subfolders
		]
	}
}

Em seguida, é necessário executar o comando composer dumpautoload a cada mudança e deixar as mesas de auto-carga se regenerar. Isto é extremamente inconveniente, e é muito melhor confiar esta tarefa ao RobotLoader, que executa a mesma atividade automaticamente em segundo plano e muito mais rápido.

A segunda opção é seguir o PSR-4. Simplesmente dizendo, é um sistema onde os namespaces e nomes de classes correspondem à estrutura do diretório e nomes de arquivos, ou seja, App\Router\RouterFactory está localizado no arquivo /path/to/App/Router/RouterFactory.php. Exemplo de configuração:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # the App\ namespace is in the app/ directory
		}
	}
}

Consulte a documentação do Composer para saber exatamente como configurar este comportamento.

Teste de Novas Versões

Você quer testar uma nova versão de desenvolvimento de um pacote. Como fazer isso? Primeiro, adicione este par de opções ao arquivo composer.json, o que lhe permitirá instalar versões de desenvolvimento de pacotes, mas só o fará se não houver uma combinação estável de versões que atenda aos requisitos:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

Também recomendamos apagar o arquivo composer.lock, porque às vezes o Composer incompreensivelmente se recusa a instalar e isso resolverá o problema.

Digamos que o pacote é nette/utils e a nova versão é a 4.0. Você o instala com o comando:

composer require nette/utils:4.0.x-dev

Ou você pode instalar uma versão específica, por exemplo, 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Se outro pacote depender da biblioteca e estiver bloqueado para uma versão mais antiga (por exemplo ^3.1), é ideal atualizar o pacote para trabalhar com a nova versão. Entretanto, se você quiser apenas contornar a limitação e forçar o Composer a instalar a versão em desenvolvimento e fingir que é uma versão mais antiga (por exemplo, 3.1.6), você pode usar a palavra-chave as:

composer require nette/utils "4.0.x-dev as 3.1.6"

Comandos de Chamada

Você pode chamar seus próprios comandos e scripts personalizados através do Composer, como se fossem comandos nativos do Composer. Os scripts localizados na pasta vendor/bin não precisam especificar esta pasta.

Como exemplo, definimos um roteiro no arquivo composer.json que utiliza o Nette Tester para realizar testes:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Em seguida, realizamos os testes com composer tester. Podemos chamar o comando mesmo que não estejamos na pasta raiz do projeto, mas em um subdiretório.

Enviar agradecimentos

Mostraremos a vocês um truque que fará felizes os autores de código aberto. Você pode facilmente dar uma estrela no GitHub para as bibliotecas que seu projeto utiliza. Basta instalar a biblioteca symfony/thanks:

composer global require symfony/thanks

E depois correr:

composer thanks

Experimente!

Configuração

O Composer está estreitamente integrado com a ferramenta de controle de versão Git. Se você não usar Git, é necessário dizer isso ao Composer:

composer -g config preferred-install dist