13 gru 2025·6 min czytania

Rozszerzanie eksportowanych backendów Go za pomocą bezpiecznego niestandardowego middleware

Rozszerzanie eksportowanych backendów Go bez utraty zmian: gdzie umieszczać niestandardowy kod, jak dodać middleware i endpointy oraz jak planować aktualizacje.

Rozszerzanie eksportowanych backendów Go za pomocą bezpiecznego niestandardowego middleware

Co idzie nie tak, gdy dostosowujesz eksportowany kod

Eksportowany kod to nie to samo, co ręcznie napisane repozytorium Go. W platformach takich jak AppMaster backend jest generowany z modelu wizualnego (schemat danych, procesy biznesowe, konfiguracja API). Przy ponownym eksporcie generator może przepisać duże fragmenty kodu, żeby dopasować je do zaktualizowanego modelu. To dobrze dla porządku, ale zmienia sposób, w jaki powinieneś dostosowywać projekt.

Najczęstszym błędem jest edytowanie wygenerowanych plików bezpośrednio. Działa raz, potem następny eksport nadpisuje zmiany albo tworzy brzydkie konflikty scalania. Co gorsza, drobne ręczne poprawki mogą po cichu złamać założenia generatora (kolejność tras, łańcuchy middleware, walidacja żądań). Aplikacja nadal się kompiluje, ale zachowanie się zmienia.

Bezpieczne dostosowanie oznacza, że twoje zmiany można powtórzyć i łatwo przejrzeć. Jeśli potrafisz ponownie wyeksportować backend, zastosować swoją warstwę niestandardową i wyraźnie zobaczyć, co się zmieniło, to jesteś na dobrej drodze. Jeśli każda aktualizacja przypomina wykopalisko, to nie jesteś.

Oto problemy, które zwykle pojawiają się, gdy dostosowania trafiają w złe miejsce:

  • Twoje poprawki znikają po re-eksporcie albo spędzasz godziny na rozwiązywaniu konfliktów.
  • Trasy przesuwają się i middleware nie działa tam, gdzie oczekujesz.
  • Logika dubluje się między modelem no-code a kodem Go, a potem się rozjeżdża.
  • „Jednolinijkowa zmiana” zamienia się w fork, którego nikt nie chce ruszać.

Prosta zasada pomaga zdecydować, gdzie trafia zmiana. Jeśli zmiana jest częścią zachowania biznesowego, które powinni móc modyfikować nietechniczni użytkownicy (pola, walidacja, workflowy, uprawnienia), umieść ją w modelu no-code. Jeśli to zachowanie infrastrukturalne (niestandardowa integracja auth, logowanie żądań, specjalne nagłówki, limity), umieść je w niestandardowej warstwie Go, która przetrwa re-eksporty.

Przykład: audyt logów dla każdego żądania zwykle jest middleware (kod niestandardowy). Nowe wymagane pole w zamówieniu zwykle to model danych (no-code). Trzymaj ten podział jasny, a aktualizacje będą przewidywalne.

Zmapuj repozytorium: części generowane vs twoje

Zanim rozszerzysz eksportowany backend, poświęć 20 minut na zmapowanie tego, co zostanie ponownie wygenerowane przy re-eksporcie, a co naprawdę należy do ciebie. Ta mapa sprawi, że aktualizacje będą nudne.

Kody generowane często zdradzają się samymi nagłówkami: komentarze typu "Code generated" lub "DO NOT EDIT", powtarzalne wzorce nazewnictwa i bardzo jednorodna struktura z niewieloma komentarzami pisanymi przez człowieka.

Praktyczny sposób klasyfikacji repozytorium to podział na trzy koszyki:

  • Generowane (tylko do odczytu): pliki z jasnymi znacznikami generatora, powtarzające się wzory lub foldery wyglądające jak szkielet frameworka.
  • Należące do ciebie: pakiety, które utworzyłeś, wrappery i konfiguracje, którymi zarządzasz.
  • Wspólne styki: punkty „okucia” przeznaczone do rejestracji (trasy, middleware, hooki), gdzie drobne zmiany mogą być konieczne, ale powinny pozostać minimalne.

