Qual é a estrutura preferida de um projeto Magento 2 no VCS?

15

Quando inicio um novo projeto M2, a primeira coisa a fazer é instalar o núcleo via compositor:

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition

Agora posso escrever meu (s) módulo (s) personalizado (s) e tema (s) em app/code. Eu adicionaria minha pasta composer.*e toda a app/codepasta ao meu VCS. Até agora está tudo bem.

Suponha que agora eu queira usar algumas ferramentas de construção para o meu projeto, digamos Grunt ou Gulp.

  1. Se eu confirmar meu Gruntfile.js, isso será sobrescrito pelo magento/magento2-basepacote quando executar composer installdepois de clonar o repositório.

  2. Se eu confirmar minha gulpfile.js, não posso realmente definir minhas dependências em a package.json, porque ela também seria substituída por magento/magento2-base.

  3. Se eu decidir usar a configuração Grunt do Magento e quiser personalizá-la editando os arquivos em /dev/tools/grunt(por exemplo themes.js), não posso, porque minhas alterações seriam substituídas por magento/magento2-base.

Meu entendimento é que você realmente não pode fazer muito na raiz do seu documento. Obviamente, existem muitas soluções para esse problema:

  • Eu poderia executar um git checkout -logo após a instalação para redefinir meus próprios arquivos
  • Eu poderia armazenar meus arquivos de compilação em uma pasta dedicada, /buildpor exemplo
  • Eu poderia usar uma ferramenta de compilação diferente, como Phing, Ant ou Rake (meus desenvolvedores de front-end não ficariam tão felizes)
  • Eu poderia substituir magento/magento2-basepor um pacote personalizado que possui um mapeamento personalizado para arquivos principais (não é realmente ótimo, mas ei, é uma opção)

Pessoalmente, não gosto de todas essas opções, então gostaria de saber se existe uma maneira preferida ou melhor de alcançar o que estou tentando fazer.

Alguém está tendo o mesmo problema? Como você resolveu isso? Como você estrutura seu projeto no VCS?

ATUALIZAR

Um ponto extra relacionado à configuração do projeto. Nas minhas experiências, notei que o instalador do Magento compositor possui um sinalizador para substituição de arquivos:

"extra": {
    "magento-force": "override"
}

Ele é tratado internamente como um booleano se não me engano, então tentei configurá-lo falsepara ignorar a substituição. Quando executo, composer installminha instalação falha devido aos arquivos já estarem presentes. Basicamente, se eu não permitir que o Magento substitua meus arquivos, não posso instalá-lo.

Qual é o objetivo dessa bandeira então? É apenas suposto executar uma verificação para mim? Para mim, não faz muito sentido ser sincero, mas talvez alguém possa esclarecer um pouco sobre o assunto.

fmrng
fonte
Estou curioso para ver o que os outros postam como resposta. Idealmente, acho que queremos manter o Magento Core fora do nosso repositório principal e mantê-lo limitado apenas ao modelo que criamos e aos plugins personalizados que adicionamos ou corrigimos. Em seguida, no momento da construção, referenciamos o repositório principal + nosso projeto e construímos um artefato de aplicativo a partir dos repositórios. Este é o método que tenho usado recentemente para o M1 e estou me perguntando se a recomendação oficial do Magento é fazer algo semelhante ao M2 agora que o Composer é totalmente suportado.
Bryan 'BJ' Hoffpauir Jr. -
Em versões mais recentes M2, a Gruntfile.js, gulpfile.jse package.jsonproblema está resolvido. O problema abordado nesta pergunta ainda é aplicável às versões mais recentes do Magento 2 quando você precisar alterar themes.js, index.phpou .htaccesspor exemplo.
7ochem 02/01/19

Respostas:

4

Em curto prazo, procuramos separar arquivos que precisam de personalização. Por exemplo, se as pessoas precisarem modificar o index.php, descubra como separar o arquivo padrão que o Magento envia da necessidade de personalizações locais. Uma vez alcançado, é possível ter um ".gitignore verdadeiro para todos os projetos poderem usar". Ou seja, é fácil comprometer todo o diretório do projeto no Git com o .gitignore de tudo o que a "instalação do compositor" buscará para você (e tudo o que a "atualização do compositor" substituirá ao instalar um patch ou atualização).

