Mengelola dependensi pustaka modul dengan komposer

9

Saya telah menemukan Dependensi dalam modul khusus dengan drupal-composer , Bagaimana saya bisa memasukkan pustaka pihak ketiga dalam modul khusus saya tanpa menggunakan Composer Manager dan Bagaimana mengelola modul contrib dependensi komposer pada drupal 8 yang dirilis ke pertanyaan saya, tetapi tidak tampaknya lebih lama berlaku sejak Drupal 8.1 dan penghentian manajer Komposer .

Juga panduan populer seperti Pengantar definitif untuk D8 dan Komposer tampaknya tidak berlaku lagi karena mereka juga menyebut manajer komposer.

Solusi lain yang menentang manajer komposer, mengubah file core composer.json terasa seperti terlalu banyak meretas inti dan mungkin akan terputus dengan setiap pembaruan Drush dari inti Drupal (?).

Lebih khusus lagi, saya mencoba memperbarui Views vCards dari Drupal 7 hingga 8. Saya telah membuat file composer.json saya sebagai berikut:

{
  "name": "drupal/views_vcards",
  "description": "Allows creation of vCards using the fields provided by the Views module.",
  "type": "drupal-module",
  "license": "GPL-2.0+",
  "homepage": "https://drupal.org/project/views_vcards",
  "require": {
    "maennchen/zipstream-php": "0.3.*"
  }
}

Tetapi jika saya meletakkan file composer.json di folder modul saya, bagaimana cara membuat Drupal sadar bahwa file itu ada di sana, dan bagaimana cara memastikan zipstream-phpperpustakaan yang diperlukan diunduh?

Cukup menjalankan composer updatedari root Drupal tidak memperbarui banyak dependensi Drupal, tetapi itu tidak termasuk file composer.json yang ada di folder modul. Saya juga tidak menganggap saya harus menelepon composer installdari dalam semua modul dengan dependensi.

Bagaimana cara membuat Drupal menyadari ketergantungan modul tanpa menggunakan manajer komposer dan / atau inti peretasan?

MEMPERBARUI:

The komposer merge Plugin yang digunakan oleh inti muncul untuk memiliki mendukung jalur wildcard:

{
    "require": {
        "wikimedia/composer-merge-plugin": "dev-master"
    },
    "extra": {
        "merge-plugin": {
            "include": [
                "composer.local.json",
                "extensions/*/composer.json" // < ---- THIS LINE
            ],
            "require": [
                "submodule/composer.json"
            ],
            "recurse": true,
            "replace": false,
            "merge-dev": true,
            "merge-extra": false
        }
    }
}

