
Ich habe eine grundsätzliche Frage zur Verwaltung eines Git-Projektes mit mehreren Komponenten. Das Projekt, auf das ich mich beziehe, hat folgende Struktur:
project-name
├── cli
├── api
├── webapp
├── docker-compose.yaml
├── README.md
├── LICENCE
Mein Ziel ist eine Struktur, die Wartbarkeit und Code-Wiederverwendung priorisiert. Die Kernfunktionen sind also alle in eine Befehlszeilenschnittstelle (CLI) in Python integriert. Ich baue auch eine Rest-API und das Ziel ist, dass sie die CLI im Hintergrund verwendet, damit der Code nicht neu geschrieben werden muss.
Meine erste Frage ist:Ist das ein guter Ansatz? Ich habe viele CLIs verwendet, die auf APIs basieren (entgegengesetzt zu meinem Ansatz), beispielsweise für AWS. Und ich habe auch APIs verwendet, die auf CLIs basieren, beispielsweise ffmpeg. Daher bin ich mir nicht sicher, ob es in meinem Fall Sinn macht, den oben beschriebenen Weg zu gehen.
Um nun die API und die CLI zu verknüpfen, fallen mir zwei Ansätze ein und ich weiß nicht, welcher der geeignetste ist.
- Ansatz A: Rufen Sie die CLI direkt von der API aus auf, indem Sie einen relativen Pfad innerhalb des Projekts verwenden. Das würde aber bedeuten, dass die CLI immer mit der API ausgeliefert werden müsste?
- Ansatz B: Erstellen Sie die CLI separat in einem Python-Paket und veröffentlichen Sie es in einem Repository. Verwenden Sie es dann als Anforderung in der API. Das sieht für mich „sauberer“ aus, bedeutet aber, dass ich die Verbesserungen, die ich in der CLI vornehme, nicht sofort sehen werde, da ich das Paket erneut erstellen und veröffentlichen muss.
Meine zweite Frage ist:Welcher Ansatz ist der richtige Weg, um in der API auf die CLI zu verweisen? (Oder gibt es andere Möglichkeiten?)
Dank im Voraus!
Antwort1
Nein, hier gibt es zahlreiche Probleme:
- Die API sollte keine CLI verwenden. Die CLI sollte eine API verwenden.
- Obwohl Sie eine CLI/App/WebApp in einem Repo unterbringen können, gilt dies als schlechtes Design: Es wird als"monorepo". Normalerweise möchten Sie drei verschiedene Repos, bei denen sowohl die Webanwendung als auch die CLI die API aufrufen. Das ist auch besser, weil ein Dockerfile kaum Sinn ergibt – verpacken Sie eine CLI oder eine Webanwendung? Ich würde erwarten, dass sowohl in der CLI als auch in der Webanwendung ein Dockerfile vorhanden ist.
- Der Vorteil der Verwendung von Mikrorepos gegenüber einem Monorepo liegt hauptsächlich in den Tools. Die Tools bieten für diese Dinge eine viel bessere Unterstützung.
- Die Verwendung eines Microrepo erzwingt, dass Ihre CLI und Webanwendung getrennt von der API versioniert werden. Dies ist immer wünschenswert. Sie können beispielsweise zwei Versionen der Webanwendung oder der CLI entwickeln und gleichzeitig zwei verschiedene Versionen der API verwenden. Das Einbinden Ihrer API aus der CLI und der Webanwendung funktioniert wie jede andere erforderliche externe Abhängigkeit.