Jak korzystać z modułu Funkcje w środowisku 3 programistów?

19

Pracując nad projektem, intensywnie wykorzystując Funkcje , czasami jest 3 programistów dla tej aplikacji.

Wypróbowaliśmy kilka metod, ale kiedy łączymy nasze gałęzie git, wydaje się, że często „wzajemnie nadpisujemy” zmiany funkcji. Konflikty obfitują, psując moduł funkcji, co wydaje się bolesne w użyciu.

Funkcje to naprawdę niesamowita oszczędność czasu do konfiguracji dla jednego z projektów i jestem całkiem pewien, że istnieje sposób na rozwiązanie tego problemu.

Czy istnieje przepływ pracy lub procedura zmniejszająca ryzyko konfliktów i nadpisywania?

Wszelkie wskazówki dotyczące funkcji są mile widziane.

stefgosselin
źródło

Odpowiedzi:

20

Witamy na ziemi F T y p C onfiguration M ARZĄDZANIE, aka FCM ! Nie chodzi tylko o funkcje , a nie o zarządzanie konfiguracją (wprowadzone w Drupal w wersji 8). Zamiast tego, jest to szczególny przypadek S oftware C onfiguration M ARZĄDZANIE , aka SCM . Głównie dlatego, że Funkcje można uznać za generator kodu, podczas gdy wygenerowany kod należy migrować przez wiele środowisk. Czytaj dalej, aby uzyskać więcej informacji.

1 - Plusy i minusy korzystania z funkcji

Zalety korzystania z funkcji

  • Zautomatyzuj wdrażanie zmian zastosowanych w witrynie deweloperskiej Drupal do co najmniej jednej docelowej (wcześniejszej) strony produkcyjnej Drupal (zamiast ręcznej instalacji).
  • Ułatwia udostępnianie (wysyłkę) ciągłego rozwoju Drupal między deweloperami / twórcami witryn Drupal (np. Aby niektóre Widoki utworzone przez eksperta ds. Widoków były dostępne dla Drupala Themera pracującego w innej witrynie deweloperskiej w celu stworzenia motywu tego widoku).
  • Wielka integracja zarówno GIT i Drush dla wysyłać kopię kodu generowanego przez funkcje (na miejscu) do rozwoju wybrany docelowych (wstępnie) zakładów produkcyjnych.

Wady korzystania z funkcji

  • Unikanie konfliktów funkcji i / lub zarządzanie zależnościami funkcji może być trudne!
  • Nie jest łatwo rozpocząć korzystanie z funkcji w istniejącej (produkcyjnej) witrynie.
  • Instalowanie / włączanie modułu funkcji jest łatwe (tylko moduł), ale nauka prawidłowego korzystania z funkcji jest dużym wyzwaniem.

2 - Techniki pakowania funkcji

Korzystanie z funkcji zależy od Twojej wyobraźni, jak spakować (skomponować) zawartość funkcji. Oto kilka technik, które można do tego wykorzystać.

Jedna super funkcja

Jest to dość prosta technika pakowania: wszystko jest spakowane razem w jednej funkcji (niektórzy nazywają to funkcją „Boga” ...). Wydaje się to łatwe, dość do przodu itp. Ale ta technika prowadzi również do „konfliktów” (jak wyjaśniono poniżej) mniej więcej od razu…

Dobrym przykładem tego wydaje się tworzenie „dystrybucji Drupal”, w której zakłada się, że wszyscy użytkownicy używają tego samego zestawu modułów, konfiguracji itp. Jeśli jednak taka dystrybucja składa się z wielu funkcji strony internetowej (nie używać słowa „funkcje” ...), bardziej odpowiednie wydaje się podzielenie takich funkcji na wiele funkcji, jak wyjaśniono poniżej.

Na podstawie funkcjonalności strony internetowej

Ta technika pakowania tworzy oddzielną funkcję dla każdej funkcjonalności strony internetowej, taką jak:

  • Cecha A = zaimplementuj „ * Galerię ”.
  • Funkcja B = wdrożenie „ * Blog ”.
  • Funkcja C = zaimplementuj „ * Kalendarz wydarzeń ”.

Na podstawie sekcji administracyjnych Drupala

Ta technika pakowania tworzy oddzielne funkcje dla każdej (głównej) sekcji administracyjnej strony internetowej Drupal, która jest używana do utworzenia strony, takie jak:

  • Wszystkie wymagane moduły są zawarte w funkcji A,
  • Wszystkie podstawowe definicje pól są zawarte w funkcji B,
  • Wszystkie typy treści są zawarte w funkcji C,
  • Wszystkie uprawnienia są zawarte w funkcji D,
  • Wszystkie role są zawarte w funkcji E,
  • Wszystkie zmienne są zawarte w funkcji F,
  • Wszystkie (niestandardowe) widoki są zawarte w funkcji G,
  • Wszystkie (niestandardowe) reguły są zawarte w funkcji H,
  • Itp.

