Qual é o fluxo de trabalho de atualização principal baseado em compositor correto?

16

Desejo usar o compositor para gerenciar dependências do Drupal 8, mas não tenho certeza de qual é o fluxo de trabalho de atualização do núcleo correto. No momento, estou usando o drush para atualizar o core para a versão beta mais recente, mas também tenho algumas dependências no meu arquivo composer.json, portanto, após a atualização, estou usando a instalação do compositer para instalar todas as dependências do fornecedor contrib. Parece que a execução composer installsubstitui alguns arquivos no diretório principal, embora eu tenha acabado de atualizar o núcleo para a versão mais recente.

Eu também tentei editar manualmente o arquivo composer.json e substituir a linha "drupal / core" pela versão beta específica, por exemplo "drupal/core": "~8.0-beta14",, mas ele ainda substitui os arquivos no diretório principal.

Qual é o fluxo de trabalho certo?

rreiss
fonte

Respostas:

11

Presumo que você esteja usando o drupal-compositor / drupal-project como base para o seu projeto. Caso contrário, dê uma olhada nesse projeto e compare-o com o seu.

Além disso, você disse que deseja usar o compositor para gerenciar as dependências do Drupal 8, então presumo que você tenha selecionado seus módulos de contrib via composer require drupal/devele não drush dl devel.

Se você estiver fazendo todas essas coisas, deverá composer updateatualizar o núcleo do Drupal e todos os seus módulos de contribuição. Enquanto você mantiver seu composer.lockarquivo, composer installnão deverá alterar a versão de nenhuma de suas dependências. Você não deve usar drush pm-updatenada. Não deve importar se os arquivos do corediretório são atualizados ou não, pois esse diretório é gerenciado pelo Composer. É melhor não comprometer diretórios gerenciados por compositores em seu repositório, embora possa, se desejar.

Obviamente, você deve executar drush updatedbsempre que composer updatesubstituir o núcleo do Drupal ou qualquer módulo.

Para evitar a obtenção de versões de desenvolvimento, defina sua estabilidade mínima como 'beta' no arquivo composer.json usando os sinalizadores de estabilidade do Composer .

Se você estiver usando drupal-compositer / drupal-project para gerenciar seu site, todos os arquivos no nível raiz, como README.txt, .htaccess e index.html, serão de propriedade do seu projeto. Isso significa que você deve registrá-las no seu repositório git; O Composer não os atualizará; você deve atualizá-los quando mudarem. Esses arquivos devem mudar apenas raramente, mas o drupal-compositer / drupal-project possui um script para atualizar esses arquivos .

greg_1_anderson
fonte
Vamos supor que estou usando a atualização do compositor em vez de drush pm-update, como atualizo arquivos como README.txt, .htaccess, etc.? E como a atualização drush fornece um núcleo diferente da atualização do compositor? E devo substituir a versão do drupal no meu composer.json para 8.0-betaX antes de cada atualização? Eu não quero usar dev. versão ..
rreiss
Atualizado a resposta.
Greg_1_anderson
+1 greg_1_anderson - isso parece ótimo. Essa é a maneira definitiva de fazer atualizações de segurança para o Drupal 8? com D7, é: drupal.stackexchange.com/a/71578
therobyouknow
Parece que funciona se alguém instalou o Drupal 8.1 inicialmente com estas etapas: drupal.org/node/2471553 (achei que funcionava sem erro)
therobyouknow
"Obviamente, você deve executar drush updatedbsempre que a atualização do compositor substituir o núcleo do Drupal ou qualquer módulo." - obrigado e se você instalou o drupal inicialmente com essas etapas, drupal.org/node/2471553 , precisará do caminho completo para o drush específico com a instalação do Drupal 8 (como eles costumavam executar a instalação como a etapa final). Você primeiro precisa fazer o cd na web e, uma vez em / web, o comando para atualizar o banco de dados com o caminho completo seria: ../vendor/drush/drush/drush updatedb(Eu achei que isso funcionava).
Therobyouknow 19/07
2

O seguinte é OK para sistema liberta 8.4.x> 8.4.y , mas não OK para lançamentos menores 8.4.x> 8.5.x . Vá para a ATUALIZAÇÃO 3 abaixo para o que acredito ser "a resposta" para atualizações menores de versão.

