Como usar o módulo Features em um ambiente de 3 desenvolvedores?


19

Trabalhando em um projeto, fazendo uso intenso de Recursos , às vezes há 3 desenvolvedores para este aplicativo.

Tentamos algumas abordagens, mas quando mesclamos nossos ramos git, parece que muitas vezes “sobrescrevemos” as características dos outros. Os conflitos são abundantes, quebrando o módulo de recursos, tornando-o doloroso de usar, ao que parece.

O recurso é realmente um grande poupador de tempo de configuração para um projeto, e tenho certeza de que há uma maneira de resolver isso.

Existe um fluxo de trabalho ou procedimento que reduz os riscos de conflitos e substituições?

Quaisquer pistas sobre os recursos são bem-vindas.

Respostas:


20

Bem-vindo à terra de F eatures C ONFIGURAÇÃO M anagement, aka FCM ! Não se trata apenas de Recursos , e não de Gerenciamento de Configuração (conforme apresentado no Drupal versão 8). Em vez disso, é um caso especial de S oftware C ONFIGURAÇÃO M ESTÃO , também conhecido como SCM . Principalmente porque os Recursos podem ser considerados como um gerador de código, enquanto esse código gerado precisa ser migrado por vários ambientes. Continue lendo para mais detalhes.

1 - Prós e contras do uso de recursos

Vantagens de usar os recursos

  • Automatize a implantação das alterações aplicadas a um site de desenvolvimento do Drupal em um ou mais sites de produção do Drupal (pré-) de destino (em vez da implantação manual).
  • Facilita o compartilhamento (envio) do desenvolvimento contínuo do Drupal entre desenvolvedores / construtores de sites do Drupal (por exemplo, para tornar algumas visões criadas por um especialista em visualizações disponíveis para um Drupal Themer que trabalha em outro site de desenvolvimento para colocar o tema nessa visualização).
  • Ótima integração com o GIT e o Drush para enviar uma cópia do código gerado pelo Features (no site de desenvolvimento) para os locais de destino (pré-) de produção selecionados.

Desvantagens do uso de recursos

  • Evitar conflitos de recursos e / ou gerenciar dependências de recursos pode ser um desafio!
  • Não é fácil começar a usar os Recursos em um site existente (de produção).
  • A instalação / ativação do módulo Recursos é fácil (apenas um módulo), mas aprender a usar os Recursos corretamente é um grande desafio.

2 - Técnicas para embalagem de recursos

Usando Recursos , é de sua própria imaginação como empacotar (compor) o conteúdo de um recurso. Aqui estão algumas técnicas que podem ser usadas para isso.

Um único super recurso

Essa é uma técnica de empacotamento bastante simples: tudo é empacotado em um único recurso (alguns chamam de "Deus" ...). Parece fácil, bem avançado, etc. Mas essa técnica também leva a "conflitos" (como explicado abaixo) mais ou menos imediatamente ...

Uma boa maneira de usá-lo parece ser ao criar uma "distribuição Drupal", na qual todos os usuários devem usar o mesmo conjunto de módulos, configurações etc. Se, no entanto, essa distribuição consistir em várias funcionalidades do site (para não usar a palavra "recursos" ...), parece mais apropriado dividir esses recursos em vários recursos, conforme explicado abaixo.

Com base na funcionalidade do site

Essa técnica de empacotamento cria um recurso separado para cada funcionalidade de um site, como:

  • Recurso A = implemente uma " * Galeria ".
  • Recurso B = implementar um " * Blog ".
  • Recurso C = implementa um " * Calendário de Eventos ".

Com base nas seções de administração do Drupal

Essa técnica de empacotamento cria recursos separados para cada uma das seções de administração (principais) de um site Drupal que é usado para criar o site, como:

  • Todos os módulos necessários estão contidos no recurso A,
  • Todas as definições de campo base estão contidas no recurso B,
  • Todos os tipos de conteúdo estão contidos no recurso C,
  • Todas as permissões estão contidas no recurso D,
  • Todas as funções estão contidas no recurso E,
  • Todas as variáveis ​​estão contidas no recurso F,
  • Todas as visualizações (personalizadas) estão contidas no recurso G,
  • Todas as regras (personalizadas) estão contidas no recurso H,
  • Etc.

