Cấu trúc ưa thích của dự án Magento 2 theo VCS là gì?


15

Khi tôi bắt đầu một dự án M2 mới, điều đầu tiên tôi sẽ làm là cài đặt lõi thông qua trình soạn thảo:

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

Bây giờ tôi có thể viết (các) mô-đun tùy chỉnh và chủ đề của mình bên dưới app/code. Sau đó tôi sẽ thêm thư mục của tôi composer.*và toàn bộ app/codevào VCS của tôi. Cho đến nay mọi thứ đều ổn.

Giả sử bây giờ tôi muốn sử dụng một số công cụ xây dựng cho dự án của mình, giả sử Grunt hoặc Gulp.

  1. Nếu tôi cam kết Gruntfile.js, cái này sẽ bị ghi đè bởi magento/magento2-basegói khi tôi chạy composer installsau khi tôi nhân bản repo.

  2. Nếu tôi cam kết gulpfile.js, tôi thực sự không thể xác định các phụ thuộc của mình trong một package.json, bởi vì nó cũng sẽ bị ghi đè bởi magento/magento2-base.

  3. Nếu tôi quyết định sử dụng thiết lập Grunt của Magento và muốn tùy chỉnh nó bằng cách chỉnh sửa các tệp trong /dev/tools/grunt(ví dụ themes.js), tôi không thể vì những thay đổi của tôi sẽ bị ghi đè bởi magento/magento2-base.

Tôi hiểu rằng bạn thực sự không thể làm gì nhiều trong tài liệu gốc của bạn. Tất nhiên có rất nhiều giải pháp cho vấn đề này:

  • Tôi có thể chạy git checkout -ngay sau khi cài đặt để thiết lập lại các tập tin của riêng mình
  • Tôi có thể lưu trữ các tập tin xây dựng của mình trong một thư mục chuyên dụng, /buildví dụ
  • Tôi có thể sử dụng một công cụ xây dựng khác, như Phing, Ant hoặc Rake (các nhà phát triển của tôi sẽ không vui lắm đâu)
  • Tôi có thể thay thế magento/magento2-basebằng gói tùy chỉnh có ánh xạ tùy chỉnh cho các tệp lõi (không thực sự tối ưu nhưng này, đó là một tùy chọn)

Cá nhân tôi không thích tất cả các tùy chọn này, vì vậy tôi muốn biết liệu có cách nào ưu tiên hay tốt hơn để đạt được những gì tôi đang cố gắng thực hiện.

Có ai có cùng một vấn đề? Làm thế nào bạn giải quyết nó? Làm thế nào để bạn cấu trúc dự án của bạn theo VCS?

CẬP NHẬT

Một điểm bổ sung liên quan đến việc thiết lập dự án. Trong các thử nghiệm của tôi, tôi nhận thấy rằng trình cài đặt trình soạn thảo Magento có cờ ghi đè tệp:

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

Nó được xử lý nội bộ như một boolean nếu tôi không nhầm, vì vậy tôi đã cố gắng đặt nó falseđể bỏ qua ghi đè. Khi tôi chạy composer installcài đặt của tôi không thành công vì tập tin đã có sẵn. Về cơ bản, nếu tôi không để Magento ghi đè các tệp của mình, tôi không thể cài đặt nó.

Mục đích của lá cờ này là gì? Có phải nó chỉ giả sử để thực hiện một kiểm tra cho tôi? Thành thật đối với tôi không có ý nghĩa gì, nhưng có lẽ ai đó có thể làm sáng tỏ chủ đề này.


Tôi tò mò muốn xem những gì người khác đăng là một câu trả lời. Lý tưởng nhất, tôi nghĩ rằng chúng tôi muốn giữ Magento Core khỏi repo chính của chúng tôi và giữ giới hạn đó chỉ cho mẫu chúng tôi tạo và bất kỳ plugin tùy chỉnh nào chúng tôi thêm hoặc đúng. Sau đó, tại thời điểm xây dựng, chúng tôi tham chiếu lõi + repo dự án của chúng tôi và xây dựng một tạo phẩm ứng dụng từ kho lưu trữ. Đây là phương pháp tôi đã sử dụng cho M1 gần đây và tôi tự hỏi liệu đề xuất chính thức từ Magento là làm điều gì đó tương tự với M2 bây giờ khi Trình soạn thảo được hỗ trợ đầy đủ.
Bryan 'BJ' Hoffpauir Jr.

