আমি কীভাবে কোনও মডিউলটির কনফিগারেশন আপডেট করব?


33

আমি ড্রুপাল ৮ এ একটি কাস্টম মডিউল তৈরি করছি It এতে কিছু ওয়াইএএমএল কনফিগারেশন ফাইল রয়েছে।

আমি বিকাশ করার সাথে সাথে আমার কনফিগারটিতে পরিবর্তন এবং যুক্ত করা দরকার, যেমন আমার কাস্টম সত্তায় অন্য ক্ষেত্র যুক্ত করা।

বর্তমানে পরিবর্তনগুলি লক্ষ্য করার জন্য দ্রুপালকে খুঁজে পাওয়ার একমাত্র উপায়টি হল মডিউলটি আনইনস্টল করা এবং এটি পুনরায় ইনস্টল করা।

মডিউল দ্বারা প্রদত্ত কনফিগার ফাইলগুলি সক্রিয় কনফিগার হিসাবে একই, এবং যদি না হয় তবে, সক্রিয় কনফিগার আপডেট করুন কিনা তা পরীক্ষা করার জন্য দ্রুপাল পাওয়ার কোনও উপায় আছে কি? মডিউল আপডেটগুলি কীভাবে পরিচালনা করা হয়? ডি 7-তে hook_update_Nপিএইচপি ব্যবহার করে ক্ষেত্রগুলি যুক্ত করতে ব্যবহৃত হবে, তবে দেখে মনে হচ্ছে এটি ডি 8-র মধ্যে মুখ্যমন্ত্রী দ্বারা পরিচালনা করা উচিত?

মডিউলে yML ফাইলগুলি আপডেট করার পরে যে জিনিসগুলি আমি চেষ্টা করেছি:

  1. drush cr, কনফিগার সিঙ্ক।

  2. ম্যানুয়ালি সমস্ত আপডেট হওয়া কনফিগারেশন ফাইলগুলিতে অনুলিপি করে sites/default/files/config_XXX/staging/- তবে এটি এই ত্রুটিটি দেয় "মঞ্চযুক্ত কনফিগারেশনটি আমদানি করা যায় না, কারণ এটি এই সাইটের চেয়ে আলাদা সাইট থেকে উদ্ভূত You আপনি কেবলমাত্র এই সাইটের ক্লোনযুক্ত দৃষ্টান্তের মধ্যে কনফিগারেশনকে সিঙ্ক্রোনাইজ করতে পারেন।"

  3. ম্যানুয়ালি কনফিগার ম্যানেজার ব্যবহার করে একের পর এক ফাইল আমদানি করা হচ্ছে। এটি কাজ করে, তবে অবশ্যই আরও একটি স্বয়ংক্রিয় উপায় থাকতে হবে।

  4. [সম্পাদনা] পরিবর্তনগুলি পরীক্ষা করার জন্য ম্যানুয়ালি কনফিগার_আপডেট মডিউলটি ব্যবহার করুন এবং মডিউলটির কনফিগারেশনে 'প্রত্যাবর্তন' করুন। আবার, এটি ম্যানুয়াল।

সম্পাদনা: কনফিগারেশন পরিচালনা করা থেকে - করণীয় এবং না করা

কী করা উচিত না

মডিউলের কনফিগার / ইনস্টল ডিরেক্টরিতে ফাইল পরিবর্তন করে আপনার সাইটে সক্রিয় কনফিগারেশনটি পরিবর্তন করার চেষ্টা করুন। এটি কাজ করবে না কারণ মডিউলটি ইনস্টল হওয়ার পরে দ্রুপাল কেবলমাত্র সেই ডিরেক্টরি থেকে পড়বে।

... তবে সেখানে পরিবর্তনগুলি ঘটতে চলেছে , যদি না মডিউলগুলি তাদের প্রথম প্রকাশের জন্য প্রয়োজনীয় কনফিগারেশনের সাথে আবদ্ধ থাকে এবং কখনও কখনও কনফিগার আপডেট বা সংযোজন না করে।

