Bagaimana cara saya memigrasi konten blokir dari pengembang ke situs produksi?

24

Saya akhirnya mulai melihat Drupal 8 dengan serius dan saya sangat tertarik dengan manajemen konfigurasi. Saya menemukan sesuatu yang mungkin sedikit bermasalah dan itu menyangkut konten blok khusus.

Saya dapat melihat bahwa sistem manajemen konfigurasi dapat mengekspor konfigurasi blok - wilayah, tema, berat, visibilitas dll. Namun konten blok yang sebenarnya tidak ditemukan dalam ekspor konfigurasi, yang masuk akal dan dapat dimengerti.

Pada mengimpor konfigurasi blok itu ke situs produksi, apa yang tampaknya terjadi adalah konfigurasi blok dibuat dan pesan holding ditempatkan, melaporkan blok rusak atau hilang. Jelas konten blok tidak ada di server produksi.

Bagaimana blok khusus dapat dimigrasikan dari server dev / staging ke server produksi? Saya menyadari bahwa blok di Drupal 8 adalah entitas yang dapat fieldable seperti node dan karenanya perlu dimigrasikan dengan cara yang sama dan saya mengerti ada Migrasi API di Drupal 8 tetapi ini tampaknya dibangun untuk memigrasi konten dari situs Drupal 6 dan 7 ke Drupal 8 berbeda dengan Drupal 8 hingga situs Drupal 8.

Masalah ini khusus mengenai blok khusus karena blok yang dihasilkan oleh modul lain seperti Tampilan jelas akan bermigrasi sebagai konfigurasi.


sumber
Ada beberapa solusi pementasan konten dalam karya-karya termasuk deploy module dan entitypilot.com (penafian, itu produk saya)
larowlan
1
Serupa: Blokir kesalahan pada CMI
kenorb

Jawaban:

7

Jawaban lain yang belum saya lihat disebutkan di sini adalah dengan menggunakan modul Blok Sederhana , yang cukup banyak identik dengan setup 'Blok Kustom' inti, tetapi alih-alih memiliki hibrida konten + konfigurasi yang aneh, Anda memiliki semua pengaturan dan konten Blok disimpan dalam konfigurasi, yang dapat diekspor dan diimpor secara bersih.

Lihat, untuk diskusi lebih lanjut dalam inti Drupal 8: Blok khusus tidak dapat diekspor dan diimpor dengan benar .

geerlingguy
sumber
3

Saya baru saja menerbitkan modul kontribusi yang menyelesaikan ini. Pada dasarnya, modul menyediakan jenis blok berdasarkan konfigurasi (blok tetap) yang membungkus blok khusus (blok konten). Jika blok konten tidak ada, itu dibuat dengan konten default atau kosong jika tidak ada konten default yang ditetapkan. Semuanya dilakukan melalui UI, tidak ada file khusus atau modul khusus yang diperlukan.

Saya menamainya Memperbaiki konten blok dan diterbitkan di:

https://www.drupal.org/project/fixed_block_content

Manuel Adan
sumber
1

Pendekatan lain untuk menjaga konten yang ditambahkan sebagai bagian dari pengembangan juga didorong untuk hidup adalah dengan menggunakan modul Konten Default untuk mengekspor konten. Itu dibangun untuk konten yang akan diekspor ke folder 'konten' profil instalasi, dan kemudian modul, jika diaktifkan, secara otomatis membawa konten ketika situs diinstal, tetapi juga memungkinkan untuk mengimpor konten satu item pada suatu waktu , seperti di hook pembaruan, dengan kode di bawah ini di example.install atau example.profile:

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

Ekspor blok khusus dengan ID 8:

drush dcer block_content 8

(Jika Anda tidak menetapkan jalur profil di pengaturan Drush, Anda harus menentukannya di atas.)

Dan gunakan ekspor yang dihasilkan dalam file example.install Anda seperti ini:

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf

mlncn
sumber
0

Saya tidak yakin saya melihat keuntungan kuat dari sinkronisasi konfigurasi blok di antara beberapa lingkungan karena blok begitu terkait dengan konten.

Alasannya adalah karena ada blok baru yang dibuat dari file yml yang tidak memiliki judul / isi (konten) dan karenanya memberikan pesan 'rusak / hilang'.

