Magento 2 não permite vincular módulos usando links simbólicos

10

Eu adicionei um módulo de desenvolvimento local (repositório git separado) ao Magento 2 usando links simbólicos e ele estava funcionando bem até que eu atingi os modelos PHTML. Após uma depuração pesada, descobri que a classe de sistema de arquivos Magento 2 ( Magento\Framework\Filesystem\Directory\Read) usa um isExists()método combinado com uma getAbsolutePath()chamada para verificar se o modelo PHTML existe. No entanto, o getAbsolutePath()método verifica se o caminho relativo existe no sistema de arquivos Magento 2 e, se não, ele anexa a raiz do Magento 2. isto. No meu caso, o módulo vive em um repositório separado /git/Aenquanto o Magento vive /site/Be esse comportamento verifica a existência de um modelo PHTML no /site/B/git/A.

Em resumo: os modelos PHTML que vivem fora do sistema de arquivos raiz Magento 2 não são selecionados, independentemente da configuração da configuração do sistema "Permitir links simbólicos" estar ativada. Parece que a configuração está funcionando, mas apenas se a fonte do link simbólico ainda estiver dentro do sistema de arquivos Magento 2.

Alguém mais encontrou isso? Qual seria a melhor maneira de lidar com o desenvolvimento em um repositório Git externo?

Jisse Reitsma
fonte
50/50 bug / recurso. Eu digo arquivar um problema .
benmarks 26/12/15
@benmarks este problema é conhecido que tem um workaroud, veja a minha resposta
Alex Paliarush

Respostas:

9

Solução alternativa hackeada se você estiver usando o repositório de caminho do compositor para o seu módulo.

Em registration.phpcolocar:

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Module_Name',
    isset($file) ? dirname($file) : __DIR__
);

Isso registrará seu módulo no caminho com link simbólico no diretório do fornecedor raiz do Magento, em vez de no caminho real.

fsw
fonte
1
Esta solução funcionou para mim até a atualização para o Magento 2.3 (estou recebendo o erro 'Arquivo de modelo inválido ...'). Alguma idéia de como resolvê-lo?
Pini
Desculpe, não. Tem certeza de que isso funciona quando você não está usando o link simbólico? Nesse caso, você teria que depurar como o M2.3 está carregando modelos. Talvez abra outra pergunta?
fsw
Está funcionando sem o link simbólico.
Pini
Eu uso o Vagrant durante o desenvolvimento. Eu faço o link /vagrant/app/code/Vendor/para /var/www/shop/app/code/Vendor. Isso resolveu para mim!
BugHunterUK
Estou de volta. Esta solução não funciona. Quando usei isso para vincular o código do meu módulo, as rotas adminhtml do meu módulo não funcionariam. Confirmei isso removendo o link simbólico e copiando os arquivos para o diretório app / code. O plugin então funcionou. Você pode confirmar criando este módulo e ligando -o simbolicamente : devdocs.magento.com/guides/v2.3/ext-best-practices/… ... você terá o mesmo problema que eu tive.
BugHunterUK
4

Também deve ser possível manipular o registration.php para apontar para sua raiz de desenvolvimento.

Para ter certeza de que está sendo carregado, você teria que executar o registration.php em algum lugar do processo de inicialização.

A maneira mais fácil (sem instalá-lo via compositor) seria adicioná-lo manualmente ao fornecedor / compositor / autoload_files.php.

Também pensei em escrever um módulo para isso. Este módulo também pode ser útil para ambientes de teste de integração (para adicionar e remover módulos rapidamente, sem precisar copiá-los em algum lugar).

=== ATUALIZAÇÃO ===

até agora eu escrevi o módulo: http://github.com/davidverholen/magento2-dynamic-component-registry

Também acho que deveria ser possível vincular módulos usando links simbólicos relativos

David Verholen
fonte
3

É possível ativar / permitir links simbólicos através das lojas => Configuração => Avançado => Desenvolvedor => Configurações do modelo (como no Magento 1.x):

Opção de configuração

(Não testei se essa configuração funciona)

Além disso, você pode usar submódulos, dessa forma você não precisa de links simbólicos.

Para desenvolvimento, desenvolvo módulos em um diretório separado e uso o PHPStorm para copiá-los na minha instalação de desenvolvimento do Magento 2.

Vladimir Kerkhoff
fonte
1
Obrigado. A configuração que eu mencionei foi de fato a configuração "Allow Symlinks" em "Template Settings". Ele funciona muito bem no Magento 1.x, mas agora no Magento 2, os arquivos precisam estar dentro da raiz do Magento, portanto não apenas em qualquer lugar no sistema de arquivos. De qualquer forma, eu vou ficar bem - Eu provavelmente vou submódulos uso :)
Jisse Reitsma
Jisse, apenas um pensamento ... você também pode usar o compositer para montar módulos separados ao produzir seus artefatos de construção, o que tende a evitar alguns dos problemas que você pode encontrar com os submódulos git, embora isso possa aumentar a complexidade de sua construção processo. AFAIK, esta é a maneira recomendada pelo Magento de lidar com a situação.
Bryan 'BJ' Hoffpauir Jr. -
Obrigado, as opções do PHPStorm já o resolveram para mim, mas como o @ alex-paliurush apontou, existem alguns cenários em que a solução alternativa simplesmente não funciona. Vou adicionar um PR em vez disso.
Jisse Reitsma
Obrigado Bryan por sua sugestão também. No entanto, o compositor é perfeito ao lidar com sites de produção, mas eu estava procurando uma maneira melhor de desenvolver módulos personalizados. O compositor ainda não deve estar em jogo, porque é a maneira de distribuir o código que eu preciso desenvolver primeiro no Magento 2, para que o compositor esteja sempre comprometido. Dito isto, o PhpStorm (e outros IDEs) já oferecem uma solução para isso. Então, a única questão que permanece é que os locais de produção sofrem com essa limitação ligação simbólica, e, em seguida, seus argumentos chutar :)
Jisse Reitsma
3

Se você desenvolver usando o PHP Storm, basta copiar o segundo repositório para a raiz do projeto Magento. Em seguida, crie links simbólicos necessários para ativar o módulo. O PHP Storm tratará este projeto como multirrotado e reconhecerá os dois repositórios. Você pode escolher entre estratégias de gerenciamento de repositório síncronas e assíncronas (padrão) .

Esse problema também ocorre quando o EE (ou qualquer outro módulo) é vinculado ao CE usando links simbólicos. A causa raiz é que registration.phpcalcula o caminho do módulo base como o caminho real para o diretório (no seu caso, está fora do projeto Magento). É por isso que o caminho relativo é calculado incorretamente e o caminho absoluto também está incorreto. Se o segundo repositório for colocado na raiz do Magento, o caminho relativo apontará para o caminho real do arquivo (não o link simbólico), mas ele ainda será encontrado, para que tudo funcione.

Alex Paliarush
fonte