Gerenciando dependências da biblioteca de módulos com o compositor

9

Encontrei Dependências em um módulo personalizado com o drupal-compositer . Como posso incluir uma biblioteca de terceiros no meu módulo personalizado sem usar o Composer Manager e Como gerenciar as dependências do compositor no drupal 8, que estão relacionadas à minha pergunta, mas não parece mais aplicável desde o Drupal 8.1 e a descontinuação do gerente do Composer .

Também guias populares como A introdução definitiva ao D8 e Composer parecem não se aplicar, pois também mencionam o gerenciador do compositor.

A outra solução oposta ao gerenciador de compositores, alterar o arquivo composer.json principal, parece muito núcleo de hackers e provavelmente seria interrompido a cada atualização Drush do núcleo Drupal (?).

Mais especificamente, estou tentando atualizar o Views vCards do Drupal 7 para 8. Criei meu arquivo composer.json da seguinte maneira:

{
  "name": "drupal/views_vcards",
  "description": "Allows creation of vCards using the fields provided by the Views module.",
  "type": "drupal-module",
  "license": "GPL-2.0+",
  "homepage": "https://drupal.org/project/views_vcards",
  "require": {
    "maennchen/zipstream-php": "0.3.*"
  }
}

Mas se eu colocar um arquivo composer.json na pasta do módulo, como faço para informar o Drupal de que esse arquivo está lá e como garantir que a zipstream-phpbiblioteca necessária seja baixada?

A simples execução composer updateda raiz do Drupal atualiza muitas dependências do Drupal, mas não inclui os arquivos composer.json que estão nas pastas dos módulos. Eu também não suponho que eu deveria estar chamando composer installde dentro de todos os módulos com dependências.

Como conscientizo o Drupal da dependência de um módulo sem usar o gerenciador de compositores e / ou o núcleo de hackers?

ATUALIZAR:

O plug-in de composição do compositor usado pelo núcleo parece ter suporte para um caminho curinga:

{
    "require": {
        "wikimedia/composer-merge-plugin": "dev-master"
    },
    "extra": {
        "merge-plugin": {
            "include": [
                "composer.local.json",
                "extensions/*/composer.json" // < ---- THIS LINE
            ],
            "require": [
                "submodule/composer.json"
            ],
            "recurse": true,
            "replace": false,
            "merge-dev": true,
            "merge-extra": false
        }
    }
}