A longo prazo, o objetivo é reduzir o .gitignore o máximo possível. Por exemplo, insira mais módulos no diretório 'vendor'.

Então

  1. Para tudo o que você não deseja compartilhar entre os projetos, deixe-o em app / code e comprometido no repositório principal do projeto.
  2. Tudo o que foi desenvolvido localmente que você deseja compartilhar entre os projetos com mais facilidade, colocar em um repositório GIT separado e instalar via compositor para que acabe em 'fornecedor'. (Pode ser um repositório de compositores local ou apenas instalar diretamente do GIT.)

Dessa forma, você ainda pode git comprometer toda a árvore do projeto de cima para baixo, capturando os arquivos composer.json e composer.lock (comprometendo apenas o aplicativo / código não). O .gitignore excluirá o diretório 'vendor' e outros arquivos não desejados.

Isso oferece o melhor dos dois mundos mencionados na outra discussão. O problema atual é o tamanho e a complexidade do arquivo .gitignore, e a instalação do patch atualmente elimina alguma personalização local (por exemplo, em index.php). Solução alternativa de curto prazo - remova o index.php do .gitignore e, quando instalar um patch, verifique as alterações perdidas (git diff) e reaplique-as manualmente.

Alan Kent
fonte
OK, então você mudará algumas coisas no futuro próximo, legal! Gostaria de saber se essa "magento-force": "override"bandeira poderia ser útil de alguma forma. No momento, não está exatamente fazendo o que eu esperava. Caso você edite / estenda seus index.phpou quaisquer outros arquivos "principais", você pode simplesmente dizer ao Magento para não substituir suas alterações. Isto faz algum sentido?
Fmrng 29/01
3

Existe uma solução fácil para o seu problema de substituição: não altere os arquivos principais;) O Magento baseia-se em estender o código e não alterá-lo.

A primeira coisa é que você não deve colocar toda a pasta do aplicativo / código em um repositório vcs. Cada componente Magento (módulo, tema, etc ...) deve ser o próprio repositório.

Se você quiser alterar / estender o frontend, crie um novo tema e trate esse tema como seu projeto pesado, não como a Instância Magento2 inteira.

Para instalar o seu tema no seu projeto, você pode acessá-lo facilmente via compositor diretamente do seu repositório vcs

David Verholen
fonte
Bem, a app/codepasta está lá especificamente para personalizar o Magento. Meu entendimento do M2 atual é que app/codesubstitui o que app/code/localestava no M1, e os módulos da comunidade podem ser instalados via compositor em vendor. Temos alguns projetos com um grande número de módulos e vários temas também. O que você está sugerindo seria impossível de gerenciar.
fmrng
Ei, gerenciamos projetos com> 100 componentes dessa maneira. A chave é manter os módulos pequenos e gerenciar suas dependências do compositor entre os módulos. Você pode clonar o repositório de projetos magento para suas próprias necessidades e adicionar todos os seus componentes ao seu projeto
David Verholen
Se você está satisfeito com sua configuração atual, tudo bem. Honestamente, acho isso bastante complicado. Isso significa que você tem mais de 100 repositórios git e toda vez que você muda algo, precisa abrir um projeto específico, confirmar suas alterações e executar composer update. Onde você comete o seu composer.lockentão? Se você tiver mais de 10 desenvolvedores trabalhando no mesmo projeto, pode ser muito confuso. É claro que temos muitos módulos gerais (e até mesmo temas) que instalamos via compositor, mas o código específico do projeto deve ser versionado sob o mesmo repositório por uma questão de clareza.
fmrng
Não estou dizendo que você está fazendo errado, acho que é um pouco complicado demais para o meu gosto. Por interesse, como você inspeciona seu histórico de repositórios com essa configuração? Como você pode usar recursos como git blameou git logquando o código está espalhado em vários componentes? Você executa testes de integração para verificar se tudo está funcionando bem?
precisa saber é
tivemos essa discussão internamente no ano passado e as implantações ficaram bastante simples, pois decidimos torná-lo 1repo = 1module. O ponto é que você não faria uma atualização do compositor por uma pequena alteração. Os desenvolvedores trabalham em ambientes de desenvolvimento e alteram os arquivos diretamente. Quando terminar, eles podem marcá-lo como alfa, beta ou candidato a lançamento. Dessa forma, vários desenvolvedores podem trabalhar em muitos projetos ao mesmo tempo e, na próxima vez, você faz uma atualização do compositor e realiza todas as alterações. Existem ótimas ferramentas para organizar seus pacotes de vcs e compositores. Centenas de repositórios não devem ser um problema #
9137 David Verholen
2

