Apa struktur yang disukai dari proyek Magento 2 di bawah VCS?

15

Ketika saya memulai proyek M2 baru, hal pertama yang akan saya lakukan adalah menginstal inti melalui komposer:

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition

Sekarang saya dapat menulis modul dan tema khusus saya di bawah app/code. Saya kemudian akan menambahkan folder saya composer.*dan seluruh app/codeke VCS saya. Sejauh ini semuanya baik-baik saja.

Misalkan sekarang saya ingin menggunakan beberapa alat membangun untuk proyek saya, katakanlah Grunt atau Gulp.

  1. Jika saya mengkomit saya sendiri Gruntfile.js, ini akan ditimpa oleh magento/magento2-basepaket ketika saya menjalankan composer installsetelah saya mengkloning repo.

  2. Jika saya mengkomit gulpfile.js, saya tidak bisa mendefinisikan dependensi saya dalam package.json, karena itu juga akan ditimpa oleh magento/magento2-base.

  3. Jika saya memutuskan untuk menggunakan pengaturan Grunt Magento dan ingin menyesuaikannya dengan mengedit file di bawah /dev/tools/grunt(misalnya themes.js), saya tidak bisa karena perubahan saya akan ditimpa oleh magento/magento2-base.

Pemahaman saya adalah Anda tidak bisa berbuat banyak dalam root dokumen Anda. Tentu saja ada banyak solusi untuk masalah ini:

  • Saya bisa menjalankan git checkout -hak setelah instalasi untuk mengatur ulang file saya sendiri
  • Saya bisa menyimpan file build saya di folder khusus, /buildmisalnya
  • Saya bisa menggunakan alat bangunan yang berbeda, seperti Phing, Ant, atau Rake (pengembang frontend saya tidak akan begitu senang)
  • Saya bisa mengganti magento/magento2-basedengan paket khusus yang memiliki pemetaan khusus untuk file inti (tidak benar-benar optimal tapi hei, itu pilihan)

Saya pribadi tidak menyukai semua opsi ini, jadi saya ingin tahu apakah ada cara yang disukai atau lebih baik untuk mencapai apa yang saya coba lakukan.

Adakah yang mengalami masalah yang sama? Bagaimana Anda mengatasinya? Bagaimana Anda menyusun proyek Anda di bawah VCS?

MEMPERBARUI

Poin tambahan terkait dengan pengaturan proyek. Dalam percobaan saya, saya perhatikan bahwa pemasang komposer Magento memiliki bendera untuk penimpaan file:

"extra": {
    "magento-force": "override"
}

Ini diperlakukan secara internal sebagai boolean jika saya tidak salah, jadi saya mencoba mengaturnya falseuntuk melewati pengesampingan. Ketika saya menjalankan composer installinstalasi saya gagal karena file sudah ada. Pada dasarnya, jika saya tidak membiarkan Magento menimpa file saya, saya tidak dapat menginstalnya.

Apa tujuan dari bendera ini? Apakah hanya mengira melakukan cek untuk saya? Bagi saya tidak masuk akal untuk jujur, tapi mungkin seseorang bisa menjelaskan masalah ini.

fmrng
sumber
Saya ingin tahu apa yang orang lain posting sebagai jawaban. Idealnya, saya pikir kami ingin menjaga Magento Core keluar dari repo utama kami dan tetap terbatas hanya pada template yang kami buat dan setiap plugin kustom yang kami tambahkan atau kanan. Kemudian pada waktu membangun, kami mereferensikan inti + repo proyek kami dan membangun artefak aplikasi dari repositori. Ini adalah metode yang saya gunakan untuk M1 baru-baru ini dan saya bertanya-tanya apakah rekomendasi resmi dari Magento adalah untuk melakukan sesuatu yang mirip dengan M2 sekarang Komposer didukung sepenuhnya.
Bryan 'BJ' Hoffpauir Jr
Dalam versi M2 yang lebih baru, masalah Gruntfile.js, gulpfile.jsdan package.jsondiselesaikan. Masalah yang dibahas dalam pertanyaan ini masih berlaku untuk versi Magento 2 yang lebih baru ketika Anda perlu mengubah themes.js, index.phpatau .htaccessmisalnya.
7ochem

Jawaban:

4

Jangka pendek, kami mencari untuk memisahkan file yang perlu kustomisasi. Misalnya jika orang perlu memodifikasi index.php, cari tahu cara memisahkan file standar yang dikirimkan Magento dari kebutuhan kustomisasi lokal. Setelah tercapai, dimungkinkan untuk memiliki "satu .gitignore sejati untuk semua proyek yang dapat digunakan". Yaitu, mudah untuk mengkomit direktori proyek secara keseluruhan ke Git dengan .gitignore dari semua yang akan "diambil oleh komposer" untuk Anda (dan semua "pembaruan komposer" akan diganti saat memasang tambalan atau peningkatan).