Mengapa inti tidak bergabung modules/*/composer.json, itu akan menyelesaikan segalanya dengan benar?

Pembaruan 2:

Alasan untuk tidak mendukung ini tercakup dalam masalah ini (yang juga telah diam selama beberapa waktu sekarang).

Neograph734
sumber
1
Mengedit file komposer utama adalah cara yang diperbaiki.
Eyal
Jika Anda membiarkan komposer mengelola semua dependensi Anda (termasuk inti) maka masalah Anda akan hilang. Lihat packagist.org/packages/drupal/core
Eyal
Berikut ini contoh file komposer yang saya tulis untuk pertanyaan lain: drupal.stackexchange.com/a/187097/40011
Eyal
Terima kasih atas balasannya @Eyal. Jadi mengelola semua modul contrib melalui composer.jsonfile adalah cara baru yang disarankan dan keringanan untuk mengunduh dan memasang modul sedang diganti? Jelas komposer akan secara otomatis menyelesaikan dependensi bertingkat dan memang juga mengunduh dependensi saya.
Neograph734

Jawaban:

6

Metode baru menggunakan drupal-scaffold untuk fleksibilitas terbesar

Untuk Drupal 8.4.0 dan lebih besar menggunakan drush> 9.0.0 , make drush sudah tidak digunakan lagi dan Anda harus menggunakan alur kerja komposer lengkap seperti yang dijelaskan dalam tautan dokumentasi drupal.org di bawah ini. Tautan tersebut merekomendasikan penggunaan proyek komposer, tetapi ini mungkin tidak berfungsi untuk pengaturan server web semua orang. Berikut ini adalah langkah-demi-langkah cara mengatur composer.json secara manual untuk penjelasan detail. Petunjuk tentang menambahkan modul secara manual masih bisa dilakukan.

# Initialize composer. Stability alpha is important for custom modules that may be source managed outside of packagist or drupal.org
composer init --name myvendor/mysite --stability=alpha --license=GPLv2
composer config repositories.drupal composer https://packages.drupal.org/8
composer config discard-changes true

Maka Anda perlu menambahkan ke composer.json secara manual berikut berdasarkan preferensi Anda karena tidak ada cara untuk melakukannya secara otomatis dengan apa adanya. Ini akan mengkonfigurasi drupal-scaffold untuk menginstal modul Anda di tempat yang Anda inginkan (tidak seperti di vendor / atau direktori yang dipilih oleh beberapa pengembang lain). Ubah 'webroot' menjadi 'www' atau 'publik' atau apa host Anda.

    "extra": {
        "installer-paths": {
            "webroot/core": ["type:drupal-core"],
            "webroot/modules/contrib/{$name}": ["type:drupal-module"],
            "webroot/modules/custom/{$name}": ["type:drupal-custom-module"],
            "webroot/themes/contrib/{$name}": ["type:drupal-theme"],
            "webroot/themes/custom/{$name}": ["type:drupal-custom-theme"],
            "webroot/profiles/{$name}": ["type:drupal-profile"],
            "webroot/libraries/{$name}": ["type:drupal-library"]
        },
        "patches": {}
    },
    "scripts": {
        "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold"
    }

Sekarang Anda dapat menginstal beberapa dependensi. Perhatikan bahwa komposer harus dapat menggunakan skrip dan plugin agar ini berfungsi.

composer require composer/installers:^1.4.0 drupal-composer/drupal-scaffold:^2.3.0 cweagans/composer-patches:^1.6.2

Jalankan skrip drupal-scaffold sekali (atau di server build Anda sesuai kebutuhan):

composer drupal-scaffold

Inti Drupal, modul, tema, dll ... dapat diinstal sesuai instruksi di bawah ini tanpa drupal-merge-plugin.

composer require drupal/core:~8.5.1 drupal/views_vcards

Metode yang lebih lama menggunakan drupal-merge-plugin atau bekerja dengan core secara langsung

Untuk Drupal 8.1.0 dan yang lebih baru, Anda dapat menggunakan komposer untuk meminta modul Drupal secara langsung. Dokumentasi seputar Menggunakan Komposer dalam proyek Drupal dan Menggunakan Komposer untuk menginstal paket Drupal melalui Drupal.org telah diperbarui untuk memanfaatkan paket drupal.org. Saya merasa sudah berfungsi dengan baik dalam skenario penempatan.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require drupal/views_vcards

Untuk pengembangan, saya pikir menambahkan secara manual dalam ketergantungan dengan composer requireberfungsi dengan baik. Pendekatan penggabungan bekerja juga dengan drupal-merge-plugin dan saya menggunakan ini untuk aliran kerja drushal saya.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require mile23/drupal-merge-plugin
composer update

Perbarui 2016.06.22

Saya mengalami masalah menggunakan drush make, yang menambahkan tag versi Drupal tradisional dan URL paket drupal.org menggunakan semver. Untuk itu, saya perlu beralih menggunakan packagist stabler di https://packagist.drupal-composer.org , yang masih mendukung tag versi Drupal tradisional.

Perhatikan juga bahwa server build atau mesin memerlukan jumlah memori terlalu tinggi untuk melakukan pembaruan komposer (atau mengharuskan), yang diperlukan dalam semua skenario di mana menjalankan pembaruan komposer pada mesin pengembangan yang serupa tidak dimungkinkan dalam proses pembuatan Anda.

Perbarui 2016.09.23

Perbarui 2018.03.30

  • Melihat adanya suara. Ini cukup lama sehingga memutuskan untuk mengklarifikasi tentang pengembangan yang lebih baru dan mengatur situs Anda langsung dengan komposer karena pembuatan drush (sayangnya) sudah tidak digunakan lagi untuk sementara waktu.
mradcliffe
sumber
1
Saya masih sangat terbiasa menggunakan drush untuk mengunduh dan memasang modul, tetapi itu akan sepenuhnya diganti dengan komposer?
Neograph734
Begitulah cara drupalci melakukannya sekarang, tetapi sebelum itu, Anda bisa menggunakan plugin gabungan secara langsung. Tambalan yang saya tulis untuk drupalci pada awalnya adalah drupal.org/files/issues/2597778-composer-contrib-18.patch . Ini dilakukan, tetapi sekarang tidak lagi dalam basis kode karena disederhanakan untuk menggunakan pembuat paket dan melakukan segalanya dari komposer iirc. Saya juga melakukan hal berikut dengan TravisCI: cgit.drupalcode.org/xero/tree/.travis.yml#n40 . Itu akan tergantung pada alur kerja Anda.
mradcliffe
Mungkin perlu menambahkan uraian tentang Packet Aset di sini untuk perpustakaan pihak ketiga dengan Komposer. Metodologi ini sedang diadopsi oleh sejumlah distro Drupal dan beberapa modul contrib sekarang juga menggunakannya. Saya baru saja menyumbangkan beberapa dokumentasi untuk meresmikan solusi ini drupal.org/docs/develop/using-composer/… dan drupal.org/docs/develop/using-composer/…
JamesWilson