Ok, parece que encontrei uma solução melhor para o que estava tentando alcançar. No composer.json, é possível especificar quais arquivos devem ser ignorados pelo instalador do Magento Composer. Se eu não quiser que meu Gruntfile.jsseja substituído, posso simplesmente especificá-lo com a seguinte configuração:

"extra": {
    "magento-deploy-ignore": {
        "magento/magento2-base": [
            "/Gruntfile.js",
            "/package.json"
        ]
    }
}

Agora posso estender a instalação padrão para atender às minhas necessidades.

fmrng
fonte
Esta solução não parece "atualização segura". Se o Magento fizer alterações nesses arquivos que você ignora, você não saberá ou esquecerá esses arquivos. Você está usando sua própria versão, que nunca incluirá essas novas alterações. Por favor, verifique minha resposta para minha sugestão.
7ochem 02/01/19
2

Infelizmente, a resposta aceita, embora tenha sido originalmente a maneira de atingir a meta desejada, funciona apenas para excluir arquivos e diretórios colocados na raiz, porque se queremos excluir um arquivo colocado em um subdiretório (por exemplo dev/tools/grunt/configs/themes.js, necessário se adicionarmos um novo tema e deseja usar as tarefas do Magento Grunt), colocando-o na configuração "magento-deploy-ignore", ele bloqueia a implantação de todos os diretórios pai (ou seja, dev e todos os seus subdiretórios).

Isso acontece porque o método que processa o "magento-deploy-ignore" ( \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored) usa strpospara combinar o caminho de destino com a lista de excluídos, portanto, todo caminho pai sempre retornará verdadeiro.

Gennaro Vietri
fonte
Eu sei, eu pude ver isso nos meus testes, mas como estamos usando um fluxo de trabalho de compilação diferente, ele funciona bem para nós. Você poderia encontrar uma opção melhor?
fmrng
Começamos a fazer a verificação dos arquivos durante a fase de construção do nosso pipeline, depois paramos de usar todas as tarefas internas do Grunt para que o atm não seja um problema.
Gennaro Vietri
By the way, começamos a avaliar de garfo magento-compositor-instalador para melhorar a "-magento-deploy ignorar" o comportamento, se o problema deve reaparecer podemos seguir este caminho
Gennaro Vietri
0

Usando patches

O que eu uso é criar e aplicar patches. Quando precisamos alterar dev/tools/grunt/configs/themes.js, index.phpou .htaccessaplicamos as alterações a uma cópia temporária do arquivo e criamos um patch a partir dele (crie um build/dir primeiro):

$ cp dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp
  # Now Make changes in .tmp file
$ diff -u3 dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp | sed 's/\.tmp//' > build/themes.patch
$ mv dev/tools/grunt/configs/themes.js.tmp dev/tools/grunt/configs/themes.js

Em seguida, podemos aplicar esse patch automaticamente ao executar composer installou updateadicionar comandos te à scriptsseção do seu composer.jsonarquivo:

{
    "scripts": {
        "post-install-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js",
        "post-update-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js"
    }
}

(Além disso, você pode colocar o patch ...comando acima em um script bash, digamos build/themes_patch.she chamar esse script do Composer para que seja reutilizável ou executável manualmente)

Atualização segura! : D

Esta solução é segura para atualização! Você não está alterando os arquivos principais diretamente, sem respeitar o arquivo original. Você está aplicando um patch no arquivo Magento2 original. Quando esse arquivo é alterado porque você está atualizando, o patch falha e você sabe que precisa examinar mais de perto as novas alterações e criar um novo patch.

7ochem
fonte