আগাম ধন্যবাদ.


আমি মনে করি এর আগে খুব অনুরূপ কিছু জিজ্ঞাসা করা হয়েছিল (এখন এটি বেশ খুঁজে পাওয়া যায় না), এবং আমি মনে করি উত্তরটি ছিল যে ডিফল্ট কনফিগারেশনটি কেবল ইনস্টল করার সময় পরামর্শ করা হয়, সুতরাং পুনরায় ইনস্টল করার উপায়। যদিও আমাকে উদ্ধৃত করবেন না :)
ক্লাইভ

1
'কে, তবে কীভাবে একটি মডিউল আপডেট হবে? মডিউলগুলি ডাই ;-)-এ আপডেট পাওয়ার অনুমতিপ্রাপ্ত? "দ্রুপাল! বলার জন্য মডিউলগুলির জন্য অবশ্যই একটি উপায় (একটি লা কনফিগারেশন আপডেট) থাকতে হবে, আমার এখন এই অতিরিক্ত কনফিগারেশন প্রয়োজন, একবার দেখুন এবং দয়া করে এটি মার্জ করুন।"
আর্টফুলবোট

কনফিগারেশন আপডেট ম্যানেজার কাজটি করে তবে আমি মনে করি এটির মত একটি নেটিভ উপায় থাকা উচিত it hook_update_Nআমি কিছু অনুমান করেছি তবে আমি কী তা নিশ্চিত নই
ক্লাইভ

2
বাহ, আমি মনে করি উত্তরটি "আপনি পারবেন না" বলে শেষ হতে পারে! কখনই দেখেনি যে আসছে! ফিরে hook_update_Nছোট সাইটগুলির জন্য ড্রুপাল 8- তে দুর্দান্ত নিবন্ধ (এবং অংশ 2 )। ডি 8-তে "সাইটগুলি মডিউল নয়, তাদের কনফিগারেশনটির মালিকানায়"
আর্টফুলবোট

আমি এটি যুক্ত করতে চাই যে এটির জন্য একটি দুর্দান্ত ব্যবহারের ক্ষেত্রটি হ'ল একটি মাল্টিসাইট সেটআপ, যেখানে আপনি কনফিগারেশনের নির্দিষ্ট বড় অংশগুলি ভাগ করতে চান তবে সমস্তটি নয় এবং এটি স্থাপন করুন। এর মধ্যে কাস্টম মডিউলগুলি অন্তর্ভুক্ত থাকতে পারে। একটি একক সাইটের জন্য এটি কেবল একটি কনফিগার রফতানি / আমদানি হবে, একটি মাল্টিসাইট খুব সহজ হবে না।
অ্যাম্বিডেক্স

উত্তর:


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
আমি যখন দ্বিতীয় পদ্ধতির অনুসরণ করছি কনফিগারেশনটি দ্রুপালকে লেখা হয়েছে তবে আমি এটি কনফিগার ডিরেক্টরিতে রফতানি করার পরেও কোনও ইউইউডি পাচ্ছি না। এটি আমাকে এমন একটি সমস্যার দিকে নিয়ে যায় যেখানে আমি কাস্টম ভিউ দিয়ে এটি চেষ্টা করেছি। কনফিগার সত্তার জন্য ইউইডিটি উপলব্ধ না হওয়ার কারণে ভিউ ওভারভিউ পৃষ্ঠাটি আমাকে মারাত্মক ত্রুটি করেছিল।
সেবাস্তিয়ান

9

আমি যেমন এই প্রশ্নটিতে অবতীর্ণ হয়েছিলাম তবে এখানে আমার পরিস্থিতির সঠিক উত্তরটি খুঁজে পাইনি, আমি অন্য উত্তর যুক্ত করতে চাই।

দয়া করে নোট করুন: অ্যান্টি-প্যাটার্ন এগিয়ে!

ব্যবহারের ক্ষেত্রে