Trong các phiên bản M2 mới hơn Gruntfile.js, gulpfile.jspackage.jsonvấn đề được giải quyết. Vấn đề này được đề cập trong câu hỏi này vẫn còn áp dụng đối với Magento 2 phiên bản mới hơn khi bạn cần phải thay đổi themes.js, index.phphoặc .htaccessví dụ.
7ochem

Câu trả lời:


4

Ngắn hạn, chúng tôi đang tìm cách tách các tệp cần tùy chỉnh. Ví dụ: nếu mọi người cần sửa đổi index.php, hãy tìm cách tách tệp Magento tiêu chuẩn khỏi nhu cầu tùy chỉnh cục bộ. Sau khi đạt được, có thể có "một .gitignore đúng cho tất cả các dự án có thể sử dụng". Đó là, dễ dàng cam kết toàn bộ thư mục dự án với Git với .gitignore của tất cả mọi thứ mà "trình soạn thảo cài đặt" sẽ tìm nạp cho bạn (và mọi thứ "cập nhật trình soạn thảo" sẽ thay thế khi cài đặt bản vá hoặc nâng cấp).

Dài hạn, mục tiêu là rút ngắn .gitignore càng nhiều càng tốt. Ví dụ: đẩy thêm vào các mô-đun trong thư mục 'nhà cung cấp'.

Sau đó

  1. Đối với mọi thứ bạn không muốn chia sẻ trên các dự án, hãy để nó dưới ứng dụng / mã và cam kết trong repo dự án chính.
  2. Mọi thứ được phát triển cục bộ mà bạn muốn chia sẻ giữa các dự án dễ dàng hơn, đặt vào một repo GIT riêng và cài đặt qua trình soạn thảo để nó kết thúc dưới 'nhà cung cấp'. (Có thể là repo nhà soạn nhạc địa phương hoặc chỉ cần cài đặt trực tiếp từ GIT.)

Bằng cách đó, bạn vẫn có thể git cam kết toàn bộ cây dự án từ trên xuống, chụp các tệp composer.json và composer.lock (chỉ cam kết không có ứng dụng / mã). .Gitignore sẽ loại trừ thư mục 'nhà cung cấp' và các tệp khác không muốn.

Điều này cung cấp cho bạn tốt nhất của cả hai thế giới được đề cập trong các cuộc thảo luận khác. Nỗi đau hiện tại là độ dài và độ phức tạp của tệp .gitignore và cài đặt bản vá hiện đang xóa sạch một số tùy chỉnh cục bộ (ví dụ: trong tệp index.php). Giải pháp ngắn hạn - xóa index.php khỏi .gitignore và khi bạn cài đặt kiểm tra bản vá để xem những thay đổi bạn đã mất (git diff) và áp dụng lại chúng theo cách thủ công.


OK, vì vậy bạn sẽ thay đổi một số thứ ở đó trong tương lai gần, tốt đẹp! Tôi tự hỏi nếu "magento-force": "override"lá cờ này có thể hữu ích bằng cách nào đó. Hiện tại nó không chính xác làm những gì tôi mong đợi. Trong trường hợp bạn chỉnh sửa / mở rộng index.phpcác tệp "lõi" khác, bạn có thể chỉ cần yêu cầu Magento không ghi đè lên các thay đổi của bạn. Liệu no co y nghia gi?
fmrng

3

Có một Giải pháp dễ dàng cho vấn đề ghi đè của bạn: không thay đổi Tập tin lõi;) Magento dựa trên việc mở rộng Mã và không thay đổi.