A lista acima é praticamente ilimitada: no final, você pode pensar nisso como um recurso para cada opção do menu de administração do Drupal ... se você quiser ir tão longe.

OMI também é a abordagem mais recomendada para os recursos do pacote.

3 - Reduzir a probabilidade de conflitos em Recursos e / ou GIT

Não reutilize campos

Muitos conflitos parecem ser causados ​​pela reutilização de campos entre vários tipos de conteúdo. Por exemplo, no tipo de conteúdo A, você tem um campo com o nome da máquina field_somefield, que também é usado como campo no tipo de conteúdo B com o mesmo nome de máquina, field_somefieldmas que como outro tipo de campo e / ou outras configurações de campo diferentes.

Ao não reutilizar campos entre os tipos de conteúdo, você evita a execução neste problema. Dê uma olhada em uma convenção de nomenclatura interessante para o nome da máquina dos seus tipos e campos de conteúdo, conforme mostrado na tabela Wrapping Information Architecture and Documentation , que faz parte dos artigos sobre " Modelo de relatividade para Drupal ". Para obter mais detalhes, consulte minha resposta para " Como modelar conteúdo (tipos) do ponto de vista centralizado no banco de dados? ".

Dividir recursos, dependendo de quem trabalha com o quê

Se várias pessoas estiverem trabalhando em um único site, a quantidade de conflitos poderá ser reduzida organizando (= criando separados) recursos com base em quem está trabalhando em quê. Uma ilustração disso pode ser como neste exemplo:

4 - Ambientes Drupal recomendados

Tudo o que foi mencionado acima deve ajudar a facilitar o uso dos Recursos . No entanto, para garantir que as coisas funcionem conforme o esperado (projetado), você também precisa ter um conjunto apropriado de ambientes (sites Drupal relacionados à lógica) por basicamente esses motivos:

  • funcionalidade de mesclagem fornecida por vários recursos.
  • prever e resolver conflitos.
  • teste do usuário final de todos os recursos mesclados certificados para não ter nenhum conflito.

No mundo ideal, esses sites Drupal relacionados à lógica devem ser configurados e usados ​​da seguinte maneira:

  1. Site de desenvolvimento pessoal - cada desenvolvedor de site possui um site de desenvolvimento separado. Quando alguma parte do desenvolvimento está pronta para ser compartilhada com outra pessoa, um recurso apropriado é criado, enviado ao ambiente de preparação.
  2. Site Sandbox - este é um ambiente Drupal que contém apenas o núcleo Drupal, usado para testar a integridade de um único recurso. Se um recurso, acidentalmente, tiver algumas dependências inesperadas (por exemplo, em algum módulo do qual o recurso dependa, que não esteja ativado na Sandbox), é aqui que essa dependência ficará clara.
  3. Site de armazenamento temporário - aqui é onde um ou mais recursos (criados em um site de desenvolvimento) são entregues. Pode ser apenas algum hotfix para algum problema de produção ou pode ser o local em que todo o desenvolvimento de uma nova versão do site é consolidado. Se houver algum conflito entre vários recursos, esse é o ambiente no qual eles aparecerão primeiro ... e precisam ser resolvidos de alguma forma.
  4. Site de controle de qualidade - depois que o ambiente de armazenamento temporário é considerado estável, é hora de seguir com os recursos relevantes e disponibilizá-los também em algum nível superior, onde eles podem ser usados ​​para testes de controle de qualidade, testes de aceitação, testes de volume etc. Nesse nível, você deve ser extremamente cuidadoso ao permitir alterações adicionais (se houver). Porque essa alteração pode invalidar todos os esforços de teste anteriores já concluídos neste ambiente.
  5. Site de produção de sombra - Para preparar a ativação na produção real, você pode primeiro promover ainda mais os recursos relevantes para um ambiente que é considerado uma cópia (sombra) do seu ambiente de produção real. Se, nesse momento, durante o processo de migração, ainda houver alguma coisa quebrada, isso será uma bandeira vermelha para reverter algumas das etapas anteriores. Corrija-o e tente novamente até que todas as partes envolvidas aprovem as alterações.
  6. Site (s) de produção - Se você concluiu todas as etapas anteriores, essa etapa deve ser autoexplicativa e bastante fácil. Dependendo das suas necessidades, esse pode ser um site único ou algo equivalente aos vários sites do Drupal, enquanto todos os sites envolvidos estão executando as mesmas versões de todos os recursos.
  7. Site da linha de base - Na minha experiência, não há muitas (se houver) implementações do Drupal em que esse tipo de site é usado (também). É simplesmente uma cópia do (s) Site (s) de Produção, mas está disponível para os desenvolvedores, testadores, etc. do Drupal, que podem ser usados ​​para verificar como são os sites de produção ou para executar o treinamento do usuário etc. E sempre que um novo desenvolvimento Quando o ciclo é iniciado, os componentes de um site que serão impactados (precisam ser alterados) devem ser "copiados de alguma forma" usando este Site da Linha de Base como entrada, com o objetivo de um Site de Desenvolvimento Pessoal .