1- Faça backup dos arquivos que acompanham o Drupal que você modificou, como .htaccess, robots.txt, etc. (esses 2 são os mais comumente alterados).

2- [Me disseram que o arquivo de bloqueio de exclusão está errado, consulte ATUALIZAÇÃO abaixo] Exclua o arquivo composer.lock (na pasta de nível superior do seu site). Isso é recriado na etapa 5.

3- Verifique seu compositer.json (na pasta de nível superior do seu site) e verifique se o "drupal: core" está na seção de necessidade e não em uma seção de substituição, por exemplo

"require": {
"drupal/core": "^8.4"
},

não

"replace": {
"drupal/core": "^8.4"
},

Se "drupal / core" estiver na seção de substituição, mova-o para a seção de necessidade e exclua a seção de substituição. Se houver outras entradas na seção de substituição, basta remover o "drupal / core" e não toda a seção de substituição - mas acho que "drupal / core" é normalmente a única coisa lá.

Coloque em qual versão você deseja atualizar em "drupal / core", exemplos:

"drupal / core": "^ 8.5" - será atualizado para a versão mais recente do 8.5. "drupal / core": "8.4.6" - será atualizado para a versão 8.4.6.

5- Execute isto (na pasta de nível superior do seu site):

composer update drupal/core --with-dependencies

6- Se não houver erros, faça o habitual, execute as atualizações e limpe o cache:

drush updatedb
drush cr

Ou, se não estiver usando o drush, vá para /update.php para executar atualizações, depois para admin / config / development / performance e clique no botão "Limpar todos os caches".

7- Se você fez o backup dos arquivos na primeira etapa (.htaccess, robots.txt), coloque-os de volta. Mas verifique se o Drupal fez atualizações nesses arquivos e adicione essas alterações às suas.

FEITO

Se houve erros com a atualização do compositor na etapa 5, geralmente isso ocorre devido a problemas com versões do material na pasta do fornecedor.

Este é um ótimo post para lidar com esses problemas: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update e leia os outros 2 posts de Jeff no Drupal and Composer para obter mais conhecimento sobre isso.

Foi-me dito por duas pessoas no Twitter que o composer.lock não deve ser excluído (Etapa 2 acima). O composer update drupal/core --with-dependenciescomando recria o arquivo de bloqueio de qualquer maneira.

Ao testar esse método, acho que funciona bem para 8.4.3> 8.4.6 (por exemplo), mas recebo erros para 8.4.6> 8.5.x. Irá relatar quando eu descobrir.

Exemplo de erros:

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - drupal/core 8.5.0 requires symfony/yaml ~3.4.5 -> satisfiable by symfony/yaml[3.4.x-dev].
    - Installation request for drupal/core 8.5.0 -> satisfiable by drupal/core[8.5.0].
    - Installation request for symfony/console (locked at v3.2.8, required as ~3.2.8) -> satisfiable by symfony/console[v3.2.8].

Este post de Jeff Geerling aborda questões semelhantes, mas até agora não tenho sorte: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update

Então ... a única coisa que parece funcionar para mim para 8.4.x> 8.5.x é a "opção nuclear" que muitos outros parecem usar, que é executada composer update.

Acho que está tudo bem, desde que você tenha certeza das versões do módulo em composer.json. Talvez alguém deva bloqueá-los para a versão atual. Por exemplo:

"drupal/address": "1.3"

ao invés de:

"drupal/address": "^1.3"

Mas é a resposta certa?

OK, a resposta que parece estar em toda parte é fazer a "opção nuclear":

A. Exclua a /vendorpasta.

B. Execute composer updatee simplesmente atualize seus módulos junto com o core. Ou bloqueie as versões do módulo, composer.jsonse você não quiser atualizá-las.

Uma pessoa do Drupal Slack disse que "toda a filosofia do Composer é que você deve sempre atualizar os pacotes com a maior frequência possível" . O pacote inclui módulos, eu acho. Então faz algum sentido, eu acho.

