Apa alur kerja pembaruan inti berbasis komposer yang benar?

16

Saya ingin menggunakan komposer untuk mengelola dependensi Drupal 8, tapi saya tidak yakin apa alur kerja pembaruan inti yang benar. Saat ini saya menggunakan drush untuk memperbarui inti ke rilis beta terbaru, tetapi saya juga memiliki beberapa dependensi dalam file composer.json saya, jadi setelah pembaruan saya menggunakan komposer untuk menginstal semua dependensi vendor contrib. Tampaknya menjalankan composer installmenimpa beberapa file di direktori inti, walaupun saya baru saja memperbarui inti ke versi terbaru.

Saya juga mencoba mengedit file composer.json secara manual dan mengganti baris "drupal / core" dengan rilis beta spesifik, misalnya "drupal/core": "~8.0-beta14",, tetapi masih menimpa file dalam direktori inti.

Apa alur kerja yang tepat?

rreiss
sumber

Jawaban:

11

Saya kira Anda menggunakan drupal-composer / drupal-project sebagai dasar untuk proyek Anda. Jika tidak, lihat proyek itu, dan bandingkan dengan proyek Anda.

Juga, Anda mengatakan bahwa Anda ingin menggunakan komposer untuk mengelola dependensi Drupal 8, jadi saya berasumsi bahwa Anda telah memilih modul contrib Anda composer require drupal/develdaripada drush dl devel.

Jika Anda melakukan semua hal ini, maka Anda harus menggunakan composer updateuntuk memperbarui inti Drupal dan semua modul contrib Anda. Selama Anda menyimpan composer.lockfile Anda , composer installtidak boleh mengubah versi dependensi Anda. Anda seharusnya tidak menggunakannya drush pm-updatesama sekali. Seharusnya tidak masalah bagi Anda apakah file dalam coredirektori diperbarui atau tidak, karena direktori ini dikelola oleh Komposer. Anda lebih baik tidak melakukan direktori yang dikelola komposer ke repositori Anda, meskipun Anda bisa jika mau.

Tentu saja, Anda harus menjalankan drush updatedbsetiap kali composer updatemengganti inti Drupal atau modul apa pun.

Untuk menghindari mendapatkan versi pengembangan, atur stabilitas minimum Anda menjadi 'beta' di file composer.json Anda menggunakan flag stabilitas Komposer .

Jika Anda menggunakan drupal-composer / drupal-project untuk mengelola situs Anda, maka semua file tingkat root seperti README.txt, .htaccess dan index.html menjadi milik proyek Anda. Itu berarti Anda harus memeriksanya di repositori git Anda; Komposer tidak akan memperbaruinya, Anda harus memperbaruinya sendiri ketika mereka berubah. File-file ini jarang berubah, tetapi drupal-composer / drupal-project memiliki skrip untuk memperbarui file-file ini .

greg_1_anderson
sumber
Mari kita asumsikan bahwa saya menggunakan pembaruan komposer alih-alih pembaruan drush pm, bagaimana cara memperbarui file seperti README.txt, .htaccess, dll.? Dan mengapa pembaruan drush memberikan inti berbeda dari pembaruan komposer? Dan haruskah saya mengganti versi drupal di composer.json saya menjadi 8.0-betaX sebelum setiap pembaruan? Saya tidak ingin menggunakan dev. versi ..
rreiss
Diperbarui jawabannya.
greg_1_anderson
+1 greg_1_anderson - ini terlihat hebat, apakah ini cara definitif untuk melakukan pembaruan keamanan untuk Drupal 8? dengan D7, ini: drupal.stackexchange.com/a/71578
therobyouknow
Sepertinya ini berfungsi jika seseorang awalnya menginstal Drupal 8.1 dengan langkah-langkah ini: drupal.org/node/2471553 (saya menemukan ini berfungsi tanpa kesalahan)
therobyouknow
"Tentu saja, Anda harus menjalankan drush updatedbsetiap kali pembaruan komposer menggantikan inti Drupal atau modul apa pun." - terima kasih dan jika Anda telah menginstal drupal pada awalnya dengan langkah-langkah ini, drupal.org/node/2471553 maka Anda perlu path lengkap ke drupal tertentu dengan Drupal 8 Anda instal (karena mereka dulu menjalankan install sebagai langkah terakhir). Pertama-tama Anda perlu cd ke web dan sekali di / web perintah untuk memperbarui db dengan path lengkap karena itu akan menjadi: ../vendor/drush/drush/drush updatedb(Saya menemukan ini berfungsi).
therobyouknow
2

