window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Ruby on Rails Modularisering med Packwerk Avsnitt II - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2022-01-10
Utveckling av programvara

Ruby on Rails-modularisering med Packwerk Episode II

Nicolas Nisoria

I det andra avsnittet av vår Ruby on Rails-modularisering med Packwerk kommer vi att titta närmare på konceptet med applikation som ett paket.

Ansökan som ett paket

Tillvägagångssättet för att modularisera vår applikation består i att konvertera hela applikationen till ett paket.

Skapa strukturen

Först måste vi skapa app/paket mappen där vi kommer att placera alla våra paket. För att kunna isolera våra paket måste vi separera varje MVC-konceptet i en och samma mapp. Genom att ta KodTriage projekt som exempel kommer vi att ha något som liknar följande bild.

paketets struktur

Om vi försöker köra servern kommer den inte att hitta konstanterna. Det är därför vi måste lägga till en konfigurationsrad i vår applikation.rb

config.paths.add 'app/packages', glob: '*/{*,*/concerns}', eager_load:true

Nu fungerar programmet, men det kan inte hitta vyerna, så vi måste lägga till ytterligare en konfigurationsrad i vår applikation_controller.rb

append_view_path(Dir.glob(Rails.root.join('app/packages/*/views')))

Skapa paketen

Vår struktur är klar, så nu kan vi börja skapa paketen. För att göra det behöver vi bara lägga till enpaket.yml till varje mapp med följande konfiguration:

enforce_privacy: false
enforce_dependencies: true

paket.yml

genomdriva_integritetger oss möjlighet att isolera alla konstanter i paketet och arbeta med ett offentligt API. För att exponera de offentliga konstanterna måste vi lägga till konstanterna i till exempel paket/användare/app/public.För närvarande ska vi ställa in denna konfiguration till falska.

genomdriva_beroenden kommer att genomdriva beroendet av ett paket och kontrollera alla konstanta referenser. Om ett beroende inte är explicit definierat kommer det att utgöra en överträdelse av gränsen.

Validering av paketsystemet

Packwerk fastställt ett kriterium som vi måste följa för att ha ett giltigt paketsystem. Vi kan börja köra packwerk giltig i vår konsol.

 Detta kommer att kontrollera vår mappstruktur, paketkonfigurationoch autoload sökvägscache.

Just nu är vår ansökan inte giltig och vi måste åtgärda lastvägarna ipackwerk.yml. För att göra detta behöver vi bara lägga till de saknade vägarna.

# packwerk.yml

ladda_vägar:
.
.
.

# Användare
- app/packages/användare/styrenheter
- app/packages/användare/modeller
- app/packages/användare/package.yml
- app/paket/användare/visningar

Nu är vi redo att kontrollera gränsöverträdelser i vår applikation. För att kontrollera överträdelser kan vi körapackwerk uppdatering-avvecklingar kommer detta kommando att generera avskrivna_referenser.yml fil för varje paket. I varje fil hittar vi paketnamn, typ av överträdelse och filsökväg. Med all denna information vet vi var överträdelsen sker och vi kan fatta ett beslut om att lösa den.

avskrivna_referenser.yml
# avskrivna_referenser.yml

.
.
.

app/packages/repos:
  "::Repo":
    överträdelser:
    - Beroende
    filer:
    - app/packages/users/models/user.rb

I exemplet kommer vi att beskriva varje del av den information som genereras
av Packwerk.

– app/paket/repos  - paket där den konstanta överträdelsen är
hittade.

– ::Repo  - sökväg till filen som innehåller den kränkta konstanten.

– Beroende  - en typ av kränkning, antingen beroende eller integritet.

– app/packages/users/models/user.rb  - sökväg till filen som innehåller den kränkta konstanten.

Som ett sista steg i detta avsnitt, glöm inte att lägga till de nya genererade filsökvägarna i packwerk.yml och kör valideringarna igen.

Visualisering av beroenden

Med all information i package.yml och avskrivna_referenser.ymlkan vi sedan
visualisera en graf över beroenden. För att göra det måste vi lägga till en annan gem, i det här fallet kommer vi att använda Pocky.

Löpande räfsa pocky:generera kommer vi att generera en fil som heter packwerk.png där vi kan visualisera vår första graf över beroenden.

Med alla paket definierade kommer vår graf att se ut så här.

graf utan accepterade beroenden

beroenden redan finns, men det betyder inte att de accepteras av Packwerk. Till
acceptera ett beroende måste vi lägga till beroendekonfigurationen i paket.yml
i varje paket. Vi kommer att fokusera på post_byggare eftersom det är ett paket utan cirkulära beroenden. Det är värt att nämna att Packwerk låter oss inte acceptera cirkulära beroenden.

# app/packages/mail_builders/package.yml