Quando cheguei do 8.4.6 ao 8.5.0, isso funcionou bem para passar do 8.5.0 ao 8.5.1 composer update drupal/core --with-dependencies, da mesma forma que nos 8.4.3 ao 8.4.6.

Estou começando a concluir que "a resposta" é excluir a pasta do fornecedor e o arquivo composer.lock e, em seguida, usá composer update-lo, e deve-se simplesmente garantir que os números de versão das dependências no arquivo composer.json sejam o que você deseja . Não é tão importante gerenciar em quais versões do módulo você deseja manter ou permitir a atualização composer.json.

Por exemplo:

"drupal/admin_toolbar": "1.18", significa ficar com 1,18

"drupal/admin_toolbar": "^1.18", significa ir em frente e atualizar, mas dentro de 1.x (não 2.x)

Isso é apoiado por um comentário (General Redneck) nesta postagem: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update "Uma das coisas que eu O que eu descobri enquanto trabalho no suporte é que bloquear as versões dos módulos e do núcleo é uma boa idéia, para que você possa ouvir a coisa quando quiser, porque há momentos em que alguns dos vários plugins nem querem se comportar corretamente. "

A propósito, o arquivo composer.lock não ajuda em nada composer updateporque fica deslumbrado (ao contrário de composer installonde o arquivo de bloqueio é lido):

A corrida composer installirá:

  • Verifique se composer.lockexiste
  • Caso contrário, execute a composer updatepara criar um
  • Se composer.lockexistir, instale as versões especificadas no arquivo de bloqueio

A corrida composer updateirá:

  • Verifica composer.json
  • Determine as versões mais recentes a serem instaladas com base nas especificações de sua versão
  • Instale as versões mais recentes
  • Atualização composer.lockpara refletir as versões mais recentes instaladas

Ref: https://www.engineyard.com/blog/composer-its-all-about-the-lock-file

Vejo que isso é mencionado acima: https://github.com/drupal-composer/drupal-project . Eu usei isso e está bom, mas não é um requisito para usar o Composer com o Drupal. É confuso, pois meio que "soa" como se fosse o nome. Quando comecei com o Drupal 8, pensei que era necessário, então construí meu primeiro site D8 com isso, pensando que era uma prática recomendada.

Essa "versão" do Drupal tem ele docroot em uma pasta / web, não na pasta superior do projeto. Também há um monte de coisas adicionadas ao .gitignore em comparação com o Drupal normal:

/drush/contrib/
/vendor/
/web/core/
/web/modules/contrib/
/web/themes/contrib/
/web/profiles/contrib/
/web/libraries/

Portanto, esta versão do Drupal é realmente mais voltada para sites que usam integração contínua para fazer uma nova compilação do Drupal em cada implantação, usando a instalação do compositor. Se você implantar com um método mais normal, obviamente precisará comprometer todo o material acima no seu repositório git ou ele não será implantado no seu servidor [1], e esse material é necessário para que o Drupal seja executado.

[1] se o git estiver envolvido com sua implantação - se você implantar com SFTP, ignore isso.

Richard Hood
fonte
composer update drupal/core symfony/config webflo/drupal-core-strict --with-dependenciesnunca me falhou ainda. Funciona em várias versões secundárias, por exemplo, 8.3 -> 8.6
Clive
1

Usando o pacote drupal / core em packagist.org , podemos realmente gerenciar o núcleo, os módulos contrib (, temas e perfis) e os outros fornecedores via compositor.

Eu configurei os seguintes arquivos no meu diretório raiz e executei composer install

compositer.json

{
  "require": {
    "composer/installers": "^1.0.20",
    "drupal/core": "8.0.*"
  },
  "extra": {
    "installer-paths": {
      "core": ["type:drupal-core"],
      "modules/contrib": ["type:drupal-module"],
      "profiles/contrib": ["type:drupal-profile"],
      "themes/contrib": ["type:drupal-theme"]
    }
  },
  "scripts": {
    "post-install-cmd": [
      "./post_install.sh"
    ]
  }
}

post_install.sh