Berikut ini adalah OK untuk patch rilis 8.4.x> 8.4.y , tapi tidak OK untuk rilis minor 8.4.x> 8.5.x . Lompat ke UPDATE 3 di bawah untuk apa yang saya yakini sebagai "jawaban" untuk pembaruan rilis minor.

1- Cadangkan semua file yang datang dengan Drupal yang telah Anda modifikasi, seperti .htaccess, robots.txt, dll. (Kedua file tersebut adalah yang paling sering diubah).

2- [Saya diberitahu hapus file kunci salah, lihat PEMBARUAN di bawah ini] Hapus file composer.lock (di folder tingkat atas situs Anda). Ini akan dibuat ulang pada langkah 5.

3- Periksa composer.json Anda (di folder tingkat atas situs Anda) dan pastikan bahwa "drupal: core" ada di bagian yang diperlukan dan bukan di bagian ganti, misalnya

"require": {
"drupal/core": "^8.4"
},

tidak

"replace": {
"drupal/core": "^8.4"
},

Jika "drupal / core" ada di bagian ganti, pindahkan ke bagian yang diperlukan dan hapus bagian ganti. Jika ada entri lain di bagian ganti, cukup hapus "drupal / core" bukan seluruh bagian ganti - tapi saya pikir "drupal / inti" biasanya satu-satunya yang ada di sana.

Masukkan versi apa yang ingin Anda perbarui di "drupal / core", contoh:

"drupal / core": "^ 8.5" - akan memperbarui ke versi 8.5 terbaru. "drupal / core": "8.4.6" - akan diperbarui ke versi 8.4.6.

5- Jalankan ini (di folder tingkat atas situs Anda):

composer update drupal/core --with-dependencies

6- Jika tidak ada kesalahan, maka lakukan yang biasa, jalankan pembaruan dan hapus cache:

drush updatedb
drush cr

Atau jika tidak menggunakan drush, buka /update.php untuk menjalankan pembaruan, lalu ke admin / config / development / performance dan tekan tombol "Bersihkan semua cache".

7- Jika Anda telah membuat cadangan file di langkah pertama (.htaccess, robots.txt) masukkan kembali. Tetapi periksa untuk melihat apakah Drupal membuat pembaruan untuk file-file itu dan menambahkan perubahan itu ke Anda.

DIBUAT

Jika ada kesalahan dengan pembaruan komposer di langkah 5, biasanya karena masalah dengan versi barang di folder vendor.

Ini adalah pos yang bagus dalam menangani masalah-masalah seperti: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update dan baca 2 posting Jeff lainnya tentang Drupal dan Komposer untuk mendapatkan lebih banyak pengetahuan tentang itu.

Saya diberitahu oleh 2 orang di Twitter bahwa komposer. Kunci tidak boleh dihapus (Langkah 2 di atas). The composer update drupal/core --with-dependenciesperintah recreates file kunci lagian.

Dalam pengujian metode ini saya menemukan itu berfungsi dengan baik untuk 8.4.3> 8.4.6 (misalnya) tetapi saya mendapatkan kesalahan untuk 8.4.6> 8.5.x. Akan melaporkan kembali ketika saya mengetahuinya.

Contoh kesalahan:

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - drupal/core 8.5.0 requires symfony/yaml ~3.4.5 -> satisfiable by symfony/yaml[3.4.x-dev].
    - Installation request for drupal/core 8.5.0 -> satisfiable by drupal/core[8.5.0].
    - Installation request for symfony/console (locked at v3.2.8, required as ~3.2.8) -> satisfiable by symfony/console[v3.2.8].

Posting ini oleh Jeff Geerling membahas masalah serupa, tetapi sejauh ini tidak berhasil bagi saya: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update

Jadi ... satu-satunya hal yang tampaknya bekerja untuk saya untuk 8.4.x> 8.5.x adalah "opsi nuklir" yang tampaknya banyak orang lain gunakan, yang dijalankan composer update.

Saya kira itu OK asalkan Anda yakin tentang versi modul di composer.json. Mungkin kita harus mengunci mereka ke versi saat ini. Sebagai contoh:

"drupal/address": "1.3"

daripada:

"drupal/address": "^1.3"

Tetapi apakah jawaban yang benar?

OK jawaban yang tampaknya ada di mana-mana adalah melakukan "opsi nuklir":

A. Hapus /vendorfolder.

B. Jalankan composer updatedan cukup perbarui modul Anda bersama dengan inti. Atau, kunci versi modul composer.jsonjika Anda tidak ingin memperbaruinya.

Satu orang di Drupal Slack mengatakan "seluruh filosofi Komposer adalah bahwa Anda harus selalu memperbarui paket, sesering mungkin" . Dikemas termasuk modul saya pikir. Jadi masuk akal kurasa.

