मैं किसी मॉड्यूल के कॉन्फ़िगरेशन को कैसे अपडेट करूं?


33

मैं Drupal 8 में एक कस्टम मॉड्यूल बना रहा हूं। इसमें कुछ YAML कॉन्फिग फाइल्स शामिल हैं।

जैसा कि मैं विकसित करता हूं मुझे अपने कस्टम इकाई पर किसी अन्य फ़ील्ड को जोड़ने के लिए कॉन्फ़िगर करने और जोड़ने की आवश्यकता है, जैसे।

वर्तमान में मैंने पाया है कि ड्रुपल को बदलावों को नोटिस करने के लिए मॉड्यूल को अनइंस्टॉल करने और इसे फिर से स्थापित करने का एकमात्र तरीका है।

क्या ड्रुपल प्राप्त करने का एक तरीका है यह जांचने के लिए कि मॉड्यूल द्वारा प्रदान की गई कॉन्फिग फाइल्स सक्रिय कॉन्फिगर के समान है, और यदि नहीं, तो ऐक्टिव कॉन्टैक्ट को अपडेट करें? मॉड्यूल अपडेट कैसे संभाले जाते हैं? D7 में hook_update_NPHP का उपयोग करके फ़ील्ड को जोड़ने के लिए उपयोग किया जाएगा, लेकिन ऐसा लगता है कि इसे D8 में CM द्वारा नियंत्रित किया जाना चाहिए?

मॉड्यूल में yml फ़ाइलों को अपडेट करने के बाद मैंने जो चीज़ें आज़माई हैं:

  1. drush cr, विन्यास सिंक।

  2. मैन्युअल रूप से सभी अद्यतित कॉन्फ़िगर फ़ाइलों को कॉपी करना sites/default/files/config_XXX/staging/- लेकिन यह इस त्रुटि को देता है "मंचन कॉन्फ़िगरेशन को आयात नहीं किया जा सकता है, क्योंकि यह इस साइट की तुलना में एक अलग साइट से उत्पन्न होता है। आप केवल इस साइट के क्लोन इंस्टेंस के बीच कॉन्फ़िगरेशन को सिंक्रनाइज़ कर सकते हैं।"

  3. मैन्युअल रूप से फ़ाइलों को एक-एक करके कॉन्फ़िगर प्रबंधक का उपयोग करके आयात करना। यह काम करता है, लेकिन जाहिर है कि अधिक स्वचालित तरीका होना चाहिए।

  4. [संपादित करें] मैन्युअल रूप से बदलावों का निरीक्षण करने के लिए config_update मॉड्यूल का उपयोग करें और मॉड्यूल के कॉन्फिगर को 'रिवर्ट' करें। फिर, यह मैनुअल है।

संपादित करें: से विन्यास प्रबंध - की और don'ts कर

DON'TS

मॉड्यूल के कॉन्फ़िगरेशन / इंस्टॉल निर्देशिका में फ़ाइलों को बदलकर अपनी साइट पर सक्रिय कॉन्फ़िगरेशन को बदलने का प्रयास करें। यह काम नहीं करेगा क्योंकि Drupal केवल उस निर्देशिका से पढ़ेगा जब मॉड्यूल स्थापित है।

... लेकिन वहाँ में परिवर्तन कर रहे हैं जा रहा हो, जब तक मॉड्यूल जो कुछ विन्यास वे में उनके पहले कभी जारी की जरूरत के लिए बाध्य कर रहे हैं, और कभी अपडेट करने या config जोड़ने कभी नहीं हो सकता है।

अग्रिम में धन्यवाद।


मुझे लगता है कि कुछ इसी तरह से पहले पूछा गया था (अब यह नहीं मिल सकता है), और मुझे लगता है कि उत्तर यह था कि डिफ़ॉल्ट कॉन्फ़िगरेशन को केवल इंस्टॉल समय पर सलाह दी जाती है, इसलिए फिर से स्थापित करने का तरीका है। मुझे हालांकि बोली मत करो :)
क्लाइव

1
'k, लेकिन एक मॉड्यूल कैसे अपडेट होगा? मॉड्यूल को D8, सही ;-) में अपडेट प्राप्त करने की अनुमति है? मॉड्यूल के लिए "ड्रुपल" कहने के लिए एक तरीका (एक la config_update) होना चाहिए! मुझे अब इस अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता है, एक बार देख लें और कृपया इसे मर्ज कर दें।
Artfulrobot

कॉन्फ़िगरेशन अपडेट मैनेजर काम करता है, लेकिन मैं मानता हूं कि ऐसा लगता है कि ऐसा करने के लिए एक देशी तरीका होना चाहिए। में कुछ hook_update_Nमुझे लगता है, लेकिन मुझे यकीन है कि क्या नहीं कर रहा हूँ
क्लाइव

