Magento 2: Cara Menentukan Ketergantungan "Semantic Versioning" di composer.json Module saya

10

Pengembangan dan penerapan Magento 2 mencakup proses formal untuk versi , di mana versi utama dan kecil modul Magento inti akan dibangun berdasarkan perubahan pada fitur yang kompatibel ke belakang.

Bagaimana seharusnya saya, sebagai pengembang modul Magento, membuat daftar persyaratan dalam file composer.json saya sendiri? Apakah saya perlu melihat modul saya secara manual setiap kali saya menggunakan kode inti Magento dan menambahkan require:...baris ke composer.json? Atau ada alat otomatis yang dapat melakukannya untuk saya?

Bagaimana cara menentukan versi untuk dimasukkan ke dalam saya composer.json? Haruskah itu versi modul spesifik yang telah saya kembangkan? Atau haruskah saya melibatkan semacam wildcard? Atau apakah saya perlu mengambil keputusan berdasarkan pengorbanan? Jika demikian, apa pengorbanan yang terlibat untuk setiap gaya menentukan versi?

Ada banyak deskripsi tingkat tinggi dari fitur ini yang beredar di sana - tetapi sangat tidak jelas langkah-langkah praktis apa yang harus diambil oleh pengembang yang bekerja di sini, dan / atau apa konsekuensi sebenarnya dari langkah-langkah tersebut.

Alan Storm
sumber

Jawaban:

9

Apakah saya perlu melihat modul saya secara manual setiap kali saya menggunakan kode inti Magento dan menambahkan baris: ... ke composer.json?

Ya, setiap kali dalam kode Anda, Anda menggunakan apa pun dari modul inti Anda perlu menambahkannya ke komposer Anda butuhkan. Seperti yang Anda inginkan agar urutan pemuatan Anda setelah modul inti, saya juga menyarankan untuk menambahkannya ke module.xmlfile Anda di bagian urutan.

Atau ada alat otomatis yang dapat melakukannya untuk saya?

Saya belum menemukan apa pun. Jika ada tolong beri tahu saya. Ini harus menjadi alat yang cukup canggih dan kemungkinan akan membutuhkan cakupan pengujian yang substansial dan kemudian menjalankan matriks versi yang berbeda untuk menghasilkan perangkat kerja.

Bagaimana cara menentukan versi untuk dimasukkan dalam composer.json saya? Haruskah itu versi modul spesifik yang telah saya kembangkan? Atau haruskah saya melibatkan semacam wildcard? Atau apakah saya perlu mengambil keputusan berdasarkan pengorbanan? Jika demikian, apa pengorbanan yang terlibat untuk setiap gaya menentukan versi?

Opsi untuk menentukan nomor versi

  1. 100.0.2
    Hanya berfungsi saat versi spesifik ini

  2. 100.0.*
    *adalah wildcard dan dapat diganti dengan nomor versi 100.0.0, 100.0.1, ...,100.0.120

  3. ~100.0.2
    Membuat 2 wildcard yang hanya bisa naik jadi 100.0.2, 100.0.3, ...,100.0.120

  4. ^100.0.2
    Memungkinkan setiap rilis sampai 101 sehingga 100.0.2, 100.0.3, ..., 100.1.0,100.2.5

Untuk opsi 2-4 jika pengaturan stabilitas Anda mengizinkannya juga akan menyertakan versi seperti 100.0.1-beta

Penggunaan praktis

Opsi 1.) adalah yang paling berhati-hati, Anda tahu versi mana yang Anda kembangkan dan hanya menerima bekerja dengan versi khusus ini - modul Anda hanya dapat diinstal bersama modul tertentu pada versi itu. Semua upaya pemasangan / peningkatan lainnya akan gagal dengan pesan komposer yang menyoroti bahwa ia tidak dapat menemukan serangkaian komponen yang dapat diinstal.

Opsi 2.) Saya pikir dapat dianggap sebagai non-opsi seperti yang dicakup oleh Opsi 3.) jika Anda suka ~100.0.0

Opsi 3.) Kompatibel selama tidak ada fitur baru yang diperkenalkan

Opsi 4.) Kompatibel selama tidak ada perubahan yang melanggar diperkenalkan