Powyższa lista jest praktycznie nieograniczona: w końcu możesz nawet pomyśleć o niej jako o 1 funkcji dla każdej opcji menu administratora Drupal ... jeśli chcesz posunąć się tak daleko.

IMO jest również najbardziej zalecanym podejściem do funkcji pakietu.

3 - Zmniejszenie prawdopodobieństwa konfliktów w funkcjach i / lub GIT

Nie używaj ponownie pól

Wydaje się, że wiele konfliktów jest spowodowanych ponownym użyciem pól w wielu typach treści. Np. W typie treści A masz pole z nazwą komputera field_somefield, które jest również używane jako pole w typie treści B o tej samej nazwie komputera, field_somefieldale które jest innym typem pola i / lub innymi ustawieniami pól, które są różne.

Nie wykorzystując ponownie pól wśród typów treści, unikniesz uruchamiania tego problemu. Zapoznaj się z interesującą konwencją nazewnictwa dla nazwy komputera typów zawartości i pól, jak pokazano w tabeli Architektura i dokumentacja informacji o opakowaniach , która jest częścią artykułów o „ Modelu względności dla Drupala ”. Więcej informacji na ten temat można znaleźć w mojej odpowiedzi na pytanie „ Jak modelować zawartość (typy) z punktu widzenia bazy danych? ”.

Podziel funkcje w zależności od tego, kto na czym pracuje

Jeśli w jednej witrynie pracuje wiele osób, liczbę konfliktów można zmniejszyć, organizując (= tworząc osobne) funkcje w zależności od tego, kto nad czym pracuje. Przykładem tego może być ten przykład:

4 - Zalecane środowiska Drupal

Wszystko powyżej powinno pomóc w jakiś sposób ułatwić korzystanie z Funkcji . Jednak, aby upewnić się, że wszystko będzie działało zgodnie z oczekiwaniami (zaprojektowane), musisz również mieć odpowiedni zestaw środowisk (logicznie powiązane strony Drupal) z zasadniczo następujących powodów:

  • scalanie funkcjonalności zapewnianej przez wiele funkcji.
  • przewidywać i rozwiązywać konflikty.
  • testowanie przez użytkownika końcowego wszystkich scalonych funkcji, które są certyfikowane jako nie powodujące żadnych konfliktów.

W idealnym świecie te logicznie powiązane witryny Drupal powinny być skonfigurowane i używane w następujący sposób:

  1. Osobista witryna deweloperska - każdy programista witryny ma oddzielną witrynę programistyczną. Gdy część rozwoju jest gotowa do udostępnienia komuś innemu, tworzona jest odpowiednia funkcja, która jest dostarczana do środowiska testowego.
  2. Witryna z piaskownicą - jest to środowisko Drupal, które zawiera tylko rdzeń Drupala, używane do jednostkowego testowania kompletności pojedynczej funkcji. Jeśli funkcja przypadkowo ma jakieś nieoczekiwane zależności (np. Jakiś moduł, od którego ta funkcja zależy, co nie jest włączone w piaskownicy), wtedy właśnie ta zależność stanie się jasna.
  3. Witryna przejściowa - tutaj jest dostarczana jedna lub więcej funkcji (utworzonych w witrynie deweloperskiej). Może to być tylko poprawka dla jakiegoś problemu produkcyjnego lub może to być miejsce, w którym skonsolidowane są wszystkie prace nad nową wersją strony. Jeśli istnieją konflikty między wieloma funkcjami, jest to środowisko, w którym najpierw się pojawią ... i trzeba je jakoś rozwiązać.
  4. Witryna zapewniania jakości - po tym, jak środowisko testowe zostanie uznane za stabilne, nadszedł czas, aby przejść do odpowiednich funkcji i udostępnić je również na wyższym poziomie, gdzie można ich używać do testowania jakości, testów akceptacyjnych, testów objętościowych itp. Na tym poziomie powinien zachować szczególną ostrożność, dopuszczając wszelkie dodatkowe zmiany (jeśli takie istnieją). Ponieważ każda taka zmiana może unieważnić wszystkie wcześniejsze testy przeprowadzone w tym środowisku.
  5. Shadow Production Site - Aby przygotować aktywację w rzeczywistej produkcji, możesz najpierw promować odpowiednie funkcje w środowisku, które jest uważane za kopię (cień) twojego rzeczywistego środowiska produkcyjnego. Jeśli na tym etapie procesu migracji coś nadal się psuje, oznacza to czerwoną flagę, aby cofnąć niektóre z poprzednich kroków. Napraw to i spróbuj ponownie, aż wszystkie zaangażowane strony zatwierdzą zmiany.
  6. Zakłady produkcyjne - jeśli wykonałeś wszystkie poprzednie kroki, krok ten powinien być zrozumiały i łatwy. W zależności od potrzeb może to być pojedyncza witryna lub coś równoważnego z wieloma witrynami Drupala, podczas gdy wszystkie zaangażowane strony mają te same wersje wszystkich funkcji.
  7. Strona bazowa - Z mojego doświadczenia wynika, że ​​nie ma wielu (jeśli w ogóle) implementacji Drupal, w których ten typ strony jest używany (również). Jest to po prostu kopia Witryny produkcyjnej, ale dostępna dla programistów Drupala, testerów itp., Których można użyć do sprawdzenia, jak wyglądają witryny produkcyjne lub do przeprowadzenia szkolenia użytkowników itp. I za każdym razem, gdy nowe opracowanie Cykl zostanie rozpoczęty, składniki witryny, na które będzie miało to wpływ (należy je zmienić), powinny zostać „skopiowane” przy użyciu tej strony początkowej jako danych wejściowych, a jako docelowej witryny rozwoju osobistego .

