Bolzplatzarena

In die Schranken gewiesen

Mit der Menge an Applikationen und Bibliotheken in einem Unternehmen, sinkt mitunter die Übersichtlichkeit und damit auch die Gefahren. Eine der Gefahren ist es, dass Code benutzt wird, der an bestimmten Stellen nicht benutzt werden soll.

Zum Beispiel sollte Code aus deiner E2E Anwendung, nicht durch eine Bibliothek benutzt werden. Auch sollte eine Applikation nicht direkt eine andere Bibliothek benutzen.

Falls das doch passiert, spricht dies eher für eine schlechte Architektur und das sollte schleunigst aus der Welt geschafft werden, indem man beispielsweise den benutzten Code in eine Bibliothek auslagert und auch für die Nutzung optimiert. Andernfalls kann es später zu Problemen führen, weil der Code nicht korrekt gewartet wird, weil der Ersteller nie im Sinn hatte, dass dieser so genutzt wird.

Verhindern kann man dies, indem man seine Applikationen und Bibliotheken in die Schranken weist. Hier verwende ich die ESLint-Regel @nrwl/nx/enforce-module-boundaries. Mit dieser kann man unter anderem festlegen, welch Art von Code auf was zugreifen darf.
Zunächst muss man aber seine Applikationen und Bibliotheken geeignet kennzeichnen und nutzt dazu Tags in der nx.json:

"projects": {
"the-tower-defense": {
"tags": [
"app"
]
},
"the-tower-defense-e2e": {
"tags": [
"e2e"
],
"implicitDependencies": [
"the-tower-defense"
]
},
"core": {
"tags": [
"lib"
]
},
"logger": {
"tags": [
"lib"
]
}
}

Im Bereich "projects" kann man seinen Projekten die nötigen Tags vergeben. Ich habe hier ein einfaches Beispiel genommen und die Tags "app", "lib" und "e2e" verwendet. Nun konfiguriert man das ganze noch für ESLint:

"@nrwl/nx/enforce-module-boundaries": [
"error",
{
"enforceBuildableLibDependency": true,
"allow": [],
"depConstraints": [
{
"sourceTag": "app",
"onlyDependOnLibsWithTags": [
"lib"
]
},
{
"sourceTag": "lib",
"onlyDependOnLibsWithTags": [
"lib"
]
},
{
"sourceTag": "e2e",
"onlyDependOnLibsWithTags": [
"lib"
]
}
]
}
]

In dieser Konfiguration wurde festgelegt, dass nur Projekte, welche als "lib" gekennzeichnet sind, von anderen Projekten benutzt werden dürfen. Importiert man nun einfach Code in einer Applikation aus einer anderen Applikation, wird dies als Fehler angestrichen und der Lint schlägt fehl.