Điều đầu tiên là, bạn không nên đặt toàn bộ thư mục ứng dụng / mã của mình vào một Kho lưu trữ vcs. Mỗi Thành phần Magento (Mô-đun, Chủ đề, v.v ...) phải là một kho lưu trữ.

Nếu bạn muốn thay đổi / mở rộng giao diện, bạn nên tạo một chủ đề mới và coi chủ đề này là dự án lẩm cẩm của bạn, chứ không phải toàn bộ Sơ đồ Magento2.

Để cài đặt chủ đề của bạn trong Dự án, bạn có thể dễ dàng kéo nó qua trình soạn thảo trực tiếp từ kho lưu trữ vcs của bạn


Chà, app/codethư mục đặc biệt ở đó để tùy chỉnh Magento. Sự hiểu biết của tôi về M2 hiện tại là app/codethay thế những gì app/code/localđã có trong M1 và các mô-đun cộng đồng có thể được cài đặt thông qua trình soạn thảo bên dưới vendor. Chúng tôi có một số dự án với số lượng mô-đun LỚN và một số chủ đề. Những gì bạn đang đề xuất sẽ không thể quản lý.
fmrng

Này, chúng tôi quản lý các dự án với> 100 thành phần theo cách đó. Điều quan trọng là giữ cho các mô-đun nhỏ và quản lý các phụ thuộc nhà soạn nhạc của bạn giữa các mô-đun. Bạn có thể sao chép kho lưu trữ dự án magento cho nhu cầu của riêng bạn và thêm tất cả các thành phần của bạn vào dự án của bạn
David Verholen

Nếu bạn hài lòng với thiết lập hiện tại của mình thì tốt thôi. Thành thật mà nói, tôi thấy nó khá cồng kềnh. Điều đó có nghĩa là bạn có hơn 100 kho lưu trữ git và mỗi khi bạn thay đổi thứ gì đó, bạn phải mở một dự án cụ thể, cam kết thay đổi, chạy composer update. Bạn cam kết ở composer.lockđâu? Nếu bạn có hơn 10 nhà phát triển làm việc trong cùng một dự án, nó có thể trở nên thực sự lộn xộn. Tất nhiên chúng tôi có rất nhiều mô-đun chung (và thậm chí cả chủ đề) mà chúng tôi cài đặt thông qua trình soạn thảo, nhưng mã dành riêng cho dự án nên được phiên bản dưới cùng một repo để rõ ràng.
fmrng

Tôi không nói rằng bạn đang làm sai, tôi nghĩ rằng nó hơi quá so với sở thích của tôi. Không quan tâm, làm thế nào để bạn kiểm tra lịch sử repo của bạn với một thiết lập như vậy? Làm thế nào bạn có thể sử dụng các tính năng như git blamehoặc git logkhi mã được phân tán trong nhiều thành phần? Bạn có chạy thử nghiệm tích hợp để thấy rằng mọi thứ đều hoạt động tốt?
fmrng

chúng tôi đã có cuộc thảo luận này trong nội bộ năm ngoái và việc triển khai trở nên khá đơn giản vì chúng tôi quyết định thực hiện nó 1repo = 1module. Điểm chính là bạn sẽ không thực hiện cập nhật nhà soạn nhạc cho một thay đổi nhỏ. Các nhà phát triển làm việc trong môi trường dev và thay đổi các tập tin trực tiếp ở đó. Khi hoàn thành, họ có thể gắn thẻ đó là ứng viên alpha, beta hoặc phát hành. Bằng cách này, một số nhà phát triển có thể làm việc trên nhiều dự án cùng một lúc và lần sau, bạn thực hiện cập nhật nhà soạn nhạc mà bạn thực hiện trong tất cả các thay đổi. Có nhiều công cụ tuyệt vời để tổ chức các gói vcs và nhà soạn nhạc của bạn. Hàng trăm kho lưu trữ không phải là vấn đề
David Verholen

2

Ok, có vẻ như tôi đã tìm thấy một giải pháp tốt hơn cho những gì tôi đang cố gắng đạt được. Trong composer.jsonđó, có thể chỉ định tệp nào sẽ bị bỏ qua bởi Trình cài đặt Trình soạn thảo Magento. Nếu tôi không muốn Gruntfile.jsghi đè, tôi chỉ cần xác định nó với cấu hình sau:

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