Jangka panjang, tujuannya adalah mempersingkat .gitignore sebanyak mungkin. Misalnya mendorong lebih banyak ke dalam modul di bawah direktori 'vendor'.

Kemudian

  1. Untuk semua yang tidak ingin Anda bagikan di seluruh proyek, biarkan di bawah aplikasi / kode dan berkomitmen dalam repo proyek utama.
  2. Semua yang dikembangkan secara lokal yang ingin Anda bagikan di seluruh proyek dengan lebih mudah, masukkan repo GIT terpisah dan pasang melalui komposer sehingga berakhir di bawah 'vendor'. (Bisa jadi repo komposer lokal, atau cukup instal langsung dari GIT.)

Dengan cara itu Anda masih dapat git melakukan seluruh pohon proyek dari atas ke bawah, mengambil file composer.json dan composer.lock (melakukan hanya aplikasi / kode tidak). .Gitignore akan mengecualikan direktori 'vendor' dan file lain yang tidak diinginkan.

Ini memberi Anda yang terbaik dari kedua dunia yang disebutkan dalam diskusi lainnya. Nyeri saat ini adalah panjang dan rumitnya file .gitignore, dan instalasi patch saat ini menghapus beberapa penyesuaian lokal (misalnya dalam index.php). Penanganan jangka pendek - hapus index.php dari .gitignore, dan ketika Anda menginstal tambalan periksa untuk melihat perubahan apa yang hilang (git diff) dan terapkan kembali secara manual.

Alan Kent
sumber
Oke, jadi Anda akan mengubah beberapa hal di sana dalam waktu dekat, bagus! Saya ingin tahu apakah "magento-force": "override"bendera ini bisa berguna entah bagaimana. Saat ini tidak persis melakukan apa yang saya harapkan. Jika Anda mengedit / menambah index.phpfile "inti" Anda atau lainnya, Anda bisa memberi tahu Magento untuk tidak menimpa perubahan Anda. Apakah itu masuk akal?
fmrng
3

Ada Solusi mudah untuk mengatasi masalah Anda: jangan mengubah File inti;) Magento didasarkan pada memperpanjang Kode dan tidak mengubahnya.

Hal pertama adalah, Anda tidak harus meletakkan seluruh folder aplikasi / kode Anda dalam satu Repositori vcs. Setiap Komponen Magento (Modul, Tema, dll ...) harus merupakan repositori itu sendiri.

Jika Anda ingin mengubah / memperluas frontend, Anda harus membuat tema baru dan memperlakukan tema ini sebagai proyek kasar Anda, bukan seluruh Instance Magento2.

Untuk menginstal tema Anda di Proyek Anda, Anda dapat dengan mudah menariknya melalui komposer langsung dari repositori vcs Anda

David Verholen
sumber
Ya, app/codefolder itu ada khusus untuk menyesuaikan Magento. Pemahaman saya tentang M2 saat ini adalah yang app/codemenggantikan apa yang app/code/localada di M1, dan modul komunitas dapat diinstal melalui komposer di bawah vendor. Kami memiliki beberapa proyek dengan sejumlah besar modul, dan beberapa tema juga. Apa yang Anda sarankan tidak mungkin dikelola.
fmrng
Hei, kami mengelola proyek dengan> 100 komponen seperti itu. Kuncinya adalah menjaga modul tetap kecil dan mengelola ketergantungan komposer Anda di antara modul. Anda dapat mengkloning repositori proyek magento untuk kebutuhan Anda sendiri dan menambahkan semua komponen Anda ke proyek Anda
David Verholen
Jika Anda senang dengan pengaturan Anda saat ini, tidak apa-apa. Jujur, saya merasa agak rumit. Ini berarti Anda memiliki 100+ repositori git, dan setiap kali Anda mengubah sesuatu, Anda harus membuka proyek tertentu, komit perubahan Anda, jalankan composer update. Di mana Anda melakukan composer.lockitu? Jika Anda memiliki 10+ pengembang yang mengerjakan proyek yang sama, itu bisa menjadi sangat berantakan. Tentu saja kami memiliki banyak modul umum (dan bahkan tema) yang kami pasang melalui komposer, tetapi kode khusus proyek harus diversi versi di bawah repo yang sama demi kejelasan.
fmrng
Saya tidak mengatakan Anda salah melakukannya, saya pikir itu agak rumit untuk seleraku. Karena ketertarikan, bagaimana Anda memeriksa riwayat repo Anda dengan pengaturan seperti itu? Bagaimana Anda bisa menggunakan fitur seperti git blameatau git logketika kode tersebar di beberapa komponen? Apakah Anda menjalankan tes integrasi untuk melihat bahwa semuanya berfungsi dengan baik?
fmrng
kami melakukan diskusi ini secara internal tahun lalu dan penyebaran menjadi lebih sederhana karena kami memutuskan untuk membuatnya 1repo = 1module. Intinya adalah Anda tidak akan membuat pembaruan komposer untuk satu perubahan kecil. Pengembang bekerja di lingkungan pengembang dan mengubah file di sana secara langsung. Setelah selesai, mereka dapat menandainya sebagai kandidat alfa, beta atau rilis. Dengan cara ini, beberapa pengembang dapat bekerja pada banyak proyek pada waktu yang bersamaan dan di waktu berikutnya, Anda membuat pembaruan komposer dan menarik semua perubahan. Ada alat yang hebat untuk mengatur paket vcs dan komposer Anda.
Ratusan
2