Por que o núcleo não se funde modules/*/composer.json, isso resolveria tudo certo?

Atualização 2:

O raciocínio para não apoiar isso é abordado nesta edição (que também está em silêncio há algum tempo).

Neograph734
fonte
11
A edição do arquivo principal do compositor é a maneira corrigida.
Eyal
Se você deixar o compositor gerenciar todas as suas dependências (incluindo o núcleo), seu problema desaparecerá. Veja packagist.org/packages/drupal/core
Eyal
Aqui está um exemplo de arquivo do compositor que escrevi para outra pergunta: drupal.stackexchange.com/a/187097/40011
Eyal:
Obrigado pela resposta @Eyal. Então, gerenciar todos os módulos de contribuição via composer.jsonarquivo é a nova maneira recomendada e o drush para baixar e instalar módulos está sendo substituído? Obviamente, o compositor resolverá automaticamente as dependências aninhadas e também fará o download das minhas dependências.
precisa saber é o seguinte

Respostas:

6

Novo método usando o drupal-scaffold para maior flexibilidade

Para o Drupal 8.4.0 e superior, usando drush> 9.0.0 , o drush make está obsoleto e você deve usar um fluxo de trabalho do compositor completo, conforme detalhado nos links de documentação do drupal.org abaixo. Esses links recomendam o uso de um projeto do compositor, mas isso pode não funcionar na configuração de todos os servidores da web. A seguir, passo a passo, como configurar o composer.json manualmente para obter uma explicação detalhada. As instruções para adicionar módulos manualmente ainda podem ser feitas.

# Initialize composer. Stability alpha is important for custom modules that may be source managed outside of packagist or drupal.org
composer init --name myvendor/mysite --stability=alpha --license=GPLv2
composer config repositories.drupal composer https://packages.drupal.org/8
composer config discard-changes true

Então você precisa adicionar manualmente ao compositor.json o seguinte, com base em suas preferências, porque não há como fazê-lo automaticamente com o compositor como está. Isso configurará o drupal-scaffold para instalar seus módulos onde você desejar (ao contrário do fornecedor / ou do diretório escolhido por algum outro desenvolvedor). Altere 'webroot' para 'www' ou 'public' ou qual é o seu host.

    "extra": {
        "installer-paths": {
            "webroot/core": ["type:drupal-core"],
            "webroot/modules/contrib/{$name}": ["type:drupal-module"],
            "webroot/modules/custom/{$name}": ["type:drupal-custom-module"],
            "webroot/themes/contrib/{$name}": ["type:drupal-theme"],
            "webroot/themes/custom/{$name}": ["type:drupal-custom-theme"],
            "webroot/profiles/{$name}": ["type:drupal-profile"],
            "webroot/libraries/{$name}": ["type:drupal-library"]
        },
        "patches": {}
    },
    "scripts": {
        "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold"
    }

Agora você pode instalar algumas dependências. Observe que o compositor deve poder usar scripts e plugins para que isso funcione.

composer require composer/installers:^1.4.0 drupal-composer/drupal-scaffold:^2.3.0 cweagans/composer-patches:^1.6.2

Execute o script drupal-scaffold uma vez (ou no servidor de compilação, conforme necessário):

composer drupal-scaffold

O núcleo do Drupal, módulos, temas, etc ... podem ser instalados conforme as instruções abaixo sem o drupal-merge-plugin.

composer require drupal/core:~8.5.1 drupal/views_vcards

Método mais antigo usando drupal-merge-plugin ou trabalhando diretamente com o core

Para o Drupal 8.1.0 e superior, você pode usar o compositor para exigir diretamente os módulos do Drupal. A documentação sobre o uso do Composer em um projeto Drupal e o uso do Composer para instalar pacotes Drupal através do Drupal.org foi atualizada para aproveitar as vantagens do pacote do drupal.org. Acho que já funciona bem em um cenário de implantação.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require drupal/views_vcards

Para o desenvolvimento, acho que adicionar manualmente a dependência com composer requirefunciona bem. A abordagem de mesclagem também funciona com o drupal-merge-plugin e eu uso isso para fazer meu fluxo de trabalho drush.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require mile23/drupal-merge-plugin
composer update

Atualização 2016.06.22

Corri um problema usando o drush make, que adicionava as tags de versão tradicionais do Drupal e os URLs do pacote drupal.org usando sempre. Para esse fim, precisei usar o packagist mais estável em https://packagist.drupal-composer.org , que ainda suporta as tags da versão tradicional do Drupal.

Observe também que o servidor ou a máquina de construção requer uma quantidade exorbitante de memória para fazer uma atualização (ou exigir) do compositor , o que é necessário em todos os cenários em que a execução da atualização do compositor em uma máquina de desenvolvimento semelhante não é possível em seu processo de construção.

Atualização 2016.09.23

Atualização 2018.03.30

  • Notou um voto positivo. Isso é bastante antigo, então decidimos esclarecer sobre o desenvolvimento mais recente e configurar o site diretamente com o compositor, já que o drush make ficou (infelizmente) obsoleto por um tempo.
mradcliffe
fonte
11
Ainda estou acostumado a usar o drush para baixar e instalar módulos, mas isso será totalmente substituído pelo compositor?
precisa saber é o seguinte
É assim que drupalci está fazendo isso agora, mas antes disso, você pode usar o plug-in de mesclagem diretamente. O patch que escrevi para drupalci inicialmente era drupal.org/files/issues/2597778-composer-contrib-18.patch . Isso foi confirmado, mas agora não está mais na base de código, pois é simplificado o uso do packagist e tudo, desde o compositor iirc. Também faço o seguinte com o TravisCI: cgit.drupalcode.org/xero/tree/.travis.yml#n40 . Depende do seu fluxo de trabalho.
Mestrcliffe
Talvez valha a pena adicionar um resumo sobre o Asset Packagist aqui para bibliotecas de terceiros com o Composer. Essa metodologia está sendo adotada por várias distros do Drupal e vários módulos de contribuição também a estão usando agora. Acabei contribuiu alguma documentação para oficializar esta solução drupal.org/docs/develop/using-composer/... e drupal.org/docs/develop/using-composer/...
JamesWilson