Anda dapat mencoba membuat UUID (jika Anda ingin membuat blok di kedua tempat - pastikan nama mesin cocok ...) di tabel block_content pengembangan Anda cocok dengan uuid yang Anda miliki dalam produksi (hubungan lain tampaknya menggunakan entitas id). Kemudian, ketika Anda melakukan sinkronisasi konfigurasi, Anda bisa melihat 'Lihat perbedaan' di file yml dan mungkin melihat apa lagi yang perlu Anda ubah pada dev untuk mendapatkannya agar sesuai dengan uuids produksi, dll. Saya dapat ini berfungsi, tetapi masih mengira lebih mudah untuk mengabaikan semua konfigurasi blok Anda dalam kode kecuali Anda melalui proses ini atau membuat semacam sinkronisasi blok basis data untuk Anda sendiri menggunakan block_content, block_content__body, dan block_content_field_data.

Itu tidak terlalu elegan tetapi bisa memungkinkan Anda untuk menyimpan kode konfigurasi Anda dalam kode. Jika tidak, jika Anda terus menggunakan blok dengan konfigurasi, mereka akan selalu 'rusak atau hilang'.

Posting blog lain menyarankan membuat blok khusus di lingkungan langsung tetapi tidak menempatkannya. Setelah menyinkronkan database ke dev, blok khusus dapat dikonfigurasikan, konfigurasi diekspor dan karena sudah ada dalam impor langsung penempatan dimungkinkan.

ArchbishopLolly
sumber
0

Memiliki masalah yang sama dan tidak benar-benar solusi, hanya tambahan: Dalam pengembangan kolaboratif kami menggunakan staging server yang menarik dari repositori dan mengatur ulang semua konfigurasi. Ini berarti bahwa blok config sedang diatur ulang secara otomatis, Anda tidak dapat menempatkan blok yang Anda anggap sebagai "konten" secara langsung di server itu.

Sangat mudah untuk menggunakan sinkronisasi konfigurasi ekspor drush sambil mengetahui dengan tepat apa yang telah Anda lakukan dan yakin bahwa setiap perubahan konfigurasi dimaksudkan untuk digunakan. Tetapi Drupal memutuskan bagi kita bahwa blok adalah konfigurasi (sementara jelas konten blok ditangani sebagai konten). Jadi ini tampaknya rusak oleh desain.

Untuk waktu yang diberikan saya rasa solusi paling praktis adalah dengan menambahkan file yml terkait blok ke .gitignore.

hexabinaer
sumber
1
Config Ignore kemungkinan lebih baik daripada .gitignore: drupal.org/project/config_ignore
bdanin
0

Saya juga tidak yakin, jika Anda tidak menemukan solusi apa pun, Anda dapat melihat modul ini https://www.drupal.org/project/deploy . Terus terang, saya tidak ingat bisa menggunakan blok dorong dari DEV ke PROD atau tidak.

Ruslan P
sumber
0

Saya pikir cara terbaik untuk menangani ini adalah dengan:

Inilah yang biasanya saya lihat digunakan orang dan saya pribadi gunakan. Tapi itu menyinkronkan seluruh database dibandingkan dengan hanya konten blok.

Jigarius
sumber
Itu bisa bekerja jika tidak ada masalah dengan database yang ditimpa. Sekarang, jika satu-satunya keinginan adalah memindahkan blok khusus baru ke dalam database yang ada, metode ini akan sulit untuk diterapkan.
karolus
Jawaban ini memiliki tempatnya, secara teori. Namun dalam praktiknya, ini bukan solusi yang baik, terutama jika proyek tersebut menggunakan konfigurasi split, atau memiliki konfigurasi yang berbeda antara lingkungan (yang sangat mungkin).
komlenic
0

Silakan mendapatkan modul Structure Sync .

Sinkronisasi struktur menyediakan perintah Drush dan layar antarmuka admin untuk menyinkronkan konten yang juga dapat dianggap konfigurasi. Termasuk item menu, blok khusus dan ketentuan taksonomi.

Tangga:

  1. Buka sinkronisasi struktur.
  2. Buka tab Blokir.
  3. Ekspor.
  4. Konfigurasi dan konten Anda akan diekspor ke folder konfigurasi.
  5. Bawa konfigurasi ke situs lain & Impor.
  6. Buka struktur sinkronisasi & klik impor.
  7. Selesai
Pranay Agarwal
sumber