Trade Offs

1 Ekstensi Anda hanya berfungsi untuk 1 versi modul Magento (secara teknis jika tidak ada perubahan dalam modul, nomor versi tidak boleh bertambah dan beberapa versi Proyek Magento secara teoritis dapat mencakup modul inti Magento yang sama dengan versi yang sama. Praktis saya belum melihat ini dan sepertinya memerlukan beberapa proses perubahan pada akhir Magento lihat di sini). Karena Anda sangat terikat dengan 1 versi modul inti Magento, Anda akan mendapatkan banyak rilis dan versi ekstensi Anda sendiri, jika Anda ingin tetap kompatibel.

3-4 Ekstensi Anda berfungsi dengan beberapa versi Magento dan Anda tidak perlu merilis versi ekstensi yang berbeda setiap kali Magento merilis versi baru. Kelemahannya di sini adalah Anda mengklaim kompatibilitas meskipun perubahan dapat dilakukan di Magento yang tidak kompatibel dengan kode Anda sendiri. Risiko ini nyata karena definisi Magento tentang versi semantik untuk rilis modul mereka sendiri hanya mencakup apa yang ditandai dengan @apianotasi (lebih lanjut tentang ini dalam masalah GitHub ini ) dengan cakupan terbatas.

tl; dr;
100.0.2Mainkan dengan aman, banyak rilis yang harus Anda
^100.0.2pelihara untuk Anda Versi Semantic bagaimana seharusnya bekerja, lebih sedikit rilis untuk Anda tetapi dengan risiko lebih tinggi karena saat ini ruang lingkup terbatas dari @apikelas dan metode yang dijelaskan. Jika Anda memiliki ekstensi yang 100% menggunakan kelas dan metode sanksi, ini akan menjadi pilihan yang jelas.

Kristof di Fooman
sumber
Terima kasih, itu luar biasa! Pertanyaan cepat: Apakah benar mengatakan bahwa menentukan versi yang pasti akan cukup menjamin ekstensi Anda akan memblokir peningkatan jika / ketika modul Magento mengubah versinya?
Alan Storm
Diuraikan dengan sangat baik !!!
Membayangkan Ecommerce
1
@AlanStorm ya jika Anda memperbarui komposer (yang juga merupakan apa yang dilakukan Magento's Web Setup Wizard di bawah kap) Anda akan mendapatkan pesan kesalahan komposer - lihat tangkapan layar di tweet ini twitter.com/foomanNZ/status/737289157769302016
Kristof at Fooman
3

Itu bisa seperti 0.1.0-alpha1 -> 0.1.0-alpha2, 0.1.0-alpha3,berdasarkan pada stabilitas modul. Sebagaimana dibagikan dalam dokumentasi, persyaratannya akan seperti: -

"require": {
    "myexamplestore/product-bundle": "2.0.0-RC1",
    "myexamplestore/acme-extension": "~1.0"
    }

Berdasarkan pembaruan Anda, ini harus diperbarui seperti: -

"require": {
    "myexamplestore/product-bundle": "2.4.0-RC1",
    "myexamplestore/acme-extension": "~2.0"
    }

Saya tidak berpikir ada sistem otomatis untuk ini, tetapi sesuai dokumentasi sangat penting untuk mengikuti ini.

Tetapi Anda harus menggunakan PATCH jika ada perbaikan bug kecil di modul Anda.

Mengacu pada

PATCH menunjukkan perbaikan bug yang kompatibel ke belakang

Anda benar, jawabannya agak tidak jelas, tetapi Anda dapat melihatnya diperbarui kembali sekitar 1 tahun. Tapi begitulah adanya.

Bayangkan E-commerce
sumber
Terima kasih telah merespons, namun, ini setara dengan semua informasi yang tidak jelas yang sudah ada. Tidak jelas apa modul Anda vs modul Magento. Tidak jelas apa hasil dari menyesuaikan setiap versi (memblokir pembaruan? Izinkan pembaruan tetapi memperkenalkan risiko @api, dll.).
Alan Storm
Ya saya setuju dengan Anda, satu-satunya alasan yang saya lihat adalah bahwa mereka sangat usang.
Bayangkan Ecommerce