Kontrol Versi untuk Pengembangan Modul


22

Saya bertanya-tanya apakah ada konvensi yang baik, sejauh kontrol versi berjalan, untuk mengembangkan modul yang Anda gunakan baik dalam satu contoh Magento dan juga ingin merilis sebagai modul komunitas.

Awalnya yang saya coba lakukan adalah menggunakan modman untuk mengelola modul di luar repositori instance Magento utama saya. Tapi itu akhirnya bermasalah di berbagai tingkatan. Memiliki repositori tunggal yang dapat Anda instal dengan mudah ke lingkungan yang berbeda atau memutar kembali dalam produksi sangat berguna, dan saya bahkan akan mengatakan telah menjadi bagian penting dari alur kerja saya.

Apa yang saya lakukan saat ini adalah mengembangkannya di dalam repositori situs saya, dan saya berencana untuk memecahnya ke repositori yang terpisah segera. Pada titik itu, apa yang kemungkinan akan saya lakukan adalah:

  • Bangun di lingkungan lokal saya di dalam repositori modul individual menggunakan modman
  • Salin perubahan ke repositori situs ketika saya siap untuk menyebarkan kode

Berharap ada cara yang lebih baik?


apakah Anda mencoba komposer?
FlorinelChis

Saya bermain-main dengannya sedikit pada satu titik tetapi belum menggunakannya dengan serius. Apakah kamu menyukainya?
kalenjordan

ya, Vinai mengadakan presentasi di Magento Meetup baru-baru ini di London tentang komposer. menggunakannya bervariasi dari infrastruktur kasus ke kasus (server web tunggal, server multi-web). Tergantung pada preferensi.
FlorinelChis

Jawaban:


16

Kami memiliki beberapa modul tempat kami melakukan ini dan yang pada dasarnya kami lakukan adalah:

  • Siapkan repo Git untuk modul.
  • Sebarkan modul ini ke basis kode situs produksi dan lakukan semuanya termasuk:
    • tautan lunak yang dibuat oleh modman
    • direktori .modman yang menampung repositori modul kloning
  • Gunakan modman untuk "menyebarkan" ke versi lain dan / atau lingkungan dev untuk dev dan pengujian.

Melakukannya dengan cara ini memberi Anda fleksibilitas yang Anda butuhkan untuk pengembangan modul, versi kode di situs tunggal juga, dan jika Anda membuat perubahan pada modul dalam basis kode situs-tunggal, Anda dapat mengkomit yang langsung kembali ke repositori modul sejak repo ada di direktori .modman.

UPDATE: Ketika saya awalnya menulis ini, saya gagal untuk memperhitungkan dalam jawaban saya bahwa Git tidak mengizinkan (sub) modul untuk berkomitmen ke repositori, dalam hal ini "melakukan segala sesuatu" semacam membutuhkan beberapa elaborasi!

Kebetulan, ini karena saya sudah melakukan ini lebih sering menggunakan modman untuk menyebarkan modul yang ditempatkan di repo Git ke basis kode produksi yang disimpan oleh SVN ... dan Subversion tidak memiliki gangguan mencegahnya melakukan seluruh pohon Git ke VCS.

Jadi begini ...

  1. Jika Anda menggunakan SVN untuk menyimpan kode lokasi produksi, Anda seharusnya tidak memiliki masalah karena Subversion (secara praktis) tidak memiliki konsep sub-modul. Itu tidak masalah.

  2. Jika Anda menggunakan Git untuk kode situs produksi, Anda harus menggunakan sub-modul untuk "melakukan semuanya" ke repositori kode situs. Setelah menggunakan modman untuk mengkloning sesuatu seperti ini:

    modman clone ssh://git@bitbucket.org/<user>/<repo>.git

    Anda juga ingin menambahkannya sebagai sub-modul seperti:

    git submodule add ssh://git@bitbucket.org/<user>/<repo>.git .modman/<repo>

    Setelah Anda melakukan ini, Anda harus dapat menambahkan direktori .modman dan .gitmodules ke dalam indeks dan melakukan itu.

    Setelah mengkloning repositori yang menggunakan modul-modul ini diinstal melalui modman, cukup init submodules dan perbarui:

    git submodule init
    git submodule update

PS Saya sekarang menggunakan Git penuh waktu di semua proyek baru, jadi semoga pengawasan ini tidak terjadi lagi. Maaf kawan ;)


Wow kedengarannya luar biasa. Akan memberikan yang berputar.
kalenjordan

Sudahkah Anda mempertimbangkan Submodules di git?
FlorinelChis

Submodules mengharuskan semuanya berada dalam satu direktori. Modman pada dasarnya menciptakan soft-link untuk semuanya, memungkinkan untuk disebarkan ke seluruh struktur dir.
davidalger

Ketika Anda mengatakan untuk melakukan semuanya termasuk data modman, apakah Anda bermaksud untuk melakukan symlink yang ada dalam struktur direktori proyek? Ketika saya git add -A, inilah yang saya dapatkan: monosnap.com/image/X1EoGyK12UQfYDUqA9hvpUUwq Menggunakan deployperintah modman tampaknya tidak melakukan sesuatu yang berbeda dari cloneperintah - itu hanya menyinkronkan file dalam (meskipun tidak memerlukan VCS untuk bekerja) .
kalenjordan