#!/usr/bin/env bash
export RAW_DRUPAL="https://raw.githubusercontent.com/drupal/drupal/8.0.x"
curl $RAW_DRUPAL/example.gitignore > example.gitignore
curl $RAW_DRUPAL/.gitattributes > .gitattributes
curl $RAW_DRUPAL/.htaccess > .htaccess
curl $RAW_DRUPAL/.csslintrc > .csslintrc
curl $RAW_DRUPAL/.editorconfig > .editorconfig
curl $RAW_DRUPAL/.eslintrc > .eslintrc
curl $RAW_DRUPAL/.eslintignore > .eslintignore
curl $RAW_DRUPAL/index.php > index.php
curl $RAW_DRUPAL/update.php > update.php
curl $RAW_DRUPAL/web.config > web.config
curl $RAW_DRUPAL/autoload.php > autoload.php
curl $RAW_DRUPAL/robots.txt > robots.txt
mkdir -p sites/default
curl $RAW_DRUPAL/sites/example.sites.php > sites/example.sites.php
curl $RAW_DRUPAL/sites/development.services.yml > sites/development.services.yml
curl $RAW_DRUPAL/sites/example.settings.local.php > sites/example.settings.local.php
curl $RAW_DRUPAL/sites/default/default.services.yml > sites/default/default.services.yml
curl $RAW_DRUPAL/sites/default/default.settings.php > sites/default/default.settings.php

Desfrutar :)

Eyal
fonte
Acho que vou precisar de toda a magia que você fez. Eu esperava que todos esses arquivos necessários fossem criados pelo compositor.
Dxvargas
@hiphip Os arquivos fora do diretório principal não são alterados com frequência, portanto, o acima pode ser um script que você executa manualmente quando o drupal atualiza de uma versão menor para a próxima (por exemplo, 8.1 a 8.2)
Eyal
1

Sim, você pode gerenciar o núcleo do Drupal com o compositor. Existem algumas coisas que você deve estar ciente.

Você provavelmente terá tempos limite devido a vários itens que o compositor precisa executar, principalmente se você executar em uma VM local. Se você executar composer install, provavelmente receberá o erro do compositor:

 [RuntimeException]                                    
  Could not delete core/.nfs0000000000000000000001:

Certifique-se de usar

{
  "require": {
   "drupal/core": "8.3.*"

Adicione também uma extensão ao tempo limite na configuração

    "installer-paths": {
        "core": ["type:drupal-core"],
        "modules/contrib/{$name}": ["type:drupal-module"],
        "profiles/contrib/{$name}": ["type:drupal-profile"],
        "themes/contrib/{$name}": ["type:drupal-theme"],
        "drush/contrib/{$name}": ["type:drupal-drush"],
        "modules/custom/{$name}": ["type:drupal-custom-module"],
        "themes/custom/{$name}": ["type:drupal-custom-theme"]
    }
},

"config":{
            "process-timeout": 1600
       },

Além disso, se isso não funcionar, você pode executar a instalação do compositor de fora do SSH na sua VM .

Isso ignorará qualquer tempo limite de compartilhamento do NFS e descompactará o Drupal no lugar certo.

BigEd
fonte
0

"drupal / core": "~ 8.0-beta14" significa qualquer versão maior que 8.0-beta14 e menor que 9! Você deseja remover o til para travá-lo em uma versão específica. Em seguida, certifique-se de atualizar seu arquivo de bloqueio executando o compositor e, no sistema de destino, use a instalação do compositor.

Uma maneira fácil de começar é criar a base de código usando https://github.com/drupal-composer/drupal-project .

Quando precisamos atualizar algo como atualizar o núcleo, você executa o "compositor" localmente. Isso atualizará o arquivo composer.lock.

Quando outros desenvolvedores são suspensos ou em um script de implantação, você executa a "instalação do compositor", que usa o arquivo de bloqueio.

A linha em nosso compositor.json para o núcleo do Drupal é:

"drupal/core": "~8.0",

O til () significa qualquer liberação dentro do número 8 (mas não 9) .

Se você deseja bloqueá-lo para uma versão específica, não deve usar o til.

"drupal/core": "8.0-beta14",

execute o "compositer up" localmente, confirme o arquivo composer.json e o composer.lock e execute a "instalação do compositor" em outras instalações depois de puxar a base de código.

oknate
fonte