Kiedy rozpoczynam nowy projekt M2, pierwszą rzeczą, którą chciałbym zrobić, to zainstalować rdzeń za pomocą kompozytora:
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition
Mogę teraz napisać moje niestandardowe moduły i motywy pod app/code
. Następnie dodam mój composer.*
i cały app/code
folder do mojego VCS. Jak dotąd wszystko jest w porządku.
Załóżmy, że teraz chcę użyć narzędzi do kompilacji dla mojego projektu, powiedzmy Grunt lub Gulp.
Jeśli popełnię własne
Gruntfile.js
, zostanie to nadpisane przezmagento/magento2-base
pakiet, gdy uruchomięcomposer install
po sklonowaniu repozytorium.Jeśli popełniam moje
gulpfile.js
, nie mogę tak naprawdę zdefiniować moich zależności wpackage.json
, ponieważ byłoby to również zastąpione przezmagento/magento2-base
.Jeśli zdecyduję się użyć konfiguracji Grunt Magento i chcę ją dostosować, edytując pliki w
/dev/tools/grunt
(np.themes.js
), Nie mogę, ponieważ moje zmiany zostałyby zastąpione przezmagento/magento2-base
.
Rozumiem, że tak naprawdę niewiele można zrobić w katalogu głównym dokumentu. Istnieje oczywiście wiele rozwiązań tego problemu:
- Mogłem uruchomić
git checkout -
zaraz po instalacji, aby zresetować własne pliki - Mogę przechowywać swoje pliki kompilacji w specjalnym folderze,
/build
na przykład - Mógłbym użyć innego narzędzia do budowania, takiego jak Phing, Ant lub Rake (moi twórcy frontendu nie byliby jednak tacy szczęśliwi)
- Mógłbym zastąpić
magento/magento2-base
niestandardowym pakietem, który ma niestandardowe mapowanie plików podstawowych (niezbyt optymalne, ale hej, jest to opcja)
Osobiście nie lubię tych wszystkich opcji, więc chciałbym wiedzieć, czy istnieje preferowany lub lepszy sposób na osiągnięcie tego, co próbuję zrobić.
Czy ktoś ma ten sam problem? Jak to rozwiązałeś? Jak tworzysz swój projekt w ramach VCS?
AKTUALIZACJA
Dodatkowy punkt związany z konfiguracją projektu. W moich eksperymentach zauważyłem, że instalator kompozytora Magento ma flagę do przesłonięcia pliku:
"extra": {
"magento-force": "override"
}
Jest to wewnętrznie traktowane jako logiczne, jeśli się nie mylę, więc próbowałem ustawić go tak, false
aby pomijał przesłonięcie. Po uruchomieniu composer install
instalacja kończy się niepowodzeniem, ponieważ pliki są już obecne. Zasadniczo, jeśli nie pozwolę Magento zastąpić moich plików, nie będę mógł ich zainstalować.
Jaki jest zatem cel tej flagi? Czy ma to na celu jedynie sprawdzenie mnie? Szczerze mówiąc, nie ma dla mnie sensu, ale może ktoś może rzucić nieco światła na ten temat.
źródło
Gruntfile.js
,gulpfile.js
ipackage.json
problem został rozwiązany. Emisja skierowana na to pytanie jest nadal stosowane do nowszych Magento 2 wersjach, kiedy trzeba zmienićthemes.js
,index.php
lub.htaccess
na przykład.Odpowiedzi:
Krótko mówiąc, szukamy osobnych plików, które wymagają dostosowania. Np. Jeśli ludzie muszą zmodyfikować plik index.php, dowiedz się, jak oddzielić standardowy plik dostarczany przez Magento od potrzeby lokalnych dostosowań. Po osiągnięciu tego, możliwe jest posiadanie „jednego prawdziwego .gitignore dla wszystkich projektów, z których można korzystać”. Oznacza to, że łatwo jest przekazać cały katalog projektu do Git za pomocą .gitignore wszystkiego, co „instalator instalacji” pobierze dla ciebie (i wszystko, co „aktualizacja kompozytora” zastąpi podczas instalowania poprawki lub aktualizacji).
W dłuższej perspektywie celem jest maksymalne skrócenie .gitignore. Np. Wepchnij więcej do modułów w katalogu „vendor”.
Następnie
W ten sposób nadal możesz zatwierdzić całe drzewo projektu od góry do dołu, przechwytując pliki composer.json i composer.lock (nie działa tylko app / code). .Gitignore wyklucza katalog „vendor” i inne niepotrzebne pliki.
To daje najlepsze z obu światów wymienionych w innej dyskusji. Obecny problem polega na długości i złożoności pliku .gitignore, a instalacja łatki obecnie usuwa pewne lokalne dostosowania (np. W index.php). Obejście krótkoterminowe - usuń plik index.php z .gitignore, a po zainstalowaniu łatki sprawdź, jakie zmiany zostały utracone (git diff) i ponownie zastosuj je ręcznie.
źródło
"magento-force": "override"
flaga może się przydać. W tej chwili nie robi dokładnie tego, czego bym się spodziewał. W przypadku edytowania / rozszerzania swoichindex.php
lub innych „podstawowych” plików, możesz po prostu powiedzieć Magento, aby nie nadpisywał twoich zmian. Czy to ma jakiś sens?Istnieje proste rozwiązanie dla problemu zastąpienia Problem: nie zmieniaj podstawowych plików;) Magento opiera się na rozszerzaniu Kodeksu i nie zmienianiu go.
Po pierwsze, nie należy umieszczać całego folderu aplikacji / kodu w jednym repozytorium vcs. Każdy komponent Magento (moduł, motyw itp.) Powinien stanowić samo repozytorium.
Jeśli chcesz zmienić / rozszerzyć frontend, powinieneś utworzyć nowy motyw i potraktować ten motyw jako swój cholerny projekt, a nie całą instancję Magento2.
Aby zainstalować motyw w projekcie, możesz łatwo pobrać go za pomocą kompozytora bezpośrednio z repozytorium vcs
źródło
app/code
folder jest specjalnie dostosowany do Magento. Moje rozumienie obecnego M2 jest takie, żeapp/code
zastępuje to, coapp/code/local
było w M1, a moduły społecznościowe można instalować za pośrednictwem kompozytora podvendor
. Mamy kilka projektów z DUŻĄ liczbą modułów i kilkoma tematami. To, co sugerujesz, byłoby niemożliwe do zarządzania.composer update
. Gdzie to popełniszcomposer.lock
? Jeśli masz ponad 10 programistów pracujących nad tym samym projektem, może się to okazać bardzo nieuporządkowane. Oczywiście mamy wiele ogólnych modułów (a nawet motywów), które instalujemy za pomocą kompozytora, ale kod specyficzny dla projektu powinien być wersjonowany pod tym samym repozytorium dla zachowania przejrzystości.git blame
lubgit log
gdy kod jest rozproszony w wielu komponentach? Czy przeprowadzasz testy integracyjne, aby sprawdzić, czy wszystko działa poprawnie?Ok, wygląda na to, że znalazłem lepsze rozwiązanie tego, co próbowałem osiągnąć. W polu
composer.json
można określić, które pliki powinny być ignorowane przez instalator Magento Composer. Jeśli nie chcę,Gruntfile.js
aby moje ustawienia zostały zastąpione, mogę po prostu określić to w następującej konfiguracji:Teraz mogę rozszerzyć standardową instalację, aby dostosować ją do moich potrzeb.
źródło
Niestety zaakceptowana odpowiedź, choć pierwotnie miała na celu osiągnięcie zamierzonego celu, działa tylko w celu wykluczenia plików i katalogów umieszczonych w katalogu głównym, ponieważ jeśli chcemy wykluczyć plik umieszczony w podkatalogu (np.
dev/tools/grunt/configs/themes.js
Potrzebny, jeśli dodamy nowy motyw i chcesz korzystać z zadań Magento Grunt), umieszczając go w konfiguracji „magento-deploy-ignore”, blokuje wdrażanie wszystkich katalogów nadrzędnych (czyli dev i wszystkich podkatalogów).Dzieje się tak, ponieważ metoda przetwarzająca
\MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored
użycie „magento-deploy-ignore” ( )strpos
dopasowuje ścieżkę docelową do listy wykluczonych, więc każda ścieżka nadrzędna zawsze zwróci true.źródło
Używanie łatek
To, czego używam, to tworzenie i stosowanie łatek. Kiedy musimy zmienić
dev/tools/grunt/configs/themes.js
,index.php
lub.htaccess
możemy zastosować zmiany do tymczasowej kopii pliku i utworzyć z niego łatę (utwórzbuild/
dir pierwszy):Następnie możemy sprawić, że ta łatka zostanie zastosowana automatycznie podczas działania
composer install
lubupdate
poprzez dodanie poleceń te doscripts
sekcji twojegocomposer.json
pliku:(Możesz także umieścić powyższe
patch ...
polecenie w skrypcie bash, powiedzmybuild/themes_patch.sh
i wywołaj ten skrypt z Composer, aby można go było użyć ponownie lub ręcznie)Uaktualnij bezpiecznie! :RE
To rozwiązanie jest bezpieczne do aktualizacji! Nie zmieniasz bezpośrednio plików podstawowych bez przestrzegania oryginalnego pliku. Stosujesz łatkę do oryginalnego pliku Magento2. Kiedy ten plik zmienia się podczas aktualizacji, łatka nie powiedzie się i wiesz, że musisz przyjrzeć się bliżej nowym zmianom i utworzyć nową.
źródło