Traktuj pierwszy koszyk jako tylko do odczytu nawet jeśli technicznie możesz go edytować. Jeśli go zmienisz, załóż, że generator nadpisze go później lub będziesz nosić ze sobą ciężar merge’ów na zawsze.

Uczyń tę granicę realną dla zespołu, zapisując krótką notatkę w repo (na przykład w README w katalogu głównym). Niech będzie prosta:

"Generator-owned files: anything with a DO NOT EDIT header and folders X/Y. Our code lives under internal/custom (or similar). Only touch wiring points A/B, and keep changes there small. Any wiring edit needs a comment explaining why it can't live in our own package."

Ta jedna notatka zapobiega szybkim poprawkom, które zamieniają się w trwały ból przy aktualizacjach.

Gdzie umieścić kod niestandardowy, by aktualizacje były proste

Najbezpieczniejsza zasada jest prosta: traktuj eksportowany kod jako tylko do odczytu i umieszczaj swoje zmiany w wyraźnie oznaczonym obszarze niestandardowym. Gdy ponownie wyeksportujesz (np. z AppMaster), chcesz, żeby merge polegał głównie na: „zastąp generowany kod, zachowaj kod niestandardowy”.

Stwórz oddzielny pakiet dla swoich dodatków. Może on mieszkać wewnątrz repozytorium, ale nie powinien być wymieszany z wygenerowanymi pakietami. Wygenerowany kod uruchamia rdzeń aplikacji; twój pakiet dodaje middleware, trasy i pomocniki.

Praktyczny układ:

  • internal/custom/ dla middleware, handlerów i małych helperów
  • internal/custom/routes.go do rejestracji niestandardowych tras w jednym miejscu
  • internal/custom/middleware/ dla logiki request/response
  • internal/custom/README.md z kilkoma zasadami dla przyszłych zmian

Unikaj edytowania wiringu serwera w pięciu różnych miejscach. Dąż do jednego cienkiego „punktu hakowego”, gdzie podczepisz middleware i zarejestrujesz dodatkowe trasy. Jeśli wygenerowany serwer udostępnia router lub łańcuch handlerów, podczep się tam. Jeśli nie, dodaj pojedynczy plik integracyjny blisko punktu wejściowego, który wywołuje coś w stylu custom.Register(router).

Pisz kod niestandardowy tak, jakbyś mógł go wstawić do zupełnie nowego eksportu jutro. Trzymaj zależności minimalne, unikaj kopiowania wygenerowanych typów kiedy to możliwe i używaj małych adapterów.

Krok po kroku: dodawanie niestandardowego middleware bezpiecznie

Celem jest umieszczenie logiki w twoim pakiecie i dotknięcie wygenerowanego kodu tylko w jednym miejscu, by ją podłączyć.

Po pierwsze, trzymaj middleware wąskie: logowanie żądań, prosty check auth, limitowanie, albo identyfikator żądania. Jeśli będzie robić trzy rzeczy naraz, w przyszłości zmienisz więcej plików.

Utwórz mały pakiet (np. internal/custom/middleware), który nie musi znać całej aplikacji. Trzymaj publiczny interfejs mały: jedna funkcja konstrukcyjna, która zwraca standardowy wrapper handlera Go.

package middleware

import "net/http"

func RequestID(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Add header, log, or attach to context here.
		next.ServeHTTP(w, r)
	})
}

Wybierz teraz jeden punkt integracji: miejsce, gdzie tworzy się router lub serwer HTTP. Zarejestruj tam swoje middleware jeden raz i unikaj rozrzucania zmian po poszczególnych trasach.

Trzymaj pętlę weryfikacji krótką:

  • Dodaj jeden skupiony test używając httptest, który sprawdza jedno zachowanie (kod statusu lub nagłówek).
  • Zrób jedno ręczne zapytanie i potwierdź zachowanie.
  • Sprawdź, że middleware zachowuje się sensownie przy błędach.
  • Dodaj krótki komentarz obok linii rejestracji wyjaśniający, dlaczego tam jest.