Oczywiście powyższa lista rodzajów witryn Drupal jest jak idealny świat. W zależności od wielkości zespołu programistów i / lub dostępnych budżetów na ich tworzenie i utrzymanie, nie wszystkie z nich mogą być wykorzystane (lub niedrogie). Inwentarz ten jest wzorowany na najlepszych praktykach w obszarze SCM, stosowanych głównie we wszystkich dużych / globalnych korporacjach (bankach, liniach lotniczych itp.).

5 - Powiązane moduły

Silne ramie

Strongarm moduł pozwala na eksportowanie zmiennych (modułów, które przechowują swoje ustawienia zmiennych) z funkcjami modułu.

Eksport węzłów

Eksport Węzeł Moduł pozwala użytkownikom na węzłach eksportowych, a następnie zaimportować je do innej instalacji Drupala.

Eksport roli

Rola Export Moduł pozwala role mieć machine_names i generuje unikalny identyfikator roli (RID) w oparciu off z nazwa_komputera. Role można eksportować za pomocą funkcji i uzyskać dokładnie to samo, jeśli zostaną zaimportowane na inne strony.

Funkcje Banish

Moduł funkcji Banish pozwala całkowicie wykluczyć poszczególne komponenty funkcji z interfejsu użytkownika funkcji i eksportu funkcji. Oto cytat na ten temat ze strony projektu:

 Ten moduł jest przydatny, gdy istnieją komponenty funkcji, które chcesz mieć pewność, że NIGDY nie zostaną wyeksportowane. Jeśli używasz funkcji do budowania lub wdrażania witryny, prawdopodobnie spotkałeś się z problemem przypadkowego wyeksportowania zmiennych znaczników czasu, takich jak cron_last lub update_last_check. Możesz także chcieć usunąć uprawnienia dla modułów programistów, aby nie dały się złapać na resztę uprawnień witryny, które chcesz wyeksportować. Wykluczone przedmioty nie pojawią się w module funkcji ANI ŻADNYM MODUŁU FUNKCJI, więc używaj ich ostrożnie. Aby uzyskać centralną listę funkcji, których nigdy nie należy eksportować, zobacz https://www.drupal.org/node/2400531

FASOLA

Bean moduł sprawia, że bloki eksportowane. Oto cytat na ten temat ze strony projektu:

Pomyśl o Fasoli jako metodzie dostarczania nowych typów (w porównaniu do węzła byłby to typ zawartości), która następnie zapewnia interfejs dodawania treści, aby utworzyć tyle bloków, ile potrzebujesz (patrz zrzut ekranu poniżej). Zawartość fasoli można następnie umieścić wokół witryny, tak jak każdy inny blok.

Moduł ten działa również doskonale w połączeniu z modułami integracji funkcji UUID i UUID . Moduł ten zaczął się dopiero w D7, ale został już dołączony do rdzenia Drupal 8. Samouczek wideo Samouczek modułu Drupal Bean - korzystanie z interfejsu użytkownika narzędzia Bean Admin stanowi świetne wprowadzenie do zrozumienia mocy tego modułu i tego, co możesz z nim zrobić (tylko przy użyciu technik tworzenia witryny, bez konieczności niestandardowego kodowania).

Siedlisko

Habitat moduł największy sens w sposób Cechy opartych pracy. Oto cytat na ten temat ze strony projektu:

W konfiguracji wielośrodowiskowej (np. Prod, test, dev, local) istnieje kilka modułów, które zawsze chcesz włączyć lub wyłączyć w niektórych środowiskach. Za każdym razem, gdy synchronizujesz bazę danych, musisz ponownie włączyć / wyłączyć te same moduły. Co gorsza, stajesz się leniwy i włączasz moduły programistyczne podczas produkcji.