```ruby
enforce_privacy: false
enforce_dependencies: true
Beroenden:
- app/packages/docs
- app/packages/frågor
- app/packages/repos

När du har lagt till den här konfigurationen, Pocky kommer att färga de accepterade beroendena med grönt.

graf med accepterade beroenden

Vi kan radera avskrivna_referenser.yml från app/packages/mail_builders och kör
packwerk uppdatering-avvecklingar igen. Filen kommer inte att genereras igen eftersom alla
överträdelser åtgärdades för detta paket. Det är viktigt att nämna att även om vi inte Graph med accepterade beroenden

Ruby on Rails-modularisering med Packwerk vår applikation kommer fortfarande att fungera som tidigare, men nu har vi fler
information för att fatta beslut och omarbeta.

Ta bort cirkulära beroenden

I vår tidigare graf hade vi en hel del cirkulära beroenden som behövde lösas på något sätt. Vi har olika strategier för att göra det:

- Gör ingenting,

- Acceptera beroenden, Sammanfoga paket,

- Flytta kod mellan förpackningarna,

- Duplicera en funktionalitet, 

- Utför beroendeinjektion eller beroendeinjektion med typning.

Ett problem här är att för att kunna göra en ordentlig refaktorisering måste vi känna till kodbasen. Jag är inte så bekant med kodbasen i det här projektet eftersom jag tog det som ett exempel, så av praktiska skäl kommer vi att gå med den första strategin, gör ingenting. Även om vi kommer att undvika det mesta av refaktoriseringen vill vi arbeta med beroendena i rot paket.

Rotpaketet innehåller allt lim från Rails ramverkAlla klasser som vi ärver från och får alla att fungera tillsammans. Så för att lösa de cirkulära beroendena kommer vi att skapa ett nytt paket som heter rails inom följande steg:

  1. Flytta alla application_-filer och mappar från appen till app/paket/rails.
  2. Skapa enpaket.yml för paketet med samma konfiguration som de tidigare paketen.
  3. Lägg till alla nya filsökvägar i packwerk.yml.
  4. Lägg till app/paket/rails som ett beroende av resten av paketen.

När vi väl har skapat paketet kommer vi att märka att det finns en hel del filer som kan struktureras om. Efter att ha flyttat allt till motsvarande paket och accepterat
beroenden får vi en ny struktur och en renare graf.

Paketstruktur med rälspaket
Graf utan cirkulära beroenden vid roten

Ta bort beroenden från rotpaketet

Nu ser vår graf mycket bättre ut, och det vore bra om vi kunde ta bort alla beroenden från rotpaketet. Om vi kontrollerar deprecated_references.yml i rotpaketet kommer vi att märka att de flesta av dem är från test , lib/arbetsuppgifter , db och konfiguration
mapp. För att lösa dessa beroenden kommer vi att skapa en testmapp i varje paket. Att ha något i stil med app/packages/användare/test. Därefter kommer vi att utesluta lib/arbetsuppgifter , db och konfigurationbland andra mappar från Packwerk eftersom dessa beroenden inte är särskilt viktiga i vår analys och vi inte har något enkelt sätt att lösa dem. Vi kommer att lägga till följande i vår packwerk.yml.

exkludera:
- "{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}/**/*"
- "lib/tasks/**/*.rake"

När vi har flyttat alla tester från rotpaketet och uteslutit mapparna från analysen får vi en ny graf utan rotberoenden.

Graf utan rotberoenden

Som vi kan se har vi fortfarande cirkulära beroenden ianvändare , Repos , och Dokument . Även om vi inte löste dem har vi viktig information att förmedla nu. Vi vet att varje Team som gör ändringar i ett av dessa paket kommer förmodligen att behöva göra ändringar i de paket som har det cirkulära beroendet. Å andra sidan vet vi att ett team kan arbeta med github_fetchers enbart, att veta vilka paket som är
att påverkas av förändringarna i varje ögonblick.

Du kan hitta slutresultatet av projektet här.

Nästa steg

Som ett nästa steg kan du genomdriva konstant sekretess i varje paket och endast exponera det offentliga API som kommer att vara tillgängligt från andra paket. Du kan enkelt konfigurera var ditt API ska placeras i paket.yml.

genomdriva_integritet: sant
enforce_dependencies: true
public_path: min/custom/path/

Slutsatser

Packwerk ger oss mycket information om vår applikation och med den informationen kan vi fatta beslut för att förbättra arbetsflödet för våra team. Även om processen verkade vara lång och med många konfigurationer, behöver det inte alltid vara så. Vi kan börja med att skapa paket endast för den nya kod som läggs till i vår applikation och sedan modularisera gradvis. Så nu kan vi börja prata om gradvis modularisering, det här är ett koncept som introducerades av Stephan Hagemann "Vi kan för första gången bestämma oss för att börja modularisera en del av koden på ett ambitiöst sätt ... Detta gör att vi kan skapa ett gradvis expanderande stödsystem mot en bättre applikationsstruktur".

Källor

  1. Gradvis modularisering för Ruby on Rails - Stephan Hagemann
  2. Genomdriva modularitet i Rails-appar med Packwerk
  3. Packwerk Github
  4. Källkod för artikeln
Konsultation inom digital produktutveckling

Läs mer om

GraphQL Ruby. Hur är det med prestanda?

Räls och andra transportmedel

Rails-utveckling med TMUX, Vim, Fzf + Ripgrep

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokala tekniknav

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

    sv_SESwedish
    en_USEnglish de_DEGerman da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek sv_SESwedish