2
वाह, मुझे लगता है कि जवाब "आप नहीं कर सकते हैं" समाप्त हो सकता है! कभी नहीं देखा कि आ रहा है! पर वापस hook_update_Nछोटी साइटों (और भाग 2 ) के लिए Drupal 8 पर उत्कृष्ट लेख । D8 में "अपने स्वयं के विन्यास साइटों, मॉड्यूल नहीं"
Artfulrobot

मैं यह जोड़ना चाहता हूं कि इसके लिए एक उत्कृष्ट उपयोग-मामला एक मल्टीसाइट सेटअप है, जहां आप विशिष्ट बड़े टुकड़ों को कॉन्फ़िगर करना चाहते हैं, लेकिन यह सब नहीं और इसे तैनात करना चाहते हैं। इनमें कस्टम मॉड्यूल शामिल हो सकते हैं। किसी एक साइट के लिए यह बस एक विन्यास निर्यात / आयात होगा, एक मल्टीसाइट वह सरल नहीं होगा।
अंबिडेक्स

जवाबों:


24

जैसा कि मूल प्रश्न और अनुवर्ती टिप्पणियों में उल्लेख किया गया है, इसे पूरा करने के लिए विभिन्न प्रकार के कंट्राब मॉड्यूल और मैनुअल तरीके हैं।

यह स्वचालित रूप से करने के लिए, या एक कस्टम फैशन में, मुझे लगता hook_update_N()है कि अभी भी शायद सबसे व्यवहार्य विकल्प है।

उदाहरण के लिए, यह सेट करने के लिए अपडेट करने के लिए हेड 2 हेड से एक उदाहरण है :system.sitedefault_langcode

  $config_factory = \Drupal::configFactory();
  $langcode = $config_factory->get('system.site')->get('langcode');
  $config_factory->getEditable('system.site')->set('default_langcode', $langcode)->save();

आप कॉन्‍फ़िगर में भी पढ़ सकते हैं (केवल नए कॉन्‍फ़िगर जोड़ने के लिए अनुशंसित है, न कि आवश्‍यक रूप से अपडेट किए गए या ओवरराइडिंग कॉन्‍फ़िगरेशन को अनुकूलित किया जा सकता है):

  $source = new FileStorage($path);
  /** @var \Drupal\Core\Config\StorageInterface $active_storage */
  $active_storage = \Drupal::service('config.storage');
  $active_storage->write($name, $source->read($name));

फ़ाइल के $pathलिए पूर्ण पथ कहाँ है my_config.foo.yml


1
जब मैं दूसरे दृष्टिकोण का अनुसरण कर रहा हूं तो विन्यास Drupal को लिखा जाता है, लेकिन जब मैं इसे कॉन्फ़िगर निर्देशिका में निर्यात करता हूं तब भी UUID नहीं मिल रहा है। यह मुझे एक समस्या में ले जाता है जहां मैंने एक कस्टम दृश्य के साथ यह कोशिश की। दृश्य अवलोकन पृष्ठ ने मुझे एक घातक त्रुटि लौटा दी क्योंकि विन्यास इकाई के लिए uuid उपलब्ध नहीं था।
सेबस्टियन

9

जैसा कि मैं इस सवाल पर उतरा, लेकिन वास्तव में यहां मेरी स्थिति के लिए सही उत्तर नहीं मिला, मैं एक और उत्तर जोड़ना चाहूंगा।

कृपया ध्यान दें: पैटर्न के आगे!

उदाहरण

जब हम परियोजनाएं विकसित कर रहे होते हैं तो हम लगातार नए कॉन्फ़िगरेशन अपडेट के साथ अपने परीक्षण / स्वीकृति वातावरण को अपडेट करते हैं। उदाहरण के लिए एक साधारण काल्पनिक समाचार-मॉड्यूल लें, हम मॉड्यूल में एक सामग्री-प्रकार जोड़ना चाहते हैं और इसे हमारे स्वीकृति परिवेश में वितरित करना चाहते हैं। समीक्षा के बाद, हमने निष्कर्ष निकाला है कि कुछ क्षेत्र गायब हैं और अन्य विन्यास से संबंधित सामान हैं। चूँकि हम जानते हैं कि स्वीकृति पर्यावरण को विन्यास में अद्यतन नहीं किया जा रहा है, हम वास्तव में केवल पूर्ण कार्यक्षमता को मॉड्यूल से पुनः लोड करना चाहते हैं, जबकि नई कार्यक्षमता को जोड़ा गया है और हर परिवर्तित .ymlफ़ाइल को आयात करके परेशान नहीं किया जाना चाहिए ।

