
A classe do comando está escrita, o módulo está habilitado e o bin/magento list continua sem citar ele. O Magento 2 não descobre comando por convenção de pasta: enquanto a classe não entrar no array de MagentoFrameworkConsoleCommandListInterface pelo di.xml, o console não sabe que ela existe.
Em app/code/MeuVendor/Sync/Console/Command/ProdutoSync.php, estendendo o Command do Symfony:
<?php
namespace MeuVendorSyncConsoleCommand;
use MagentoFrameworkConsoleCli;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
class ProdutoSync extends Command
{
protected function configure(): void
{
$this->setName('meuvendor:produto:sync');
$this->setDescription('Sincroniza produtos com o ERP');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('Sincronizando...');
return Cli::RETURN_SUCCESS;
}
} Este é o trecho que faltava, em app/code/MeuVendor/Sync/etc/di.xml. É o di.xml global mesmo, não o de adminhtml nem o de frontend: o console roda na área crontab/global. O name do item é livre, mas precisa ser único na instalação inteira, senão um módulo sobrescreve o comando do outro.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="MagentoFrameworkConsoleCommandListInterface">
<arguments>
<argument name="commands" xsi:type="array">
<item name="meuvendor_produto_sync" xsi:type="object">MeuVendorSyncConsoleCommandProdutoSync</item>
</argument>
</arguments>
</type>
</config> Sem o xmlns:xsi declarado no config o arquivo não passa na validação do XSD e o setup:upgrade reclama. Por baixo o CommandList recebe esse array pelo construtor e entrega tudo pro MagentoFrameworkConsoleCli, que monta a aplicação do Symfony. O próprio core faz assim: o cron:run está registrado nesse formato no etc/di.xml do Magento_Cron.
Com o módulo declarado no registration.php e no etc/module.xml, é essa sequência:
bin/magento module:enable MeuVendor_Sync
bin/magento setup:upgrade
bin/magento cache:clean config
bin/magento list | grep meuvendor Em modo produção o di já está compilado, então cache:clean não basta: rode bin/magento setup:di:compile depois de qualquer mexida no di.xml. Se ainda não aparecer, apague generated/metadata e generated/code — em produção só com a loja em manutenção, porque até o setup:di:compile terminar o site fica fora do ar. É quase sempre metadado velho grudado, não erro no seu XML.
Como traduzir duas mil linhas do pt_BR.csv do Magento 2 lendo com fgetcsv e regravando com fputcsv, sem encostar na…
Produto variável respondendo "Desculpe, este produto não está disponível" mesmo com a variação ativa: limpe os transients do WooCommerce e…
O site responde 503 com "Momentaneamente indisponível para manutenção programada" depois de um update interrompido. Apague o .maintenance e feche…
Troque o intervalo R$ 49,00 – R$ 129,00 do produto variável por A partir de R$ 49,00 com o filtro…
Grid do admin sem checkbox e com o botão Ações vazio? Falta o selectionsColumn e o nó massaction no listing.xml,…
Criou parts/header.html e o Editor de Site não lista a parte? Declare templateParts no theme.json e apague a versão salva…