Cursos Magento

Magento e Composer: como gerenciar melhor seus módulos e pacotes

, ,

Atualizado em 28 de janeiro de 2021

Composer é o gerenciador de dependências mais utilizado no mundo da programação moderna PHP. Ele permite declarar quais bibliotecas seu projeto precisa, e cada biblioteca por sua vez pode declarar outras dependências, que são instaladas consequentemente. Com o composer ainda é possível definir quais versões de cada biblioteca queremos usar, quais repositórios queremos usar na pesquisa, que tipo de PSR será usado, entre outras coisas.

O composer é multi-plataforma e é executado através de linha de comando, tipicamente através da execução do arquivo composer.phar
Se você ainda não tem ele instalado, considere fazer isso agora antes de seguir (veja instalação no Linux/OSX ou Windows).

História (mas você não precisa ler)

O composer nasceu em 2012, e foi criado por Nils Adermann e Jordi Boggiano, fortemente inspirados pelo npm (do Node.js) e bundler do Ruby. Quase todos os frameworks e softwares PHP fazem uso do mesmo hoje em dia. Entre os exemplos podemos destacar as versões atuais de: Symfony, Laravel, CodeIgniter, CakePHP, e Magento 2.

Magento 2?

Sim, Magento 2 usa composer como já falei nesse outro post. E sim, também usa symfony, monolog e outras coisas nas suas dependências, mas isso é papo pra outro post.

E como usa?

No Magento 2 – já vou falar de M1, calma –  ou em outros projetos PHP é tudo muito simples e podemos arriscar a dizer que tudo se resume a um ou dois arquivos JSON e dois ou três comandos. É claro que dá pra fazer muito mais que isso, mas vamos começar por algum lugar.

As dependências de um projeto são definidas em um arquivo chamado composer.json, o qual vamos criar agora.

Após ter instalado o composer, crie um diretório qualquer (vazio de preferência), entre nele no seu terminal e digite:

$ cd meuprojeto
$ composer.phar -n init

O -n faz com que o composer entenda que estamos querendo criar  um arquivo novo para gerenciar dependências, e não definir um composer.json de um projeto. Ou seja, se você quiser criar o seu projeto e fornecer ele para ser usado posteriormente, use composer init, e o composer irá lhe fazer algumas perguntas sobre sua biblioteca.

Logo em seguida, o nosso composer.json foi criado.

{
"require": {}
}

A criação do composer.json é o setup inicial do nosso projeto.  Cada dependência que vamos usar geralmente possuí uma forma de autoload de classes diferentes, e o composer gerencia isso pra gente. Mas para fazer isso, o próprio composer precisa de algumas dependências, e é elas que vamos instalar agora.

$ composer install --no-dev
Loading composer repositories with package information
Updating dependencies
Nothing to install or update
Generating autoload files

Nesse momento o composer criou uma pasta chamada vendor com uma série de arquivos, dependências e um arquivo chamado autoload.php. Ele é o responsável por gerenciar a forma como as classes serão buscadas nos vários tipos de projetos e PSR’s que viermos a trabalhar.