जब हम मल्टीसाइट्स विकसित कर रहे होते हैं, तब हमें केवल मॉड्यूल में हमारे कॉन्फिगर की आवश्यकता होती है। एकल साइटों के लिए, हम ज्यादातर निर्यातित साइट कॉन्फिगरेशन का उपयोग करते हैं, जिसमें अगला चरण अनावश्यक होता है।

Reimport config पूरी तरह से (एंटी-पैटर्न!)

हमने पाया कि कॉन्फ़िगइन्स्टालर सेवा का उपयोग करते हुए , हम एक विशिष्ट मॉड्यूल से फिर से पूर्ण कॉन्फ़िगरेशन को फिर से प्राप्त करने में सक्षम हैं।

// Implement in a update_N hook. 
\Drupal::service('config.installer')->installDefaultConfig('module', $module);

सावधानी से प्रयोग करें!

मैं यह जोड़ना चाहता हूं कि इससे पर्यावरण के भीतर किसी भी सक्रिय सामग्री को बदल दिया जाएगा। इसलिए, केवल इस समाधान का उपयोग तब करें जब आप सुनिश्चित हों कि सक्रिय कॉन्फ़िगरेशन को अधिलेखित करना सुरक्षित है। हम इसका उपयोग उत्पादन परिवेश में कभी नहीं करेंगे और केवल शुरुआती विकास में ही लागू करेंगे।

इससे पहले कि आप इस पर विचार करना शुरू करें, पहले @ jhedstrom के समाधान का प्रयास करें।


9

मैंने GitHub पर यह Gist पाया है, जो कि ड्रश का उपयोग करके दिए गए मॉड्यूल के कॉन्फ़िगरेशन को पुनः लोड / पुनः लोड करता है:

drush cim -y --partial --source=modules/path/to/module/config/install/

2

मेरी टिप्पणी के आधार पर: मैं किसी मॉड्यूल के कॉन्फ़िगरेशन को कैसे अपडेट करूं?

जब मैं दूसरे दृष्टिकोण का अनुसरण कर रहा हूं तो विन्यास Drupal को लिखा जाता है, लेकिन जब मैं इसे कॉन्फ़िगर निर्देशिका में निर्यात करता हूं तब भी UUID नहीं मिल रहा है। यह मुझे एक समस्या में ले जाता है जहां मैंने एक कस्टम दृश्य के साथ यह कोशिश की। दृश्य अवलोकन पृष्ठ ने मुझे एक घातक त्रुटि लौटा दी क्योंकि विन्यास इकाई के लिए uuid उपलब्ध नहीं था।

मैंने एक छोटा सा फंक्शन बनाया है जो मेरी मदद करता है, यहाँ मेरा उदाहरण कोड है:

function _example_views_update_config($configsNames) {
  $config_path    = drupal_get_path('module', 'example') . '/config/install';
  $source         = new FileStorage($config_path);
  $config_storage = \Drupal::service('config.storage');
  $config_factory = \Drupal::configFactory();
  $uuid_service = \Drupal::service('uuid');

  foreach ($configsNames as $name) {
    $config_storage->write($name, $source->read($name));
    $config_factory->getEditable($name)->set('uuid', $uuid_service->generate())->save();
  }
}

/**
 * Add new action configurations.
 */
function example_update_8003() {
  $configsNames = [
    'config-1',
    'config-2',
  ];

  _example_views_update_config($configsNames);
  return 'Added new configurations.';
}

1

ऊपर दिए गए उत्तर (पूर्ण पुन: आयात) ने मेरे उपयोग के मामले में भी काम किया, लेकिन पहले मैंने एक अधिक चयनात्मक पुन: आयात को देखते हुए थोड़ा खर्च किया। यहां वह कोड है जो मुझे अपडेट हुक के रूप में काम करने के लिए लग रहा था और config_update मॉड्यूल में कोड पर आधारित था:

/**
 * Update all my config.
 *
 * This can be more selective than calling installDefaultConfig().
 */
function MYMODULE_update_8004() {
  $prefixes = [
    'field.storage.node',
    'field.field.node',
    'node.type',
    'core.base_field_override.node',
    'core.entity_view_display'
  ];
  $results = [];
  foreach ($prefixes as $prefix) {
    $results[$prefix] = _update_or_install_config($prefix);
  }
  $return = '';
  foreach ($results as $prefix => $result) {
    $return .= "\n$prefix:\n";
    foreach ($result as $key => $ids) {
      $return .= "$key: " . implode(', ', $ids) . "\n";
    }
  }
  if (function_exists('drush_log')) {
    drush_log($return, \Psr\Log\LogLevel::WARNING);
  }
  return $return;
}