Mały diff, jeden punkt podłączenia, proste re-eksporty.

Krok po kroku: dodanie nowego endpointu bez forka wszystkiego

Eksportuj kod bez niespodzianek
Modeluj dane i procesy graficznie, a następnie eksportuj backend Go, który można bezpiecznie rozszerzać.
Wypróbuj AppMaster

Traktuj wygenerowany kod jako tylko do odczytu i dodaj endpoint w małym pakiecie niestandardowym, który aplikacja importuje. To utrzymuje aktualizacje w ryzach.

Zacznij od spisania kontraktu przed dotykaniem kodu. Co endpoint przyjmuje (parametry query, JSON body, nagłówki)? Co zwraca (kształt JSON)? Wybierz kody statusu na początku, żeby nie skończyć z „czymkolwiek, co działało”.

Utwórz handler w swoim pakiecie niestandardowym. Trzymaj go zwyczajnym: czytaj wejście, waliduj, wywołuj istniejące serwisy lub helpery bazy danych, zapisz odpowiedź.

Zarejestruj trasę w tym samym pojedynczym punkcie integracji, którego używasz dla middleware, nie wewnątrz wygenerowanych handlerów. Szukaj miejsca, gdzie router jest składany przy starcie i tam podczep swoje niestandardowe trasy. Jeśli projekt generowany już wspiera hooki użytkownika lub niestandardową rejestrację, użyj ich.

Krótka lista kontrolna utrzymuje zachowanie spójnym:

  • Waliduj wejścia wcześnie (pola wymagane, formaty, min/max).
  • Zwracaj spójny kształt błędu wszędzie (message, code, details).
  • Używaj timeoutów w kontekście tam, gdzie praca może się zawiesić (DB, wywołania sieciowe).
  • Loguj nieoczekiwane błędy raz, potem zwracaj czyste 500.
  • Dodaj mały test, który uderza w nową trasę i sprawdza status oraz JSON.

Potwierdź też, że router rejestruje endpoint dokładnie raz. Podwójna rejestracja to częsty problem po scaleniu.

Wzorce integracji, które trzymają zmiany w ryzach

Szybciej twórz narzędzia wewnętrzne
Szybko zbuduj narzędzie wewnętrzne lub panel administracyjny, a potem rozszerz je niestandardowym middleware w Go.
Start Free

Traktuj wygenerowany backend jak zależność. Preferuj kompozycję: wiąż funkcje wokół wygenerowanej aplikacji zamiast edytować jej rdzeń.

Faworyzuj konfigurację i kompozycję

Zanim zaczniesz pisać kod, sprawdź, czy zachowanie można dodać przez konfigurację, hooki lub standardową kompozycję. Middleware jest dobrym przykładem: dodaj je na krawędzi (router/HTTP stack), by dało się je usunąć lub zmienić kolejność bez dotykania logiki biznesowej.

Jeśli potrzebujesz nowego zachowania (rate limiting, audit logging, request IDs), trzymaj je w swoim pakiecie i rejestruj z jednego pliku integracyjnego. W przeglądzie kodu powinno być łatwo wytłumaczyć: „jeden nowy pakiet, jeden punkt rejestracji”.

Używaj adapterów, by nie przeciekały wygenerowane typy

Wygenerowane modele i DTO często się zmieniają między eksportami. Aby zmniejszyć ból aktualizacji, tłumacz na granicy:

  • Konwertuj wygenerowane typy żądań na własne wewnętrzne struktury.
  • Uruchamiaj logikę domenową tylko na swoich strukturach.
  • Konwertuj wyniki z powrotem do wygenerowanych typów odpowiedzi.

W ten sposób, jeśli wygenerowane typy się przesuną, kompilator wskaże jedno miejsce do aktualizacji.

Gdy naprawdę musisz dotknąć wygenerowanego kodu, izoluj to do pojedynczego pliku wiringowego. Unikaj edycji wielu wygenerowanych handlerów.

