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/code
pasta 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.
Se eu confirmar meu
Gruntfile.js
, isso será sobrescrito pelomagento/magento2-base
pacote quando executarcomposer install
depois de clonar o repositório.Se eu confirmar minha
gulpfile.js
, não posso realmente definir minhas dependências em apackage.json
, porque ela também seria substituída pormagento/magento2-base
.Se eu decidir usar a configuração Grunt do Magento e quiser personalizá-la editando os arquivos em
/dev/tools/grunt
(por exemplothemes.js
), não posso, porque minhas alterações seriam substituídas pormagento/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,
/build
por 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-base
por 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 false
para ignorar a substituição. Quando executo, composer install
minha 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.
fonte
Gruntfile.js
,gulpfile.js
epackage.json
problema está resolvido. O problema abordado nesta pergunta ainda é aplicável às versões mais recentes do Magento 2 quando você precisar alterarthemes.js
,index.php
ou.htaccess
por exemplo.Respostas:
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
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.
fonte
"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 seusindex.php
ou quaisquer outros arquivos "principais", você pode simplesmente dizer ao Magento para não substituir suas alterações. Isto faz algum sentido?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
fonte
app/code
pasta está lá especificamente para personalizar o Magento. Meu entendimento do M2 atual é queapp/code
substitui o queapp/code/local
estava no M1, e os módulos da comunidade podem ser instalados via compositor emvendor
. 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.composer update
. Onde você comete o seucomposer.lock
entã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.git blame
ougit log
quando o código está espalhado em vários componentes? Você executa testes de integração para verificar se tudo está funcionando bem?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 meuGruntfile.js
seja substituído, posso simplesmente especificá-lo com a seguinte configuração:Agora posso estender a instalação padrão para atender às minhas necessidades.
fonte
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
) usastrpos
para combinar o caminho de destino com a lista de excluídos, portanto, todo caminho pai sempre retornará verdadeiro.fonte
Usando patches
O que eu uso é criar e aplicar patches. Quando precisamos alterar
dev/tools/grunt/configs/themes.js
,index.php
ou.htaccess
aplicamos as alterações a uma cópia temporária do arquivo e criamos um patch a partir dele (crie umbuild/
dir primeiro):Em seguida, podemos aplicar esse patch automaticamente ao executar
composer install
ouupdate
adicionar comandos te àscripts
seção do seucomposer.json
arquivo:(Além disso, você pode colocar o
patch ...
comando acima em um script bash, digamosbuild/themes_patch.sh
e 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.
fonte