Ok, sepertinya saya menemukan solusi yang lebih baik untuk apa yang saya coba capai. Dalam composer.json, dimungkinkan untuk menentukan file mana yang harus diabaikan oleh Penginstal Kompas Magento. Jika saya tidak ingin Gruntfile.jsditimpa, saya cukup menentukannya dengan konfigurasi berikut:

"extra": {
    "magento-deploy-ignore": {
        "magento/magento2-base": [
            "/Gruntfile.js",
            "/package.json"
        ]
    }
}

Saya sekarang dapat memperluas instalasi standar agar sesuai dengan kebutuhan saya.

fmrng
sumber
Solusi ini sepertinya tidak "meningkatkan keamanan". Jika Magento akan membuat perubahan pada file-file ini yang Anda abaikan, maka Anda tidak akan tahu atau Anda akan melupakan file-file ini. Anda menggunakan versi Anda sendiri yang tidak akan pernah menyertakan perubahan baru ini. Silakan periksa jawaban saya untuk saran saya.
7ochem
2

Sayangnya jawaban yang diterima, meskipun merupakan cara yang semula dimaksudkan untuk mencapai tujuan yang diinginkan, hanya berfungsi untuk mengecualikan file dan direktori yang ditempatkan di root, karena jika kita ingin mengecualikan file yang ditempatkan di subdirektori (mis. dev/tools/grunt/configs/themes.js, Diperlukan jika kita menambahkan tema baru dan ingin menggunakan tugas-tugas Magento Grunt), meletakkannya di konfigurasi "magento-deploy-diabaikan", itu memblokir penyebaran semua direktori induk (yaitu, dev dan semua subdirektori).

Ini terjadi karena metode yang memproses "magento-deploy-ign" ( \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored) gunakan strposuntuk mencocokkan jalur tujuan dengan daftar yang dikecualikan, sehingga setiap jalur induk akan selalu mengembalikan true.

Gennaro Vietri
sumber
Saya tahu, saya bisa melihat itu dalam pengujian saya, tetapi karena kami menggunakan alur kerja build yang berbeda, ia bekerja dengan baik bagi kami. Bisakah Anda menemukan opsi yang lebih baik?
fmrng
Kami mulai melakukan checkout file-file selama fase build dari pipeline kami, kemudian kami berhenti menggunakan sama sekali tugas-tugas Grunt built-in sehingga atm itu tidak masalah.
Gennaro Vietri
Ngomong-ngomong, kami mulai mengevaluasi fork magento-composer-installer untuk meningkatkan perilaku "magento-deploy-diabaikan", jika masalah muncul kembali kita bisa mengikuti jalan ini
Gennaro Vietri
0

Menggunakan tambalan

Apa yang saya gunakan adalah membuat dan menerapkan tambalan. Saat kami perlu mengubah dev/tools/grunt/configs/themes.js, index.phpatau .htaccesskami menerapkan perubahan pada salinan sementara file dan membuat tambalan darinya (buat build/direktori terlebih dahulu):

$ cp dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp
  # Now Make changes in .tmp file
$ diff -u3 dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp | sed 's/\.tmp//' > build/themes.patch
$ mv dev/tools/grunt/configs/themes.js.tmp dev/tools/grunt/configs/themes.js

Kemudian kita dapat membuat tambalan ini berlaku secara otomatis saat menjalankan composer installatau updatedengan menambahkan perintah ke scriptsbagian composer.jsonfile Anda :

{
    "scripts": {
        "post-install-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js",
        "post-update-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js"
    }
}

(Anda juga dapat menempatkan patch ...perintah di atas dalam skrip bash, katakanlah build/themes_patch.shdan panggil skrip itu dari Komposer sehingga akan dapat digunakan kembali atau dieksekusi secara manual)

Tingkatkan keamanan! : D

Solusi ini pemutakhiran yang aman! Anda tidak mengubah file inti secara langsung tanpa menghormati file asli. Anda menerapkan tambalan ke file Magento2 asli. Ketika file itu berubah karena Anda meningkatkan, tambalan akan gagal dan Anda tahu bahwa Anda harus melihat lebih dekat ke perubahan baru dan membuat tambalan baru.

7ochem
sumber