// internal/integrations/http.go
func RegisterCustom(r *mux.Router) {
    r.Use(RequestIDMiddleware)
    r.Use(AuditLogMiddleware)
}

Praktyczna zasada: jeśli nie potrafisz opisać zmiany w 2–3 zdaniach, prawdopodobnie jest za bardzo splątana.

Jak utrzymać diffs w ryzach na dłuższą metę

Celem jest, by re-eksport nie zmieniał się w tydzień walki z konfliktami. Trzymaj edycje małe, łatwe do znalezienia i łatwe do wytłumaczenia.

Używaj Gita od pierwszego dnia i trzymaj aktualizacje generowanego kodu oddzielnie od swojej pracy niestandardowej. Jeśli je pomieszasz, nie będziesz wiedzieć, co spowodowało błąd później.

Rutyna commitów, która pozostaje czytelna:

  • Jeden cel na commit ("Add request ID middleware", a nie "różne poprawki").
  • Nie mieszaj zmian formatowania z logicznymi.
  • Po każdym re-eksporcie commituj najpierw wygenerowane aktualizacje, potem swoje dostosowania.
  • Używaj wiadomości commit, które wspominają pakiet lub plik, który zmieniłeś.

Prowadź prosty CHANGELOG_CUSTOM.md (lub podobny) wymieniający każdą modyfikację, dlaczego istnieje i gdzie się znajduje. To szczególnie przydatne przy eksportach z AppMaster, ponieważ platforma może w pełni zregenerować kod i chcesz mieć szybką mapę tego, co trzeba ponownie zastosować lub zweryfikować.

Ogranicz hałas diffów dzięki spójnemu formatowaniu i regułom lint. Uruchamiaj gofmt przy każdym commicie i te same sprawdzenia w CI. Jeśli wygenerowany kod używa konkretnego stylu, nie "czyść" go ręcznie, chyba że jesteś gotów powtarzać tę czyszczenie po każdym re-eksporcie.

Jeśli zespół powtarza te same ręczne poprawki po każdym eksporcie, rozważ workflow z patchami: eksportuj, zastosuj patche (lub skrypt), uruchom testy, wypchnij.

Plan aktualizacji: re-eksport, scalanie i weryfikacja

Przejdź od eksportu do produkcji
Wdróż do AppMaster Cloud lub do własnej chmury po eksporcie i weryfikacji zmian.
Deploy App

Aktualizacje są najprostsze, gdy traktujesz backend jak coś, co można zregenerować, a nie jak kod, który będziesz utrzymywać ręcznie na zawsze. Cel jest prosty: re-eksportuj czysty kod, a potem za każdym razem ponownie zastosuj swoją niestandardową warstwę przez te same punkty integracji.

Wybierz rytm aktualizacji dopasowany do tolerancji ryzyka i częstotliwości zmian aplikacji:

  • Przy wydaniu platformy, jeśli potrzebujesz szybkich poprawek bezpieczeństwa lub nowych funkcji
  • Kwartalnie, jeśli aplikacja jest stabilna i zmiany są niewielkie
  • Tylko gdy trzeba, jeśli backend rzadko się zmienia, a zespół jest mały

Gdy nadejdzie czas na aktualizację, zrób suchy eksport na osobnym branchu. Zbuduj i uruchom nowo wyeksportowaną wersję samodzielnie najpierw, żeby wiedzieć, co się zmieniło zanim twoja warstwa niestandardowa znów wejdzie do gry.

Następnie ponownie zastosuj dostosowania przez zaplanowane styki (rejestracja middleware, grupa tras, twój pakiet custom). Unikaj chirurgicznych poprawek wewnątrz wygenerowanych plików. Jeśli zmiany nie da się wyrazić przez punkt integracji, to sygnał, żeby dodać nowy seam raz, a potem używać go zawsze.