Itu benar, semuanya termasuk tautan lunak. Seharusnya mencatat ini di atas, tetapi kunci di sini adalah tautan lunak yang relatif sehingga mereka bekerja di env yang berbeda. Modman versi lama tidak mendukungnya. Jika Anda tidak mengkomitnya, Anda harus mengabaikannya, dan harus memastikan Anda memiliki modman untuk digunakan pada envirnomenta lainnya. Secara internal, git menyimpan tautan lunak sebagai file txt dengan jalur yang diperlukan untuk membuat tautan ketika dikloning.
davidalger

7

Tampaknya konvensi saat ini adalah untuk memberikan dukungan untuk:

Sejauh struktur direktori, itu minimal-minimum dan lebih baik modul dipasang di kumpulan kode Komunitas.

Struktur direktori yang disarankan minimum adalah:

.
└── app
    ├── code
       └── community
           └── YourCompany
               └── YourModule
                   ├── Block
                   ├── Model
                      └── Observer.php
                   └── etc
                       └── config.xml
    ├── design
       └── frontend
           └── base
               └── default
                   ├── layout
                      └── module.xml
                   └── template
                       └── yourmodule
    └── etc
        └── modules
            └── YourCompany_YourModule.xml

Opsional / baik untuk dimiliki:

  • Halaman arahan Github dengan deskripsi, beberapa tangkapan layar, dan beberapa fitur berpoin.
  • Tautan ke toko demo yang diinstal juga akan menyenangkan
  • Tinjauan umum screencast / dua menit produk Anda

Sunting: Saya mungkin salah paham.

Menggunakan kombinasi modman / gitignore dapat membuat modul Anda terisolasi dari lingkungan pengujian Anda. Dengan menggunakan struktur folder di atas, Anda hanya dapat secara eksplisit mengizinkan file modul Anda untuk dikomit / diinstal pada repo Anda. Dalam hal ini, jawaban David lebih berlaku. Dukungan Modman untuk dev / deploy tampaknya menjadi konsensus.


Terima kasih, Phil. Ini terlihat seperti beberapa informasi yang baik sejauh praktik terbaik ketika mengembangkan / menerbitkan modul, tapi ya saya lebih mencari informasi di sepanjang baris jawaban David.
kalenjordan

4
Terpilih hanya untuk menggambar ASCII
Ben Lessani - Sonassi

@teamsonassi: Hati-hati, itu mungkin sesederhana menyalin output dari treeperintah :-)
Alex

Saya tidak akan peduli jika dia melakukannya melalui cowsay- Seni ASCII hanya membuat jawaban terlihat bagus: D
Ben Lessani - Sonassi

Diperingatkan, saya menggunakan cowsaydan figlet.... banyak .
philwinkle

5

Bahkan belum mencobanya sendiri, saya akan merekomendasikan menggunakan komposer untuk itu.

Versi termasuk dependensi

Dengan menyimpan composer.lockfile dalam repositori, Anda memperbaiki versi semua modul dan selalu dapat mengembalikan versi tertentu (cabang, tag atau versi yang lebih lama) dengan menggunakan VCS Anda ( git checkout, svn ..) lalu composer.phar install.

Kekurangannya

Masalah yang muncul, adalah bahwa penyebaran Anda dapat dengan mudah bergantung pada banyak sumber (misalnya GitHub) menciptakan banyak titik kegagalan.

Jadi kita akan membutuhkan semacam cache atau proxy yang menyimpan modul-modul itu sehingga kita selalu dapat menggunakan.

Satis tampaknya dapat memenuhi tujuan ini (lihat https://github.com/researchgate/broker ) dan pertanyaan saya /programming//q/16211671/288568


1
terima kasih kepada Artifact (lihat getcomposer.org/doc/05-repository.md#artifact ) yang bergantung pada sumber yang berbeda lebih mudah untuk dikurangi dan dikendalikan. Juga memungkinkan arsitektur plugin komposer untuk men-cache paket-paket sebagai contoh AWS (tidak dapat menemukan tautan ke implementasi sekarang)
Flyingmana

Bukankah seharusnya modul tidak saling bergantung?
user2045

2

Kalen,

Mungkin saya tidak cukup menangkap alur kerja Anda, tetapi sepertinya Anda mengembangkan repo magento secara lokal, lalu memisah menjadi repo modman. Mengapa tidak mengedit saja ./modman/modulesname/CONTENTS dalam IDE Anda dan dorong kode ke repo modul secara independen dalam alur kerja yang sama yang Anda gunakan untuk mengembangkan. Anda dapat menggunakan modman untuk menyebarkan ke produksi, Anda dapat berinteraksi dengan repo individu di folder .modman / modulesname / cli atau dengan menambahkan sumber versi ke IDE Anda, meskipun benar-benar menggunakan .basedir untuk menjaga jalur terkait repositori Anda keluar dari Anda webroot akan bermain lebih baik.

Ada juga fitur modman yang benar-benar bagus yang tampaknya tidak banyak digunakan orang. Script bash menginterpretasikan file .basedir dalam repositori .modman, jika file tersebut tidak ada, modman menerapkan aturan symlink dalam file modman pada tingkat yang sama dengan folder .modman ... jika ada file .basedir, file konten menggambarkan subfolder yang merupakan level teratas dari kode Magento Anda satu turun dari jalur .modman ... dengan kata lain, Anda dapat menjalankan (dan saya lakukan) semua versi dasar Magento dalam folder seperti 'BaseMagento1.9.1.0' 'BaseMagento1.14.2.0' dan modman init folder yang berisi ini. Tambahkan file .basedir ke jalur .modman dan Anda dapat mengubah konten dengan mudah. Ini berfungsi baik untuk pengujian versi.


Terima kasih, hal-hal menarik! Sudah lama sejak saya menggunakan alur kerja ini!
kalenjordan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.