যখন আমরা প্রকল্পগুলি বিকাশ করি আমরা ক্রমাগত নতুন পরীক্ষা কনফিগারেশন আপডেট সহ আমাদের পরীক্ষা / গ্রহণযোগ্যতার পরিবেশ আপডেট করি। উদাহরণস্বরূপ একটি সাধারণ কাল্পনিক নিউজ-মডিউল ধরুন, আমরা মডিউলে একটি সামগ্রী-প্রকরণ যুক্ত করতে এবং এটি আমাদের গ্রহণযোগ্যতার পরিবেশে স্থাপন করতে চাই। পর্যালোচনা শেষে, আমরা সিদ্ধান্ত নিয়েছি যে কয়েকটি ক্ষেত্র নিখোঁজ এবং অন্যান্য কনফিগারেশন-সম্পর্কিত স্টাফ রয়েছে। যেহেতু আমরা জানি যে কনফিগারেশনে গ্রহণযোগ্যতার পরিবেশ আপডেট হচ্ছে না তাই আমরা নতুন কার্যকারিতা যুক্ত করার সময় মডিউল থেকে পুরো কনফিগারেশনটি পুনরায় লোড করতে চাই এবং প্রতিটি পরিবর্তিত .ymlফাইল আমদানি করে বিরক্ত হব না ।

যখন আমরা মাল্টিসাইটগুলি বিকাশ করি তখন কেবলমাত্র মডিউলগুলিতে আমাদের কনফিগারেশন প্রয়োজন। একক সাইটের জন্য, আমরা বেশিরভাগই কেবল রফতানি করা সাইট কনফিগারেশন ব্যবহার করি যেখানে পরবর্তী পদক্ষেপটি অপ্রয়োজনীয়।

সম্পূর্ণরূপে কনফিগার কনফিগার করুন (অ্যান্টি-প্যাটার্ন!)

আমরা দেখেছি যে কনফিগার ইনস্টলার পরিষেবাটি ব্যবহার করে আমরা একটি নির্দিষ্ট মডিউল থেকে সম্পূর্ণ কনফিগারটিকে পুনরায় আমদানি করতে সক্ষম।

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

সতর্কতার সাথে ব্যবহার করুন!

আমি যুক্ত করতে চাই যে এটি পরিবেশের মধ্যে পরিবর্তিত কোনও সক্রিয় সামগ্রীতে ওভাররাইট করবে। সুতরাং, কেবলমাত্র এই সমাধানটি ব্যবহার করুন যখন আপনি নিশ্চিত হন যে এটি সক্রিয় কনফিগারটিকে ওভাররাইট করা নিরাপদ। আমরা এটিকে কখনই উত্পাদন পরিবেশে ব্যবহার করব না এবং কেবল প্রাথমিক বিকাশে প্রয়োগ করব।

প্রথমে @ jhedstrom এর সমাধানটি বিবেচনা শুরু করার আগে চেষ্টা করে দেখুন।


9

আমি এই গিস্টটি গিটহাবটিতে পেয়েছি , যা ড্রাশ ব্যবহার করে প্রদত্ত মডিউলটির কনফিগারেশনটিকে পুনরায় / লোড করে:

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

2

আমার মন্তব্যের ভিত্তিতে: আমি একটি মডিউলটির কনফিগারেশন কীভাবে আপডেট করব?

যখন আমি দ্বিতীয় পদ্ধতির অনুসরণ করছি কনফিগারেশনটি দ্রুপালকে লেখা হয়েছে তবে আমি যখন এটি কনফিগার ডিরেক্টরিতে রফতানি করি তখনও কোনও ইউইউডি পাচ্ছি না। এটি আমাকে এমন একটি সমস্যার দিকে নিয়ে যায় যেখানে আমি কাস্টম ভিউ দিয়ে এটি চেষ্টা করেছি। কনফিগার সত্তার জন্য ইউইডিটি উপলব্ধ না হওয়ার কারণে ভিউ ওভারভিউ পৃষ্ঠাটি আমাকে মারাত্মক ত্রুটি করেছিল।