Zwaliduj krótką listą regresji skupioną na zachowaniu:

  • Flow auth działa (logowanie, odświeżanie tokenu, logout)
  • 3–5 kluczowych endpointów API zwraca te same kody statusu i kształty
  • Po jednym "nieprzyjemnym" scenariuszu na endpoint (złe wejście, brak auth)
  • Zadania w tle lub cron joby nadal działają
  • Endpoint zdrowia/readiness zwraca OK w twoim setupie deployowym

Jeśli dodałeś middleware audytu, sprawdź, że logi nadal zawierają user ID i nazwę trasy dla jednej operacji zapisu po każdym re-eksporcie i scaleniu.

Typowe błędy, które utrudniają aktualizacje

Najszybsza droga do zepsucia następnego re-eksportu to edytowanie wygenerowanych plików „tylko tym razem”. Wydaje się to nieszkodliwe przy naprawie drobnego buga lub dodaniu checku nagłówka, ale po miesiącach nie będziesz pamiętać, co zmieniłeś, dlaczego ani czy generator dalej produkuje ten sam output.

Inną pułapką jest rozrzucenie kodu niestandardowego po całym repo: helper w jednym pakiecie, niestandardowy check auth w innym, tweak middleware blisko routingu i jednorazowy handler w losowym folderze. Nikt tego nie ma na pieczy, i każdy merge staje się polowaniem na skarby. Trzymaj zmiany w kilku oczywistych miejscach.

Silne powiązanie z wewnętrznościami generatora

Aktualizacje stają się bolesne, gdy twój kod zależy od wewnętrznych wygenerowanych struktur, prywatnych pól lub szczegółów układu pakietów. Nawet niewielkie refaktory w wygenerowanym kodzie mogą złamać build.

Bezpieczniejsze granice:

  • Używaj DTO request/response, które kontrolujesz dla niestandardowych endpointów.
  • Interakcjonuj z wygenerowanymi warstwami przez eksportowane interfejsy lub funkcje, nie przez wewnętrzne typy.
  • Podejmuj decyzje middleware na podstawie prymitywów HTTP (nagłówki, metoda, ścieżka) gdy to możliwe.

Pomijanie testów tam, gdzie są najbardziej potrzebne

Błędy w middleware i routingu zabierają czas, bo awarie mogą wyglądać jak losowe 401 lub "endpoint not found". Kilka skupionych testów oszczędzi godzin.

Realistyczny przykład: dodajesz middleware audytu, które czyta body żądania do logu, i nagle niektóre endpointy otrzymują puste body. Mały test, który wysyła POST przez router i sprawdza zarówno side-effect audytu, jak i zachowanie handlera, wykryje tę regresję i da pewność po re-eksporcie.

Szybka lista przed wydaniem

Umieszczaj reguły biznesowe w modelu
Używaj narzędzi wizualnych do pól, walidacji i uprawnień, żeby zasady biznesowe nie odpływały.
Rozpocznij

Zanim wypuścisz zmiany niestandardowe, zrób szybki przegląd, który ochroni cię przy następnym re-eksporcie. Powinieneś dokładnie wiedzieć, co ponownie zastosować, gdzie to leży i jak to zweryfikować.

  • Trzymaj cały kod niestandardowy w jednym wyraźnie nazwanym pakiecie lub folderze (np. internal/custom/).
  • Ogranicz punkty styku z wiringiem generowanym do jednego lub dwóch plików. Traktuj je jak mosty: rejestruj trasy raz, rejestruj middleware raz.
  • Udokumentuj kolejność middleware i powód takiego ustawienia ("Auth before rate limiting" i dlaczego).
  • Upewnij się, że każdy niestandardowy endpoint ma przynajmniej jeden test potwierdzający działanie.
  • Napisz powtarzalną procedurę aktualizacji: re-eksport, ponowne zastosowanie warstwy niestandardowej, uruchomienie testów, deploy.

Jeśli zrobisz tylko jedną rzecz, zostaw notatkę upgrade. Zmienia "wydaje mi się, że jest ok" w "możemy udowodnić, że działa".

Przykład: dodanie audytu i endpointu health

