Puncte:0

Cum se instalează un modul nou, se adaugă cod la modulul existent care necesită noul modul și se importă configurația pentru noul modul în aceeași versiune

drapel hk

Se pare că mă confrunt cu o problemă de dependență circulară în scenariul în care noua mea versiune are un modul nou (B), cod nou într-un modul existent (A) care depinde de noul modul (B) și noua configurație care este importată pentru modul nou (B).

În trecut, m-am ocupat de asta cu crearea și implementarea a două versiuni independente, una în care implementez noi module și le activez, iar în a doua versiune, implementez cod care necesită module noi și configurația pentru modulele noi.

Există o modalitate mai bună de a gestiona asta?

Modificarea în modulul A este că unul dintre serviciile din modulul A necesită un serviciu din modulul B.

Am adăugat deja dependență la noul modul B în fișierul module_A.info.yml, dar asta nu ajută, deoarece modulul este deja instalat.

drush en module_b nu merge si da eroarea.

Serviciul „module_A_service” are o dependență de un serviciu inexistent „module_B_service”.

Importul de configurare care este în build are core.extensions actualizat pentru a activa module_B atunci când este importat, dar importul de configurare cu drush cim eșuează cu aceeași eroare ca mai sus.

drapel id
Am făcut ce ai făcut tu. Vă puteți gândi, de asemenea, să detectați celălalt modul sau serviciu și să reveniți la un comportament de bază.
drapel cn
Se pare că doriți să adăugați un „hook_update_N” în modulul_A pentru a instala modulul_B
drapel hk
Multumesc pentru raspunsuri @cilefen Dependențele de servicii nu sunt cam grele în modul în care dependențele sunt adăugate în fișierele yml?
drapel hk
Mulțumesc pentru răspuns @Clive - Nu am încercat asta în mod explicit, dar am încercat o evaluare php drush a \Drupal::service('module_installer')->install(['module_b']);. Asta a dat aceeași eroare. S-ar comporta diferit în hook_update. As putea incerca si asta.
Jaypan avatar
drapel de
Eroarea indică faptul că serviciul dvs. A are o dependență care nu există, care nu este o dependență circulară. Care este eroarea dacă implementați totul într-un singur commit, în loc să îl împărțiți în două?
drapel hk
Multumesc pentru raspuns @Jaypan. drush cr eșuează cu eroarea de mai sus. drush cim eșuează și el cu aceeași eroare. drush updb rulează, dar arată aceeași eroare. Nu implementez acest lucru în mai multe versiuni. Am implementat într-o singură versiune. Ceea ce spuneam era că de obicei abordez această problemă cu două versiuni și încercam să îmi dau seama care ar fi o modalitate bună de a rezolva această problemă într-o singură versiune.
Jaypan avatar
drapel de
Dacă aceasta este dintr-o singură implementare, încercați să utilizați Drush pentru a activa modulul B mai întâi, apoi rulați `drush updb`.
drapel hk
drush en module_b a eșuat cu aceeași eroare ca mai sus. Cu toate acestea, am continuat și am adăugat o actualizare de cârlig cu \Drupal::service('module_installer')->install(['module_b']); ca ceea ce a sugerat @Clive. A trecut fără erori și a instalat modulul. Deci soluția este să adăugați o actualizare de cârlig pentru a activa în mod explicit modulul dependent, chiar dacă versiunea are configurația pentru a activa modulul mai târziu.
drapel cn
Cred că `updb` rulează într-un mod diferit de bootstrap, așa că merită încercat dacă poți testa mai întâi (doar tragerea fișierelor DB/publice în jos și rularea locală ar trebui să te permită să faci asta). Sunt destul de sigur că am făcut exact asta înainte pentru a rezolva aceeași problemă. Poate nu faceți un `drush cr` înainte de `updb`, astfel încât sistemul să nu aibă șansa de a reconstrui cache-ul pluginului până când modulul este activat
drapel hk
Mulțumesc @Clive. Asta a făcut smecheria.
Puncte:1
drapel hk

Aceasta este soluția care a funcționat

a) Implementați un hook_update_N în modulul A care este deja instalat.În hook_update_N adăugați cod pentru a instala module_b. Includeți acest lucru în aceeași versiune.

function module_a_update_NNNN(&$sandbox) {
  $module_installer = \Drupal::service('module_installer');
  $module_handler = \Drupal::service('module_handler');
  dacă (!$module_handler->moduleExists('module_b')) {
    $module_installer->install(['module_b']);
  }
}

b) Implementați build-ul

c) Nu ștergeți memoria cache. Dacă rulați cache clear înainte de updb, va genera aceeași eroare ca cea menționată în întrebare.

d) Fugi drush updb

e) Fugi drush cim

f) Fugi drush cr

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.