/**
 * Update or install config entities from config/install files.
 *
 * @see \Drupal\config_update\ConfigReverter::import
 * @see \Drupal\config_update\ConfigReverter::revert
 *
 * @param string $prefix
 *   The prefix for YAML files in find, like 'field.storage.node'
 */
function _update_or_install_config($prefix) {
  $updated = [];
  $created = [];
  /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manger */
  $config_manger = \Drupal::service('config.manager');
  $files = glob(__DIR__ . '/config/install/' . $prefix . '.*.yml');
  foreach ($files as $file) {
    $raw = file_get_contents($file);
    $value = \Drupal\Component\Serialization\Yaml::decode($raw);
    if (!is_array($value)) {
      throw new \RuntimeException(sprintf('Invalid YAML file %s'), $file);
    }
    // Lazy hack here since that code ignores the file extension.
    $type = $config_manger->getEntityTypeIdByName(basename($file));
    $entity_manager = $config_manger->getEntityManager();
    $definition = $entity_manager->getDefinition($type);
    $id_key = $definition->getKey('id');
    $id = $value[$id_key];
    /** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $entity_storage */
    $entity_storage = $entity_manager->getStorage($type);
    $entity = $entity_storage->load($id);
    if ($entity) {
      $entity = $entity_storage->updateFromStorageRecord($entity, $value);
      $entity->save();
      $updated[] = $id;
    }
    else {
      $entity = $entity_storage->createFromStorageRecord($value);
      $entity->save();
      $created[] = $id;
    }
  }
  return [
    'updated' => $updated,
    'created' => $created,
  ];
}

1

कॉन्फ़िगरेशन सिंक्रोनाइज़र मॉड्यूल इस समस्या को अच्छे तरीके से हल करने में मदद करता है। 7 मॉड्यूल का यह मॉड्यूल सूट बस इस मामले के लिए थोड़ा अधिक लगता है (इसका उद्देश्य मुख्य रूप से ओवरराइटिंग अनुकूलन के बिना अपडेट में सुरक्षित रूप से विलय करना है), लेकिन इसकी अवधारणा के कारण यह मॉड्यूल के इंस्टॉलेशन से कॉन्फ़िगरेशन परिवर्तनों को ट्रैक और आयात करने की अनुमति देता है। / वैकल्पिक फ़ोल्डर जल्दी।

मूल रूप से, आप इसका परीक्षण निम्न प्रकार से कर सकते हैं:

  • सामान्य रूप से / इनफ़िगर / इनस्टॉल / फोल्डर में रखे कुछ "डिफ़ॉल्ट" कॉन्फ़िगरेशन आइटम (ओं) के साथ अपने स्थानीय परिवेश पर अपने कस्टम मॉड्यूल को बनाएं और सक्षम करें
  • config_sync मॉड्यूल और उसके सभी आश्रित मॉड्यूल को स्थापित और सक्षम करें
  • / मॉड्यूल / स्थापित फ़ोल्डर के अंदर अपने मॉड्यूल के विन्यास मद में कुछ संपादन करते हैं
  • पहुंच / व्यवस्थापक / कॉन्फ़िगरेशन / विकास / कॉन्फ़िगरेशन / डिस्ट्रो। आपको अपना परिवर्तन देखना चाहिए और इसे सक्रिय कॉन्फ़िगरेशन में आयात करने का विकल्प होना चाहिए (मर्ज मोड का उद्देश्य क्लाइंट परिवर्तनों को संरक्षित करना है, रीसेट मोड को आयात करता है) - विकास के दौरान मैं ज्यादातर रीसेट मोड का उपयोग करूंगा, लेकिन मर्ज मोड को तब तक काम करना चाहिए जब तक आप नहीं करते। समानांतर में समान विन्यास में कोई भी मैनुअल परिवर्तन नहीं किया

ध्यान दें: यदि आप केवल मॉड्यूल के विकास के दौरान config आयात में तेजी लाने के लिए config_sync का उपयोग करना चाहते हैं (और आप क्लाइंट अपडेट के साथ विलय के बारे में परवाह नहीं करते हैं), तो यह सूट आपके स्थानीय (विकास) वातावरण पर ही स्थापित और सक्षम होना पर्याप्त है ( अपने मॉड्यूल को अंतिम रूप देने के बाद उच्च वातावरण में चला जाएगा और आप उच्च वातावरण में इसके विन्यास को पोस्ट करने के लिए D8 कोर कॉन्फ़िगरेशन प्रबंधन का उपयोग करते हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.