আমি একটি সামান্য ফাংশন তৈরি করেছি যা আমাকে এতে সহায়তা করে, এখানে আমার উদাহরণ কোডটি:

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

উপরের উত্তরটি (সম্পূর্ণ পুনরায় আমদানি) আমার ব্যবহারের ক্ষেত্রেও কাজ করেছে, তবে প্রথমে আমি আরও বেছে বেছে পুনরায় আমদানি করার সময় কিছুটা ব্যয় করেছি। আপডেট কোড হিসাবে আমার মনে হয়েছে যে কোডটি কনফিগারেশন মডিউলটির কোডের উপর ভিত্তি করে ছিল:

/**
 * 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 মডিউলগুলির এই মডিউল স্যুটটি কেবলমাত্র এই মামলার জন্য কিছুটা ওভারকিল বলে মনে হচ্ছে (এর উদ্দেশ্যটি মূলত কাস্টমাইজেশনগুলি ওভাররাইট না করেই সুরক্ষিতভাবে আপডেটগুলিতে মার্জ করা) তবে এর ধারণার কারণে এটি মডিউল / ইনস্টল থেকে কনফিগারেশন পরিবর্তনগুলি ট্র্যাক এবং আমদানিও করতে দেয় allows / alচ্ছিক ফোল্ডারগুলি দ্রুত।

মূলত, আপনি নিম্নলিখিত হিসাবে এটি পরীক্ষা করতে পারেন:

  • আপনার স্থানীয় পরিবেশে আপনার নিজস্ব কাস্টম মডিউলটি কিছুটা "ডিফল্ট" কনফিগারেশন আইটেম (গুলি) হিসাবে যথারীতি / কনফিগার / ফোল্ডারে রাখে সক্ষম করুন
  • config_sync মডিউল এবং এর সমস্ত নির্ভরশীল মডিউলগুলি ইনস্টল এবং সক্ষম করুন
  • / কনফিগার / ইনস্টল ফোল্ডারের অভ্যন্তরে আপনার মডিউলটির কনফিগার আইটেমটিতে কিছু সম্পাদনা করুন
  • অ্যাক্সেস / প্রশাসক / কনফিগারেশন / উন্নয়ন / কনফিগারেশন / ডিস্ট্রো। আপনার পরিবর্তনটি দেখতে হবে এবং এটিকে সক্রিয় কনফিগারেশনে আমদানির বিকল্প থাকতে হবে (মার্জ মোডটি ক্লায়েন্টের পরিবর্তনগুলি সংরক্ষণের উদ্দেশ্যে করা হয়েছে, রিসেট মোডটি আমদানি করতে বাধ্য করে) - বিকাশের সময় আমি বেশিরভাগই রিসেট মোড ব্যবহার করব, তবে আপনি যদি না মার্জ মোডটি পাশাপাশি কাজ করেন তবে আপনি সমান্তরালভাবে একই কনফিগারেশনে কোনও ম্যানুয়াল পরিবর্তন করেছে

নোট: আপনি শুধুমাত্র এই স্যুট ইনস্টল করা আছে (এবং আপনি ক্লায়েন্ট আপডেট দিয়ে মার্জ যত্ন সম্পর্কে না) মডিউল উন্নয়ন সময় কনফিগ আমদানি ত্বরান্বিত config_sync ব্যবহার করতে চান, এটা যথেষ্ট এবং শুধুমাত্র আপনার স্থানীয় (উন্নয়ন) পরিবেশ সক্রিয় ( আপনার মডিউলটি চূড়ান্ত করার পরে উচ্চতর পরিবেশে যাবে এবং ধরে নিবেন আপনি ডি 8 কোর কনফিগারেশন ম্যানেজমেন্টটি এর কনফিগারেশনটি উচ্চতর পরিবেশে পোস্ট করার জন্য ব্যবহার করবেন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.