Setelah saya dapatkan dari 8.4.6 ke 8.5.0, ini bekerja dengan baik untuk mendapatkan dari 8.5.0 ke 8.5.1 composer update drupal/core --with-dependenciesseperti yang dilakukan untuk 8.4.3 hingga 8.4.6.

Saya mulai menyimpulkan bahwa "jawabannya" adalah menghapus folder vendor dan file composer.lock, kemudian menggunakan composer updatebaik-baik saja, dan orang hanya perlu memastikan nomor versi untuk dependensi dalam file composer.json adalah apa yang Anda inginkan . Bukan masalah besar untuk mengelola versi modul yang ingin Anda pertahankan atau perbarui composer.json.

Sebagai contoh:

"drupal/admin_toolbar": "1.18", berarti tetap dengan 1,18

"drupal/admin_toolbar": "^1.18", berarti maju dan perbarui tetapi dalam 1.x (bukan 2.x)

Ini didukung oleh komentar (Jenderal Redneck) pada posting ini: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update "Salah satu hal yang saya miliki ditemukan ketika saya bekerja dalam dukungan adalah bahwa mengunci versi modul dan inti adalah ide yang baik sehingga Anda BISA thermonuke hal ketika Anda inginkan karena ada kalanya beberapa plugin yang berbeda bahkan tidak ingin berperilaku dengan benar. "

Ngomong-ngomong, file composer.lock tidak membantu composer updatekarena terhapus (berbeda dengan composer installtempat dia mengunci file dibaca):

Menjalankan composer installakan:

  • Periksa apakah composer.lockada
  • Jika tidak, lakukan a composer updateuntuk membuatnya
  • Jika composer.lockada, instal versi yang ditentukan dari file kunci

Menjalankan composer updateakan:

  • Memeriksa composer.json
  • Tentukan versi terbaru untuk menginstal berdasarkan spesifikasi versi Anda
  • Instal versi terbaru
  • Pembaruan composer.lockuntuk mencerminkan versi terbaru yang diinstal

Ref: https://www.engineyard.com/blog/composer-its-all-about-the-lock-file

Saya melihat ini disebutkan di atas: https://github.com/drupal-composer/drupal-project . Saya telah menggunakan itu dan itu baik-baik saja tetapi itu bukan persyaratan untuk menggunakan Komposer dengan Drupal. Ini membingungkan karena itu semacam "terdengar" seperti dari namanya. Ketika saya pertama kali mulai dengan Drupal 8 saya pikir itu diperlukan, jadi buat situs D8 pertama saya dengan itu, berpikir itu adalah praktik terbaik.

Itu "versi" dari Drupal telah dia docroot di folder / web, bukan di folder atas proyek. Juga ada banyak hal yang ditambahkan ke .gitignore dibandingkan dengan Drupal normal:

/drush/contrib/
/vendor/
/web/core/
/web/modules/contrib/
/web/themes/contrib/
/web/profiles/contrib/
/web/libraries/

Jadi, versi Drupal ini benar-benar lebih ditujukan untuk situs yang menggunakan integrasi berkelanjutan untuk melakukan pembangunan Drupal baru pada setiap penyebaran, menggunakan pemasangan komposer. Jika Anda menggunakan metode yang lebih normal, Anda jelas harus mengkomit semua hal di atas ke repositori git Anda atau itu tidak akan disebarkan ke server Anda [1], dan semua itu diperlukan agar Drupal dapat berjalan.

[1] jika git terlibat dengan penyebaran Anda - jika Anda menggunakan SFTP, abaikan ini.

Richard Hood
sumber
composer update drupal/core symfony/config webflo/drupal-core-strict --with-dependenciesbelum pernah gagal saya. Bekerja lebih dari beberapa versi minor, misalnya 8.3 -> 8.6
Clive
1

Menggunakan paket drupal / core pada packagist.org kita sebenarnya dapat mengelola core, modul contrib (, tema dan profil) dan vendor lainnya melalui komposer.

Saya sudah menyiapkan file-file berikut di direktori root saya dan dieksekusi composer install

composer.json

{
  "require": {
    "composer/installers": "^1.0.20",
    "drupal/core": "8.0.*"
  },
  "extra": {
    "installer-paths": {
      "core": ["type:drupal-core"],
      "modules/contrib": ["type:drupal-module"],
      "profiles/contrib": ["type:drupal-profile"],
      "themes/contrib": ["type:drupal-theme"]
    }
  },
  "scripts": {
    "post-install-cmd": [
      "./post_install.sh"
    ]
  }
}

post_install.sh