Wysyłaj niestandardowe endpointy czysto
Zaprojektuj prototyp endpointu w AppMaster, a potem dołącz mały handler tam, gdzie należy.
Wypróbuj teraz

Powiedzmy, że wyeksportowałeś backend Go (na przykład z AppMaster) i chcesz dodać dwie rzeczy: identyfikator żądania plus audyt logowania dla działań administratora oraz prosty endpoint /health dla monitoringu. Celem jest, by zmiany były łatwe do ponownego zastosowania po re-eksporcie.

Dla audytu umieść kod w jasno oznaczonym miejscu, np. internal/custom/middleware/. Stwórz middleware, które (1) odczytuje X-Request-Id albo generuje go, (2) zapisuje go w kontekście żądania, i (3) loguje krótką linię audytu dla ścieżek admin (metoda, ścieżka, user ID jeśli dostępny, i rezultat). Trzymaj to jako jedną linię na żądanie i unikaj wyrzucania dużych payloadów.

Podczep to na krawędzi, blisko miejsca rejestracji tras. Jeśli wygenerowany router ma jeden plik setupu, dodaj tam mały hook, który importuje twoje middleware i stosuje je tylko do grupy admin.

Dla /health dodaj niewielki handler w internal/custom/handlers/health.go. Zwróć 200 OK z krótkim body takim jak ok. Nie dodawaj auth, chyba że twoje monitory tego potrzebują — jeśli tak, udokumentuj to.

Aby utrzymać zmianę łatwą do ponownego zastosowania, strukturyzuj commity tak:

  • Commit 1: Dodaj internal/custom/middleware/audit.go i testy
  • Commit 2: Podczep middleware do tras admin (najmniejszy możliwy diff)
  • Commit 3: Dodaj internal/custom/handlers/health.go i zarejestruj /health

Po aktualizacji lub re-eksporcie zweryfikuj podstawy: trasy admin nadal wymagają auth, identyfikatory żądań pojawiają się w admin logach, /health odpowiada szybko, a middleware nie dodaje zauważalnego opóźnienia przy lekkim obciążeniu.

Następne kroki: ustal workflow dostosowań, który dasz radę utrzymać

Traktuj każdy eksport jak świeże zbudowanie, które możesz powtórzyć. Twój kod niestandardowy powinien być postrzegany jako warstwa dodatku, a nie przepisywanie.

Zdecyduj, co należy do kodu, a co do modelu no-code następnym razem. Reguły biznesowe, kształty danych i standardowa logika CRUD zwykle należą do modelu. Integracje jednorazowe i firmowe middleware zwykle należą do kodu niestandardowego.

Jeśli używasz AppMaster (appmaster.io), zaprojektuj pracę niestandardową jako czystą warstwę rozszerzeń wokół wygenerowanego backendu Go: trzymaj middleware, trasy i helpery w małym zestawie folderów, które możesz przenieść przez re-eksporty, i nie dotykaj plików należących do generatora.

Praktyczny końcowy test: jeśli współpracownik może re-eksportować, zastosować twoje kroki i uzyskać ten sam rezultat w mniej niż godzinę, twój workflow nadaje się do utrzymania.

FAQ

Can I just edit the exported Go files directly?

Nie edytuj plików należących do generatora. Umieść zmiany w wyraźnie oznaczonym pakiecie (na przykład internal/custom/) i podłącz je przez mały punkt integracji blisko startu serwera. W ten sposób re-eksport w większości zastąpi wygenerowany kod, a twoja warstwa niestandardowa pozostanie nienaruszona.

How do I tell which parts of the exported repo will be regenerated?

Zakładaj, że wszystko oznaczone komentarzami typu “Code generated” lub “DO NOT EDIT” zostanie nadpisane. Zwracaj też uwagę na bardzo jednorodną strukturę folderów, powtarzalne nazewnictwo i brak komentarzy — to typowe ślady generatora. Najbezpieczniejsza zasada to traktować takie pliki jako tylko do odczytu, nawet jeśli po modyfikacji kompilują się poprawnie.

