Puncte:0

Rulați un cârlig de actualizare după ce a fost importată o anumită configurație?

drapel in

Introduc o nouă configurație pentru o entitate din Drupal care adaugă câteva câmpuri booleene noi. Problema este că, deși am setat valoarea implicită ca TRUE în UI, aceasta este doar pentru entitățile noi. Entitățile existente nu vor avea valoare sau false atunci când sunt evaluate în cod.

Aș dori să scriu o modificare în care toate entitățile existente sunt implicite la TRUE atunci când configurația este introdusă pentru compatibilitate inversă și o rulează doar o singură dată.

Scripturile de implementare tipice recomandă să rulați updb mai întâi înainte de cim cu Drush. Acest lucru creează un conflict atunci când încercați acest lucru.

Exemplu de script de implementare Pantheon:

dacă (isset($_ENV['PANTHEON_ENVIRONMENT'])) {
  $status = 0;
  $config_directory = dirname(__FILE__) . '/config/default';

  passthru("drush updb --yes", $status);
  passthru("drush cim --yes", $status);
  passthru("drush cim --yes", $status);
  passthru("drush cim --yes", $status);
  passthru("drush updb --yes", $status);
  passthru("drush cr", $status);

  dacă ($status == 0) {
    echo('Configurație importată și baza de date actualizată.' . "\n");
  } altfel {
    echo('Configurația nu a fost importată / baza de date nu a fost actualizată. Comanda Drush a returnat o eroare.' . "\n");
  }
}

Există o modalitate mai bună de a face modificări ca aceasta, care rulează o singură dată, fără a provoca eșecul scriptului ca cel de mai sus?

drapel cn
Singura opțiune pe care am întâlnit-o în aceste cazuri este să adăugați câmpurile în mod programat în cârligul de actualizare, înainte de a seta datele. Importul de configurare pentru aceste câmpuri va deveni, în esență, un nu-op, dar înseamnă că nu trebuie să vă schimbați implementarea
drapel cn
De altfel, Pantheon pare să ruleze `updb` și `cim` de un număr... interesant de ori. De obicei, le-ai face pe amândouă o singură dată, așa cum face [drush](https://www.drush.org/latest/deploycommand/)
Kevin avatar
drapel in
Acesta este modelat de ceea ce oamenii au sfătuit pentru implementări în trecut - CIM este epuizat, updb este rulat mai întâi înainte de cim, apoi la sfârșit „în cazul în care” sunt necesare alte actualizări. Niciodată nu am găsit nicio actualizare suplimentară în jurul acestui proces, dar până în prezent a fost destul de rezistent la glonț pe Pantheon și Acquia.
drapel cn
Nu sunt sigur că are sens - fie toate actualizările rulează prima dată, fie construirea ar trebui să eșueze. Singura modalitate de a introduce noi actualizări după `updb` este o modificare a codului, moment în care este o nouă implementare și te întorci din nou la primul `updb`. Dar nu despre asta întrebi, așa că voi tace acum
Kevin avatar
drapel in
Este un caz pentru asta, poate? https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_post_update_NAME/9.2.x
drapel cn
Acel cârlig încă rulează ca parte a `updb`, chiar la sfârșit. Fie trebuie să modificați implementarea și să rulați mai întâi cim, fie să păstrați implementarea la fel și să creați mai întâi câmpurile dvs. Nu cred că ar mai exista o altă opțiune logică, deși asta mi se întâmplă destul de des încât aș fi încântat să aud despre o soluție mai ușoară.
sonfd avatar
drapel in
în primul comentariu al lui @clive, am folosit ceva de genul acesta în trecut pentru a importa configurația într-un cârlig de actualizare pentru a face exact acest gen de lucruri: https://www.metaltoad.com/blog/programmatically-importing-drupal- 8-câmp-configurații
Puncte:3
drapel ph

Puteți utiliza drush deploy, care efectuează actualizări în această ordine:

  1. Actualizați cârligele din module.install
  2. cim
  3. cr
  4. Implementați cârlige din module.deploy.php

Deci, convertirea cârligului de actualizare într-un cârlig de implementare înseamnă că va rula după importul de configurare.

drapel cn
Aceasta are aceeași problemă ca codul de implementare original al OP - noua configurație nu va fi importată înainte ca hook-ul de actualizare să încerce să o folosească
Lambic avatar
drapel ph
Mutarea cârligului de actualizare într-un cârlig de implementare înseamnă că rulează după import
drapel cn
Ah, da, nu am primit prima oară. Ar putea fi demn de menționat necesitatea de a adăuga (de exemplu) `passthru('drush deploy:hook', $status);` dacă OP dorește să ruleze propriul script în loc de `drush deploy` direct

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.