#!/usr/bin/env bash
export RAW_DRUPAL="https://raw.githubusercontent.com/drupal/drupal/8.0.x"
curl $RAW_DRUPAL/example.gitignore > example.gitignore
curl $RAW_DRUPAL/.gitattributes > .gitattributes
curl $RAW_DRUPAL/.htaccess > .htaccess
curl $RAW_DRUPAL/.csslintrc > .csslintrc
curl $RAW_DRUPAL/.editorconfig > .editorconfig
curl $RAW_DRUPAL/.eslintrc > .eslintrc
curl $RAW_DRUPAL/.eslintignore > .eslintignore
curl $RAW_DRUPAL/index.php > index.php
curl $RAW_DRUPAL/update.php > update.php
curl $RAW_DRUPAL/web.config > web.config
curl $RAW_DRUPAL/autoload.php > autoload.php
curl $RAW_DRUPAL/robots.txt > robots.txt
mkdir -p sites/default
curl $RAW_DRUPAL/sites/example.sites.php > sites/example.sites.php
curl $RAW_DRUPAL/sites/development.services.yml > sites/development.services.yml
curl $RAW_DRUPAL/sites/example.settings.local.php > sites/example.settings.local.php
curl $RAW_DRUPAL/sites/default/default.services.yml > sites/default/default.services.yml
curl $RAW_DRUPAL/sites/default/default.settings.php > sites/default/default.settings.php

Nikmati :)

Eyal
sumber
Saya kira saya akan membutuhkan semua sihir keriting yang telah Anda lakukan. Saya berharap semua file yang dibutuhkan ini akan ditempatkan oleh komposer.
dxvargas
@hiphip File di luar direktori inti tidak sering berubah, jadi di atas bisa menjadi skrip yang Anda lakukan secara manual saat memutakhirkan pembaruan dari satu versi minor ke yang berikutnya (mis. 8.1 hingga 8.2)
Eyal
1

Ya, Anda dapat mengelola inti Drupal dengan komposer. Ada beberapa hal yang perlu diperhatikan.

Anda mungkin akan mendapatkan batas waktu karena sejumlah item yang harus dijalankan oleh komposer, terutama jika Anda menjalankan di VM lokal. Jika Anda menjalankan, composer installAnda kemungkinan akan mendapatkan kesalahan komposer:

 [RuntimeException]                                    
  Could not delete core/.nfs0000000000000000000001:

Pastikan Anda menggunakan wajib

{
  "require": {
   "drupal/core": "8.3.*"

Tambahkan juga ekstensi ke batas waktu dalam konfigurasi

    "installer-paths": {
        "core": ["type:drupal-core"],
        "modules/contrib/{$name}": ["type:drupal-module"],
        "profiles/contrib/{$name}": ["type:drupal-profile"],
        "themes/contrib/{$name}": ["type:drupal-theme"],
        "drush/contrib/{$name}": ["type:drupal-drush"],
        "modules/custom/{$name}": ["type:drupal-custom-module"],
        "themes/custom/{$name}": ["type:drupal-custom-theme"]
    }
},

"config":{
            "process-timeout": 1600
       },

Juga jika itu tidak berhasil, Anda dapat menjalankan pemasangan komposer dari luar SSH di VM Anda .

Ini akan melewati batas waktu pembagian NFS dan membongkar Drupal di tempat yang tepat.

BigEd
sumber
0

"drupal / core": "~ 8.0-beta14" berarti setiap rilis yang lebih besar dari 8.0-beta14 dan kurang dari 9! Anda ingin menghapus tilde untuk menguncinya ke rilis tertentu. Kemudian pastikan untuk memperbarui file kunci Anda dengan menjalankan komposer, dan pada sistem target gunakan instal komposer.

Cara mudah untuk memulai adalah membangun basis kode menggunakan https://github.com/drupal-composer/drupal-project .

Ketika kami perlu memperbarui sesuatu seperti memutakhirkan inti, Anda menjalankan "komposer" secara lokal. Ini akan memperbarui file composer.lock.

Saat pengembang lain mundur, atau dalam skrip penerapan, Anda akan menjalankan "pemasangan komposer", yang menggunakan file kunci.

Garis di composer kami. Json untuk inti Drupal adalah:

"drupal/core": "~8.0",

The tilde () berarti setiap rilis dalam angka 8 (tetapi tidak 9) .

Jika Anda ingin menguncinya ke versi tertentu, Anda tidak harus menggunakan tilde.

"drupal/core": "8.0-beta14",

kemudian jalankan "komposer" secara lokal, komit file composer.json dan composer.lock, dan kemudian jalankan "komposer instal" pada instalasi lain setelah menarik basis kode.

oknate
sumber