Bây giờ tôi có thể mở rộng cài đặt tiêu chuẩn để phù hợp với nhu cầu của tôi.


Giải pháp này dường như không "nâng cấp an toàn". Nếu Magento sẽ thay đổi những tệp này mà bạn bỏ qua, thì bạn sẽ không biết hoặc bạn sẽ quên những tệp này. Bạn đang sử dụng phiên bản của riêng bạn sẽ không bao giờ bao gồm những thay đổi mới này. Vui lòng kiểm tra câu trả lời của tôi cho đề nghị của tôi.
7ochem

2

Thật không may, câu trả lời được chấp nhận, mặc dù là cách ban đầu nhằm đạt được mục tiêu mong muốn, chỉ hoạt động để loại trừ các tệp và thư mục được đặt trong thư mục gốc, bởi vì nếu chúng tôi muốn loại trừ một tệp được đặt trong thư mục con (ví dụ: dev/tools/grunt/configs/themes.jscần thiết nếu chúng tôi thêm chủ đề mới và muốn sử dụng các tác vụ Magento Grunt), đặt nó trong cấu hình "magento-triển khai-bỏ qua", nó chặn việc triển khai tất cả các thư mục mẹ (nghĩa là dev và tất cả các thư mục con của nó).

Điều này xảy ra bởi vì phương thức xử lý "magento-triển khai-bỏ qua" ( \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored) sử dụng strposđể khớp đường dẫn đích với danh sách loại trừ, vì vậy mọi đường dẫn cha mẹ sẽ luôn trả về đúng.


Tôi biết, tôi có thể thấy điều đó trong các thử nghiệm của mình, nhưng vì chúng tôi đang sử dụng một quy trình xây dựng khác, nó hoạt động tốt cho máy của chúng tôi. Bạn có thể tìm thấy một lựa chọn tốt hơn?
fmrng

Chúng tôi đã bắt đầu thực hiện kiểm tra các tệp trong giai đoạn xây dựng đường ống của mình, sau đó chúng tôi đã ngừng sử dụng tất cả các tác vụ Grunt tích hợp để không gặp vấn đề gì.
Gennaro Vietri

Bằng cách này, chúng tôi bắt đầu đánh giá của ngã ba magento-nhà soạn nhạc-installer cho tăng cường "magento-triển khai-bỏ qua" hành vi, nếu vấn đề nên xuất hiện lại chúng ta có thể đi theo con đường này
Gennaro Vietri

0

Sử dụng miếng vá

Những gì tôi sử dụng là tạo và áp dụng các bản vá. Khi chúng ta cần phải thay đổi dev/tools/grunt/configs/themes.js, index.phphoặc .htaccesschúng tôi áp dụng các thay đổi cho một bản sao tạm thời của tập tin và tạo ra một bản vá ra khỏi nó (tạo ra một build/thư mục đầu tiên):

$ 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

Sau đó, chúng tôi có thể làm cho bản vá này tự động áp dụng khi chạy composer installhoặc updatebằng cách thêm các lệnh te vào scriptsphần composer.jsontệp của bạn :

{
    "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"
    }
}

(Ngoài ra, bạn có thể đặt patch ...lệnh trên trong tập lệnh bash, hãy nói build/themes_patch.shvà gọi tập lệnh đó từ Trình soạn thảo để nó có thể được sử dụng lại hoặc thực thi thủ công)

Nâng cấp an toàn! : D

Giải pháp này được nâng cấp an toàn! Bạn không thay đổi trực tiếp các tệp cốt lõi mà không tôn trọng tệp gốc. Bạn đang áp dụng một bản vá cho tệp Magento2 gốc. Khi tệp đó thay đổi vì bạn đang nâng cấp, bản vá sẽ thất bại và bạn biết rằng bạn phải xem xét kỹ hơn những thay đổi mới và tạo một bản vá mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.