Obviamente, o inventário acima de tipos de sites Drupal é como o mundo ideal. Dependendo do tamanho da sua equipe de desenvolvimento e / ou dos orçamentos disponíveis para criá-los e mantê-los, nem todos eles podem ser usados ​​(ou acessíveis). Esse inventário é modelado com base nas melhores práticas na área de SCM, usadas principalmente em todas as grandes empresas globais / (bancos, companhias aéreas, etc.).

5 - Módulos relacionados

Braço forte

O módulo Strongarm permite exportar variáveis ​​(de módulos que armazenam suas configurações em variáveis) com o módulo Features.

Exportação de Nó

O módulo de exportação do nó permite que os usuários exportem nós e depois os importem para outra instalação do Drupal.

Exportação de Função

O módulo Exportação de Função permite que as funções tenham nome_da_máquina e gera uma identificação de função exclusiva (livre) baseada fora do nome_máquina. As funções podem ser exportadas com Recursos e obter exatamente o mesmo livrar se importadas em outros sites.

Funções Banish

O módulo Proibição de recursos permite excluir completamente os componentes de recursos individuais da interface do usuário e da exportação de recursos. Aqui está uma citação sobre ele na página do projeto:

 Este módulo é útil quando há componentes de recursos que você deseja garantir que NUNCA seja exportado. Se você estiver usando recursos para criação ou implantação de sites, provavelmente já encontrou o problema de alguém exportar acidentalmente variáveis ​​de carimbo de data e hora, como cron_last ou update_last_check. Você também pode banir as permissões dos módulos de desenvolvedor, para que não sejam apanhados pelo restante das permissões de site que deseja exportar. Os itens banidos não aparecerão no seu módulo de recursos OU EM QUALQUER OUTRO MODO DE RECURSOS, portanto, use com cuidado. Para uma lista central dos recursos que nunca devem ser exportados, consulte https://www.drupal.org/node/2400531

FEIJÃO

O módulo Bean torna seus blocos exportáveis. Aqui está uma citação sobre ele na página do projeto:

Pense em um Bean como um método para fornecer novos tipos (em comparação com o nó, esse seria um tipo de conteúdo), que fornece uma interface de adição de conteúdo para criar quantos blocos forem necessários (veja a captura de tela abaixo). O conteúdo do bean pode ser colocado no site como qualquer outro bloco.

Este módulo também funciona muito bem em combinação com os módulos UUID e UUID Features Integration . Este módulo foi iniciado apenas a partir do D7, mas já foi incluído no núcleo do Drupal 8. O tutorial em vídeo do módulo Drupal Bean - usando a interface do usuário Admin do Bean fornece uma ótima introdução para realmente entender o poder deste módulo e o tipo de coisa que você pode fazer com ele (usando apenas técnicas de criação de sites, sem codificação personalizada envolvida).

Habitat

O módulo Habitat faz mais sentido em um fluxo de trabalho baseado em recursos . Aqui está uma citação sobre ele na página do projeto:

Em uma configuração de vários ambientes (por exemplo, prod, test, dev, local), existem alguns módulos que você deseja sempre ativar ou desativar em determinados ambientes. Cada vez que você sincroniza um banco de dados, é necessário reativar / desativar os mesmos módulos. Pior, você fica preguiçoso e mantém os módulos de desenvolvimento ativados na produção.

O Habitat fornece configurações para ativar ou desativar determinados módulos em cada ambiente (habitat). Basta definir uma variável com, por exemplo, $ conf ['habitat'] = 'local'; no seu arquivo settings.php (a variável real a ser usada lá é configurável para o seu fluxo de trabalho atual). Os módulos de desativação / ativação são feitos em hook_init.

6 - Recursos recomendados:

7 - Alternativas possíveis ao uso de recursos

Se você ainda não é capaz, ou não deseja, de usar os Recursos , convém verificar até que ponto as abordagens / módulos abaixo podem fornecer algum tipo de alternativa.

Exportação / Importação Manual

Essas são as facilidades conhecidas (para evitar os recursos da palavra ...) disponíveis na UI do administrador, para módulos como Regras , Visualizações , etc. (lista incompleta!).

Cópia do pacote

Algumas pessoas consideram o módulo de cópia Bundle como uma possível alternativa. Possui suporte à exportação / importação para:

  • Tipos de nós.
  • Taxonomia.
  • Do utilizador.
  • Campos da API do campo.
  • Grupos de campo.

1
Melhor resposta que eu já vi.
No Sssweat

@NoSssweat Merci pelos elogios ... mas sei que considero isso ainda incompleto. Por exemplo, dificilmente inclui nada sobre o "ciclo de vida" dos recursos de processamento, e ainda não diz muito sobre coisas como análise de impacto, auditoria, gerenciamento de liberação, autorizações e, e, e (e mais uma dúzia de tópicos).
Pierre.Vriens

1
@ Pierre.Vriens - Obrigado! Acho que cheguei à mesma conclusão que sua excelente resposta da maneira mais difícil. Eu tentei a abordagem de divisão por componentes (visualizações de visualizações, dependência etc.), mas estava tendo conflitos ao tentar gerar o recurso. Percebi -> depois -> que provavelmente precisava configurar o recurso para não verificar dependências e ignorar conflitos.
stefgosselin

7

Conflitos de mesclagem provavelmente serão úteis quando vários desenvolvedores estiverem integrando sua configuração a um Recurso. Eu escrevi várias diretrizes para revisar o código de recurso, mas acho que o mais importante é o seguinte:

Confirme apenas as alterações de código pretendidas.

O que isto significa? Isso significa que cada desenvolvedor deve revisar o código antes de confirmar. Não há "mágica" para impedir alterações não intencionais do código sem que um desenvolvedor seja cauteloso.

  • Revise as alterações de código com git diff.
  • Faça um patch rápido usando git diff > blah.patche modifique-o manualmente para incluir apenas as alterações de configuração pretendidas.
    • Coisas como "mtime", comentários na exibição de exportações no arquivo de informações não precisam ser incluídos no commit.
    • Eu me tornei bastante hábil em revisar blocos de diferenças de código de configuração ao longo do tempo. Agora é mais fácil identificar alterações supérfluas em visualizações ou painéis, e um rápido 10ddno vim se livra da alteração em um patch (por exemplo).
    • Penso: "Ah, ei, eu não mudei nada com campos, então não vou confirmar featurename.features.field_base.inc".
  • Nunca use nunca git commit -a. Essa é uma prática terrível que deve ser prejudicada pelo uso. Sempre adicione e confirme explicitamente!
  • Use git rebasenas ramificações git locais para garantir que o recurso esteja mais atualizado.
  • Uma estratégia de mesclagem git também pode ajudar ao realmente fazer uma mesclagem:
    • git merge -s recursive -X patience (requer git 1.7+ iirc).

Por fim, considere adicionar restrições sociais aos desenvolvedores para que um desenvolvedor precise revisar seu código antes de se unir ao trunk / stable com revisão de patches ou solicitação de recebimento. As pessoas ficam zangadas com as restrições sociais, mas devem se zangar por não revisarem seu código.


Melhor do que gerar um arquivo de patch é usar apenas git add -ppara confirmar blocos específicos.
Donquixote
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.