Habitat zapewnia ustawienia włączania lub wyłączania niektórych modułów w każdym środowisku (siedlisku). Wystarczy ustawić zmienną, np. $ Conf ['habitat'] = 'local'; w pliku settings.php (rzeczywistą zmienną, którą można tam użyć, jest konfigurowalny dla bieżącego przepływu pracy). Wyłączanie / włączanie modułów odbywa się na hook_init.

6 - Zalecane zasoby:

7 - Możliwe alternatywy dla korzystania z funkcji

Jeśli nie jesteś w stanie lub nie chcesz (jeszcze) korzystać z Funkcji , możesz sprawdzić, w jakim stopniu poniższe podejścia / moduły mogą stanowić jakiś rodzaj alternatywy.

Ręczny eksport / import

Są to powszechnie znane obiekty (w celu uniknięcia Słowo funkcje ...), dostępne za pośrednictwem interfejsu administratora, dla modułów takich jak Regulaminu , Wyświetleń itd (lista niepełna!).

Kopia pakietu

Niektóre osoby uważają moduł kopiowania pakietu za możliwą alternatywę. Obsługuje eksport / import dla:

  • Typy węzłów
  • Taksonomia
  • Użytkownik.
  • Pola API pola.
  • Grupy terenowe.
Pierre.Vriens
źródło
1
Najlepsza odpowiedź, jaką kiedykolwiek widziałem.
Bez Sssweat
@NoSssweat Merci za kudos ... ale wiem, że uważam to za wciąż dość niekompletne. Np. Nie zawiera prawie nic na temat „cyklu życia” funkcji przetwarzania i nie mówi jeszcze wiele o takich rzeczach, jak analiza wpływu, audyt, zarządzanie wydaniami, autoryzacje i, i (i jeszcze kilkanaście tematów).
Pierre.Vriens
1
@ Pierre.Vriens - Dzięki! Chyba doszedłem do tego samego wniosku, co twoja doskonała odpowiedź na poważnie. Wypróbowałem podejście dzielenia według składników (views_views, dependence itp.), Ale miałem konflikty podczas próby wygenerowania funkcji. Uświadomiłem sobie -> po ->, że prawdopodobnie musiałem skonfigurować tę funkcję, aby nie sprawdzać zależności i ignorować konflikty.
stefgosselin
7

Konflikty scalania prawdopodobnie zostaną podane, gdy wielu programistów integruje swoją konfigurację z funkcją. Napisałem kilka wskazówek dotyczących recenzowania kodu funkcji, ale myślę, że najważniejsze jest to:

Zatwierdź tylko zamierzone zmiany kodu.

Co to znaczy? Oznacza to, że każdy programista musi przejrzeć kod przed zatwierdzeniem. Nie ma „magii”, która zapobiegałaby niezamierzonym zmianom kodu bez ostrożności programisty.

  • Przejrzyj zmiany kodu za pomocą git diff.
  • Wykonaj szybką łatkę różnicową za pomocą git diff > blah.patchi ręcznie zmodyfikuj łatkę, aby uwzględnić tylko zamierzone zmiany konfiguracji.
    • Rzeczy takie jak „mtime”, komentarze w widoku eksportu w pliku informacyjnym nie muszą być zawarte w zatwierdzeniu.
    • Z biegiem czasu nabrałem wprawy w przeglądaniu bloków różnic w kodzie konfiguracji. Łatwiej jest teraz dostrzec zbędne zmiany w widokach lub panelach, a szybki 10ddvim pozbywa się zmian w łatce (na przykład).
    • Myślę „Och, hej, nie zmieniłem niczego, co ma związek z polami, więc nie popełnię featurename.features.field_base.inc”.
  • Nigdy nie używaj git commit -a. To okropna praktyka, której należy powstrzymać od używania. Zawsze dodawaj i zatwierdzaj wyraźnie!
  • Posługiwać się git rebase w lokalnych oddziałach git, aby upewnić się, że funkcja jest najbardziej aktualna.
  • Strategia scalania git może również pomóc podczas faktycznego scalania:
    • git merge -s recursive -X patience (wymaga git 1.7+ iirc).

Na koniec rozważ dodanie ograniczeń socjalnych dla programistów, aby programista musiał przejrzeć swój kod przed połączeniem do linii głównej / stajni albo za pomocą przeglądu poprawek lub żądania ściągnięcia. Ludzie będą źli z powodu ograniczeń społecznych, ale powinni być źli na siebie, że nie sprawdzili swojego kodu.

mradcliffe
źródło
Lepsze niż generowanie pliku łatki jest użycie tylko git add -pdo zatwierdzenia określonych porcji.
donquixote