What does a good “single integration point” look like?

Miej jeden plik–hak, który importuje twój pakiet niestandardowy i rejestruje wszystko: middleware, dodatkowe trasy i drobne powiązania. Jeśli dotykasz pięciu plików z routingiem lub wielu wygenerowanych handlerów, idziesz w stronę forka, który będzie trudny do aktualizacji.

How do I add custom middleware without breaking upgrades?

Napisz middleware w własnym pakiecie i trzymaj je wąskie: identyfikatory żądań, audyt, limitowanie, specjalne nagłówki. Następnie zarejestruj je raz, przy tworzeniu routera lub stosu HTTP, a nie per-route wewnątrz wygenerowanych handlerów. Krótki test z użyciem httptest, sprawdzający oczekiwany nagłówek lub kod statusu, zwykle wystarcza, by złapać regresje po re-eksporcie.

How can I add a new endpoint without forking the generated backend?

Najpierw określ kontrakt endpointu, potem zaimplementuj handler w pakiecie niestandardowym i zarejestruj trasę w tym samym punkcie integracji, którego używasz dla middleware. Trzymaj handler prosty: waliduj wejście, wywołuj istniejące serwisy, zwracaj spójny kształt błędu i unikaj kopiowania logiki z wygenerowanych handlerów. To sprawia, że zmiana jest przenośna do świeżego eksportu.

Why do routes and middleware order change after a re-export?

Kolejność tras może się zmieniać, gdy generator zmienia sposób rejestracji tras, grupowania lub łańcuchy middleware. Aby się zabezpieczyć, polegaj na stabilnym punkcie rejestracji i dokumentuj kolejność middleware tuż obok linii rejestracji. Jeśli kolejność ma znaczenie (np. auth przed audytem), zakoduj to świadomie i zweryfikuj za pomocą krótkiego testu.

How do I avoid duplicating logic between the no-code model and custom Go code?

Jeśli tę samą regułę implementujesz w obu miejscach, będą one się rozjeżdżać i otrzymasz sprzeczne zachowania. Umieść reguły biznesowe, które powinni móc modyfikować nietechniczni użytkownicy (pola, walidacja, workflowy, uprawnienia) w no-code, a kwestie infrastrukturalne (logowanie, integracja auth, limity) w warstwie niestandardowej w Go. Podział powinien być jasny dla osoby przeglądającej repozytorium.

How do I stop my custom code from depending on generated internal types?

DTO i wewnętrzne struktury generowane przez generator mogą się zmieniać wraz z eksportami, więc odizoluj ten churn na granicy. Konwertuj wejścia do własnych struktur wewnętrznych, wykonuj logikę domenową na nich, a na krawędzi konwertuj wyniki z powrotem. Gdy typy się zmienią po re-eksporcie, aktualizujesz jedno miejsce zamiast ścigać błędy kompilacji po całej warstwie niestandardowej.

What’s the best Git workflow for re-exports and customizations?

Oddziel aktualizacje generowanego kodu od swojej pracy w Git, żeby widzieć, co się zmieniło i dlaczego. Praktyczny flow: najpierw commit z re-eksportem wygenerowanych plików, potem commit minimalnych powiązań i dostosowań w warstwie niestandardowej. Krótki changelog niestandardowy, mówiący co i gdzie dodałeś, bardzo przyspiesza kolejne aktualizacje.

How should I plan upgrades so re-exports don’t turn into days of conflicts?

Zrób próbny re-eksport na osobnym branchu, zbuduj go i uruchom krótką regresję przed scaleniem warstwy niestandardowej. Potem ponownie zastosuj dostosowania przez te same punkty integracji, uruchom testy i wdroż. Jeśli coś nie da się wyrazić przez istniejący punkt integracji, dodaj raz nowy seam i używaj go dalej.

Łatwy do uruchomienia
Stworzyć coś niesamowitego

Eksperymentuj z AppMaster z darmowym planem.
Kiedy będziesz gotowy, możesz wybrać odpowiednią subskrypcję.

Rozpocznij