.
|-- composer.json
`-- vendor
|-- autoload.php
`-- composer
|-- ClassLoader.php
|-- LICENSE
|-- autoload_classmap.php
|-- autoload_namespaces.php
|-- autoload_psr4.php
|-- autoload_real.php
|-- autoload_static.php
`-- installed.json

2 directories, 10 files

O --no-dev garante que só teremos o essencial. Muitos projetos tem dependências (require-dev) que são usadas quando queremos trabalhar no projeto de alguém, ou seja, modificar o projeto que estamos instalando.
Mas calma, não vai sair digitando composer install para instalar outras dependências. Para isso vamos usar o composer require, e já vou falar sobre ele.

De onde vêm os projetos e dependências

A lista de bibliotecas e aplicações que podemos “importar” para dentro do nosso projeto são listadas no site packagist.org. Por padrão, toda vez que solicitamos um pacote, é de lá que o composer vai buscar. Você pode entrar no site e buscar por qualquer tipo de utilitário como por exemplo, gerenciador de logs, de banco de dados, bibliotecas para manipular imagens, e qualquer outra coisa. Basicamente, todo projeto listado lá, está vinculado a um repositório aberto como github, bitbucket, etc, e são atualizados no packagist automaticamente através de integração via webhooks.

Tá, mas e daí? Não achei quase nada de Magento lá.
Como disse, o Packagist, é o repositório padrão. Para Magento 1, os módulos ficam em outro repositório…

Como usar o composer no Magento 1

⚠️ Update: O Magento Connect foi extinto pela Magento, e com isso as referências para connect20 em packagist.firegento.com não são mais válidas. É recomendável que se use composer com Magento 1 usando somente o packagist.org (padrão do composer).

Apesar de o Packagist ser o repositório padrão de bibliotecas, ele não é o único, e a primeira coisa que vamos fazer é adicionar o repositório do Firegento, que é o repositório da comunidade magenteira, criado na Alemanha.
A parte mais legal do Firegento, é que além de módulos enviados especificamente para eles, você ainda conta com quase todos os módulos do Magento Connect e todo seu histórico de versões. Olha só o que eu achei lá:

Bom, mas como fazer o composer enxergar Firegento e começar a instalar módulos?

Basicamente faremos isso em 3 etapas:

  1. Iniciamos o composer com o Firegento
  2. Carregamos nosso primeiro módulo
  3. Fazemos o Magento 1 funcionar com composer

1. Iniciar o composer com Firegento

Agora, já na pasta do nosso projeto Magento, vamos criar um arquivo composer.json com o seguinte conteúdo:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://packages.firegento.com"
        }
    ]
}

2. Instalando o primeiro módulo

Em seguida, vamos instalar nosso primeiro módulo, que pode ser encontrado no Firegento. Para fazer uma propaganda, vejamos como instalar o módulo do Pagseguro, listado na imagem acima:

$ composer.phar require --update-no-dev connect20/ricardomartins_pagseguro

E veja o que acontece..

Using version ^3.2 for connect20/ricardomartins_pagseguro
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies
Package operations: 1 install, 0 updates, 0 removals
- Installing connect20/ricardomartins_pagseguro (3.2.0): Downloading (100%)
Writing lock file
Generating autoload files

Isso fará o composer adicionar o PagSeguro como dependência no nosso composer.json, criar um novo arquivo composer.lock contendo o estado atual de cada pacote instalado e sua versão atual, e colocar todos os módulos e suas dependências na pasta /vendor.
O –update-no-dev é opcional e faz com que as dependências sejam atualizadas sem os requisitos de desenvolvimento, assim como o nosso install --no-dev acima.

3. Fazendo o Magento funcionar com composer

O Magento 1 não lê a pasta /vendor por padrão, nem carrega o autoload.php pra gente. Para fazer isso dar certo, precisaremos de uma dependência que altera a forma como o composer trabalha, fazendo ele duplicar os arquivos nas pastas certas.

Note que alguns módulos já carregam essa dependência no seu composer.json, não sendo necessário realizar este passo.

Sendo assim se este não for o caso, precisamos instalar o magento-hackathon/magento-composer-installer, e faremos isso com composer require --update-no-dev magento-hackathon/magento-composer-installer

$ composer require --update-no-dev magento-hackathon/magento-composer-installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
- Installing psr/log (1.0.2): Loading from cache
- Installing symfony/debug (v3.3.5): Loading from cache
- Installing symfony/polyfill-mbstring (v1.4.0): Loading from cache
- Installing symfony/console (v3.3.5): Loading from cache
- Installing justinrainbow/json-schema (4.1.0): Loading from cache
- Installing eloquent/enumeration (5.1.1): Loading from cache
- Installing eloquent/composer-config-reader (2.0.2): Loading from cache
- Installing magento-hackathon/magento-composer-installer (3.1.2): Loading from cache
you may want to add the packages.firegento.com repository to composer.
add it with: composer.phar config -g repositories.firegento composer https://packages.firegento.com
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/filesystem ()
symfony/console suggests installing symfony/process ()
magento-hackathon/magento-composer-installer suggests installing theseer/autoload (~1.14)
magento-hackathon/magento-composer-installer suggests installing colinmollenhour/modman (*)
Writing lock file
Generating autoload files
please define your magento root dir [root].
Autoloader patch to ./app/Mage.php was applied successfully

Isso também fará com que o Magento passe a ler a pasta /vendor do nosso projeto em busca de possíveis classes, alterando assim o autoload padrão do Magento – ou seja, alterando o app/Mage.php.

$ git diff app/Mage.php
diff --git a/app/Mage.php b/app/Mage.php
index 081f5e9..3e53058 100644
--- a/app/Mage.php
+++ b/app/Mage.php
@@ -53,6 +53,14 @@ if (defined('COMPILER_INCLUDE_PATH')) {

Varien_Autoload::register();

+/** AUTOLOADER PATCH **/
+if (file_exists($autoloaderPath = BP . DS . 'vendor/autoload.php') ||
+ file_exists($autoloaderPath = BP . DS . '../vendor/autoload.php')
+) {
+ require $autoloaderPath;
+}
+/** AUTOLOADER PATCH **/
+
/**
* Main Mage hub class

Note que ao ser perguntado “please define your magento root dir”, eu informei “.” (ponto), para indicar o diretório atual.

Neste momento, o módulo RicardoMartins_PagSeguro, que está em vendor/connect20/RicardoMartins_PagSeguro/ foi também copiado para fora e todos os arquivos estão lá no seu Magento.

$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: app/Mage.php

Untracked files:
(use "git add ..." to include in what will be committed)

app/code/community/RicardoMartins/PagSeguro/
app/design/adminhtml/base/
app/design/frontend/base/default/template/ricardomartins_pagseguro/
app/etc/modules/RicardoMartins_PagSeguro.xml
app/locale/pt_BR/
composer.json
composer.lock
js/pagseguro/
skin/frontend/base/default/pagseguro/
vendor/

no changes added to commit (use "git add" and/or "git commit -a")

O mesmo pode ser feito com qualquer outro módulo.

Habilitando links simbólicos

Por fim, habilite os links simbólicos no seu magento. Isso pode ser feito com o n98-magerun, através do comando dev:symlinks, ou modificando as configurações na tabela core_config_data (dev/template/allow_symlink).

Para desinstalar

Para desinstalar um módulo basta digitar composer remove nome-da-dependencia.
Por exemplo:

$ composer remove connect20/ricardomartins_pagseguro
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 0 updates, 1 removal
- Removing connect20/ricardomartins_pagseguro (3.2.0)
Writing lock file
Generating autoload files
./app/Mage.php was already patched

Desta forma fica muito mais fácil gerenciar seus módulos, não é mesmo?

Para listar

Para listar as bibliotecas instaladas e suas versões, usamos composer info.

$ composer info
connect20/RicardoMartins_PagSeguro 3.2.0 PagSeguro transparente (cartões)
eloquent/composer-config-reader 2.0.2 A light-weight component for reading Composer configuration files.
eloquent/enumeration 5.1.1 An enumeration implementation for PHP.
justinrainbow/json-schema 4.1.0 A library to validate a json schema.
magento-hackathon/magento-composer-installer 3.0.7 Composer installer for Magento modules
psr/log 1.0.2 Common interface for logging libraries
symfony/console v3.3.5 Symfony Console Component
symfony/debug v3.3.5 Symfony Debug Component
symfony/polyfill-mbstring v1.4.0 Symfony polyfill for the Mbstring extension

Alternativas

Se você não gostou das vantagens do composer, talvez goste do modman.

E se quiser ver outras ferramentas legais para desenvolver em Magento, talvez goste do curso gratuito Ferramentas e Dicas para Desenvolvimento Magento.

Gostou? Compartilhe! 🙂

Fontes e referências:
Site do Firegento
Sobre o Packagist
Wikipedia sobre Composer
Documentação do Composer
Post do Alan Storm sobre composer

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-1/magento-e-composer-como-gerenciar-melhor-seus-modulos-e-pacotes/"]