Überzeugen Sie einen einzelnen Entwickler, ein separates Build-Tool anstelle des IDE-One-Click-Builds zu verwenden

22

In meinen Jahren als Programmierer für Java und in jüngerer Zeit für Scala habe ich noch nie Ant, Maven, Gradle oder eines dieser Build-Tools für Java verwendet. Überall, wo ich gearbeitet habe, gab es einen Build-Manager, der sich darum kümmerte - ich kompilierte lokal mit der IDE für Entwicklung und Komponententests, checkte dann den Quellcode ein und benachrichtigte den Build-Manager, der tat, was nötig war Kompilieren Sie alle Dateien für die freigegebene Umgebung.

Jetzt, da ich zwischen Verträgen bin, arbeite ich an meinem eigenen selbst finanzierten Projekt und es ist an einem Punkt angelangt, an dem es gut genug sein könnte, um tatsächlich Geld zu verdienen. Ich habe sogar einen potenziellen Investor angestellt und plane, diesen in den nächsten Wochen eine Beta-Version zu präsentieren.

Aber die ganze Zeit klicke ich einfach auf den Build-Button in der IDE, und es erstellt die Jar-Datei und es funktioniert einwandfrei. Natürlich schlägt die konventionelle Weisheit vor, dass ich meine eigenen Ant / Maven / Gradle-Skripte schreiben und diese anstelle der IDE verwenden sollte, aber was sind die konkreten Vorteile davon in meiner Situation (alleine arbeiten)?

Ich habe etwas über die Verwendung dieser Build-Tools gelesen und es sieht so aus, als würde ich Hunderte von Zeilen XML (oder Groovy oder was auch immer) schreiben, um mit einem Klick das zu tun, was die IDE macht (die IDE-generierte) Ant XML für das Projekt besteht aus über 700 Zeilen. Es sieht einfach fehleranfällig und zeitaufwendig aus und ist für meine Situation unnötig. Ganz zu schweigen von der Lernkurve, die all die anderen Arbeiten, die ich mache, zeitraubend macht, um das Produkt für die Präsentation der Menschen vorzubereiten.

Gigatron
quelle
3
Während Sie sicherlich über die Möglichkeit nachdenken sollten, Ant / Maven / Gradle-Skripte zu verwenden, um den Erstellungsprozess zu handhaben. Es kann sicherlich bis zu einer späteren Phase Ihres Entwicklungszyklus warten. Komplizieren Sie die Sache nicht. Wenn Sie auf dem richtigen Weg sind, etwas herauszubringen, das verkauft werden kann, und einen Investor haben, und wenn es darüber hinausgeht, dann denken Sie darüber nach. Denn es wird bestimmt KEINE "Mach es einmal und vergiss es" Aufgabe sein. Sie müssen das Skript auf dem neuesten Stand halten, damit es Ihren Erstellungsprozeduren entspricht. Sorgen Sie sich um die Skripte, wenn Sie Hilfe haben.
Ramhound
5
Build-Tools werden von Vorteil, sobald Sie mehr als nur "die neueste Version mit dem neuesten Code" zur Verfügung haben. Sie sind noch nicht da - in dem Moment, in dem Sie es tun, zähmen Sie Ihren Build.
8
Wenn das, was Sie gerade tun, funktioniert und Ihnen keine Probleme bereitet, machen Sie einfach weiter. "Vorzeitige Korrektur" verursacht wahrscheinlich mehr Probleme als "Vorzeitige Optimierung". Außerdem benutzt Ihre IDE wahrscheinlich Ant under the cover.
James Anderson
1
Sehr gültige Frage
Madhur Ahuja

Antworten:

11

Ich würde vorschlagen, dass Sie Maven im Gegensatz zu Ant verwenden. Wenn Ihre IDE Ihr Projekt mit einem Klick erstellen kann, ist es wahrscheinlich, dass Maven Ihr Projekt auch praktisch ohne benutzerdefinierte Konfiguration erstellen kann.

Um die Frage zu beantworten, ist die Vereinfachung des Bereitstellungsprozesses ein konkretes Beispiel. Wenn Sie eine verteilbare Datei lokal erstellen, bedeutet dies, dass Sie diese verteilbare Datei manuell auf Ihrem Produktionssystem bereitstellen müssen, und dass Sie wahrscheinlich einige manuelle Konfigurationsschritte auf dem Produktionssystem durchführen mussten, um es für die Bereitstellung vorzubereiten (Installation von Tomcat) (möglicherweise oder Kopieren über Abhängigkeiten und Ressourcen, die für Ihre Anwendung erforderlich sind). Dies kann zeitaufwändig sein und die Bereitstellung von Updates zu einem mühsamen manuellen Vorgang machen. Außerdem können möglicherweise geringfügige Konfigurationsunterschiede zwischen Ihrer Produktionsplattform und Ihrer Entwicklungsumgebung zu undurchsichtigen und schwer auffindbaren Fehlern führen.

Um diese manuelle Plackerei loszuwerden, konfiguriere ich mein Projekt so, dass es mit Maven erstellt wird, und konfiguriere meine pom.xmlDatei mit allen erforderlichen Informationen, um (im Fall einer Java-Web-App) die zu finden und herunterzuladen Richtigen Sie die Version von Tomcat, installieren Sie sie lokal, richten Sie die richtigen Tomcat-Konfigurationsdateien ein, stellen Sie alle Projektabhängigkeiten und die Projekt-WAR-Datei selbst bereit und starten Sie dann Tomcat. Ich erstelle dann ein einfaches Shell-Skript (und auch eine .batVersion für Windows), das Maven verwendet, um den Server zu erstellen und zu starten:

mvn clean install cargo:start -Dcargo.maven.wait=true

Anstatt also eine implementierbare Umgebung in meine Entwicklungsumgebung zu packen und sie dann manuell in die Produktion hochzuladen, muss ich sie nur vom Versionskontrollsystem auf den Produktionsserver synchronisieren und dann das Produktionssystem selbst erstellen, installieren und ausführen das Deployment (und zwar auf eine Weise, die mit der Vorgehensweise auf jedem Entwicklungssystem identisch ist, wodurch die Möglichkeit plattformspezifischer Fehler oder Fehlkonfigurationen minimiert wird). Und ob in der Entwicklungs- oder Produktionsumgebung, alles, was ich tue, um den Server zu erstellen und zu starten, ist:

./startServer.sh #or startServer.bat for Windows

Um ein Update für die Produktionsumgebung bereitzustellen, müssen Sie lediglich folgende Schritte ausführen:

  1. Stoppen Sie gegebenenfalls die ausgeführte Serverinstanz.
  2. Rennen svn update -r<target_release_revision>.
  3. Rennen ./startServer.sh.

Es ist einfach, leicht zu merken und überhaupt nicht möglich, wenn ich mich darauf verlassen würde, meine IDE zu verwenden, um das Deployment für mich zu erstellen. Es macht auch das Zurücksetzen auf die zuletzt bekannte gute Bereitstellung zu einem Kinderspiel, falls jemals ein Rollback erforderlich sein sollte.

Ich kann nicht einmal zählen, wie viel Zeit mir dieser Ansatz beim manuellen Verwalten des Bereitstellungs- und Konfigurationsprozesses erspart hat.

Und natürlich ist eine andere Antwort auf Ihre Frage das automatische Abhängigkeitsmanagement, aber ich glaube, das wurde bereits von anderen Antworten abgedeckt.

aroth
quelle
1
Ich werde mit dem Ein-Klick-IDE-Build fortfahren, bis die erste Beta-Version fertig ist. Dann plane ich, Maven zu benutzen. Ant scheint mehr Arbeit zu schaffen, als es für meine Situation retten würde, aber Maven scheint geradlinig und mächtig genug zu sein, um es wert zu sein. Für mich ist es nicht nur eine Frage, ob das Build-Tool von Vorteil ist. Ich wäge auch die Kosten für das Erlernen, Einrichten und Warten ab.
Gigatron
7

Solange sich Ihr Code in der Quellcodeverwaltung befindet, ist die Verwendung der IDE zur Erstellung Ihrer verteilbaren Dateien in Ordnung.

Ist es für Sie als Ein-Mann-Shop besser, Ihrem Produkt neue Funktionen hinzuzufügen oder Build-Skripte zu schreiben? Etwas sagt mir, dass es keine Build-Skripte schreibt.

Nate
quelle
7
Ich bin 1000-mal anderer Meinung. Wenn Sie Ihre Build-Skripte richtig strukturieren, müssen Sie die Kosten für das Schreiben wirklich nur einmal bezahlen und können sie dann nahezu wörtlich für eine beliebige Anzahl von Projekten wiederverwenden. Es spricht viel für einen einzeiligen Build-Befehl, mit dem das System automatisch erstellt, konfiguriert, bereitgestellt und ausgeführt wird. Und wenn Sie das haben, wird es im Vergleich zum manuellen Bereitstellungs- / Konfigurationsmanagement eine Menge Zeit sparen , die dann für die von Ihnen erwähnten neuen Funktionen aufgewendet werden kann.
aroth
Ich würde zustimmen, dass ein Ein-Mann-Shop konzentriert werden muss. Ich bin jedoch anderer Meinung als Ihre Prämisse, da Build-Tools langfristig Zeit sparen würden, sowohl für neue Projekte als auch für die Pflege bestehender Projekte oder sogar für die Produktion von Liefergegenständen auf Anfrage für Kunden.
Haylem
Ein subtiler Vorteil von Maven ist, dass es mit einem Standardlayout von Dateien am besten funktioniert, im Gegensatz zu der Ad-hoc-Methode, die in Ant-Projekten häufig verwendet wird. Wenn die Benutzer den Vorteil der Verwendung der Maven-Standardeinstellungen erkennen, verwenden sie diese und ihre Projekte sind für zukünftige Betreuer leichter zu verstehen.
1
@aroth Aber OP verbringt überhaupt keine Zeit mit "manueller Bereitstellung / Konfigurationsverwaltung", er drückt nur einen Knopf in seiner IDE. Es würde also überhaupt keine Zeit sparen.
Atsby
1
Die IDE ist ein Build-System. Sonst würde ich es nicht benutzen.
Arne Evertsson
5

Klar, es ist schwieriger, die Vorteile zu erkennen, wenn Sie alleine arbeiten. Persönlich habe ich an vielen Solo-Projekten gearbeitet und würde nicht nur ein Build-Skript schreiben, sondern auch die Mühe machen, einen CI-Server (wie Jenkins) einzurichten.

Es gibt natürlich Overhead, warum sollte es sich lohnen?

  • Ein reproduzierbarer Build, der nicht an die IDE gebunden ist (oder an Ihren Computer, wenn Sie ihn extern ausführen). Wenn ein Build-Server es ausführt, können andere Computer es ausführen.
  • Der Spaß beginnt nach dem Bauen und Testen von Einheiten (übrigens: Bist du sicher, dass du vor jedem Commit testest? Ich vergesse es manchmal). Generieren Sie Dokumentation, erstellen Sie Installationsprogramme, führen Sie Ihre bevorzugten Codeanalyse-Tools aus.
  • Mit Ihrem bevorzugten CI-Server können Sie Diagramme zur Codeabdeckung, zu Fehlern bei Komponententests usw. im Laufe der Zeit anzeigen. Tut Ihre IDE das?

Für mein aktuelles Projekt erstellt das Skript statische Analysetools, komprimiert js / css, Komponententests und Pakete in ein Webarchiv. Jenkins führt es nach jedem Commit aus und stellt das Projekt auf einem Testserver bereit.

Ich die Zeit , um dies einzurichten nahm (die Build - Skript ist vielleicht 300 Zeilen durch die Art und Weise, haben es nicht in Monaten berührt) und es lohnt sich, auch für eine Person sagen. Für mehr als eine Person ist es notwendig. Meine Beteiligung am Build / Deployment-Prozess besteht aus den Befehlen "hg commit" und "hg push".

Kryptisch
quelle
Tatsächlich. Die eigentliche Sache, die dieser Entwickler berücksichtigen sollte, ist eine gute CI-Lösung, und ein Erstellungsskript kann helfen, sie dorthin zu bringen.
Bill Michell
4

Vorteile von Build-Tools

Es ist eine kurze Zusammenfassung, die nur die Spitze des Eisbergs zeigt, und Sie werden nicht unbedingt die Wichtigkeit all dessen bemerken, es sei denn, Sie müssen eine Kombination aus vielen Projekten, großen Projekten und mittleren bis großen Teams erstellen. Aber wenn Sie Vertrauen haben und es versuchen, werden Sie die Vorteile ernten .

Sie erleichtern Ihren Entwicklungslebenszyklus und ermöglichen Ihnen Folgendes:

  • organisieren und strukturieren Sie Ihre Projekte konsequent und mühelos
  • bewährte Verfahren projektübergreifend wiederverwenden und einfach und schnell in Angriff nehmen,
  • mehrere Projekte in einem Build integrieren,
  • automatisieren Sie Ihren kontinuierlichen Integrationsprozess ,
  • Teile dein Projekt mit anderen
    • ohne sie dazu zu zwingen, ein bestimmtes Toolkit oder eine bestimmte IDE (abgesehen vom Build-System) zu verwenden,
    • und ohne sie zu überraschen, da sie eine Standardversion erwarten
  • Automatisieren und erleichtern Sie die Wartung Ihres Produkts
  • Automatisieren Sie den Freigabeprozess Ihres Produkts

Wenn wir das auf Maven anwenden ...

Für diejenigen unter Ihnen in der Java-Welt, die Maven verwenden , haben Sie beim Lesen natürlich jeden Punkt mit Folgendem verknüpft:

  • Mavens strukturierte Projektkonvention
  • Maven-Archetypen
  • Realisierung eines Projekts aus SCM und Reaktorbauten
  • Jenkins / Hudson / Bamboo / andere Unterstützung + Mavens Unterstützung für Integrationstestpraktiken
  • m2eclipse, native IntelliJ- oder NetBeans-Unterstützung - oder mvnsh für die Befehlszeile
  • versions-maven-plugin
  • Maven-Release-Plugin, Build-Nummer-Maven-Plugin-Plugin und Versionen-Maven-Plugin

Und natürlich Maven (aber auch andere Werkzeuge als auch) gibt Ihnen Abhängigkeitsmanagement , und das ist eine große Zeit und Raum Schoner für Sie (einkalkuliert die Zahl der Menschen in Ihrem Team) und Ihr SCM.

Alles ist relativ:

Ich verwende Maven als Beispiel, weil ich denke, dass es das umfassendste und "batteriebetriebenste" Build-System ist, aber es bedeutet nicht, dass es unbedingt das "beste" ist. Es passt jedoch zu allen oben aufgelisteten Kontrollkästchen, und wenn ich nach einem guten Build-System suche, vergleiche ich es mit dieser Liste und Maven. Maven ist jedoch nicht immer sehr flexibel - es ist jedoch sehr erweiterbar - wenn Sie von Ihrem standardisierten Prozess abweichen. Es steigert Ihre Produktivität im Allgemeinen (einmal vor der Lernkurve), nicht wenn Sie dagegen ankämpfen.

Haylem
quelle
3

Hier sind meine 4 wichtigsten Gründe für die Verwendung von Build-Tools:

  • Abhängigkeitsbehandlung (Fehler vermeiden)
  • Testen (Ihre Änderung hat andere Module nicht beschädigt - viel einfacher zu testen)
  • sichere Commits
  • Einfachere Bereitstellung lokaler verteilbarer Dateien (in QA env hat niemand Zeit, darauf zu warten, dass der Builder Ihr Projekt und seine Abhängigkeiten erstellt)

quelle
1
Besonders die Behandlung von Abhängigkeiten. Ich bin zu faul, um externe Bibliotheken herunterzuladen und hinzuzufügen. Es ist viel einfacher, sie einfach als Abhängigkeit hinzuzufügen. "Falsche Version? Version in der Konfiguration ändern und neu erstellen!"
Ja, aber die Handhabung von Abhängigkeiten ist nicht wirklich eine Voraussetzung für alle Build-Tools. Maven, Gradle, Ivy unterstützen es. Ant, Make, etc ... nicht.
Haylem
2

In dem Buch Pragmatic Programmer sagen Andrew Hunt und David Thomas, dass 'checkout-build-test-deploy' ein einziger Befehl sein sollte (Kapitel: Pragmatic Projects). Sie schrieben..

Ich habe sogar einen potenziellen Investor angestellt und plane, diesen in den nächsten Wochen eine Beta-Version zu präsentieren

Dann bin ich sicher, dass Ihr Team wachsen wird. Umso wichtiger ist es, dass automatische Testbereitstellungsfähigkeiten durchgeführt werden.

Das große XML (Skript), das Sie gesehen haben, ist in der Regel eine einmalige Aufgabe. In den meisten Projekten können dieselben Skripte verwendet werden.

Es ist nicht klar, wie groß das Projekt ist. Wenn Ihre integrierten Tests / Abnahmetests viel CPU / Speicher beanspruchen, können Sie einen anderen Computer als Testserver verwenden. Sie können auch eine Vielzahl von Tools bereitstellen, um den Quellcode / Byte-Code zu analysieren .

Jayan
quelle
1

Ich würde argumentieren, dass es für einen Einzelentwickler weitaus wichtiger ist, über einen guten Prozess und eine gute Struktur wie bei Skript-Builds zu verfügen, als wenn Sie Mitglied eines Teams sind. Grund dafür ist, dass Sie keine Teamkollegen haben, die Sie anrufen, wenn Sie Kurven fahren. Ein CI-Server, auf dem Ihr Build-Skript ausgeführt wird, ist ein großartiger, kompromissloser Teamkollege, um Sie ehrlich zu halten.

Wyatt Barnett
quelle
genau was ich dachte! Ich arbeite gerade an einem Ort, an dem jeder Entwickler alleine an seinem eigenen Projekt arbeitet. Ich konnte ihnen die Idee eines Build-Systems noch nicht verkaufen, aber ich benutze es selbst, weil ich denke, dass es wirklich hilft.
Elias
0

Wenn Ihre Codebasis wächst, möchten Sie eine Testsuite hinzufügen. Ich habe die Erfahrung gemacht, dass dies eher früher als später erfolgen sollte und dass Ihr nächtlicher Build (oder was auch immer) jedes Mal alle Tests ausführen sollte. Fangen Sie klein an, das automatisch generierte XML ist wahrscheinlich in Ordnung. Wenn Sie Angst haben, etwas zu ändern, weil Sie befürchten, etwas anderes zu zerbrechen, ist dies ein guter Anreiz, ein paar Testfälle aufzuschreiben.

Tripleee
quelle
1
Ich mache bereits Unit-Tests ohne ein separates Build-Tool. Die IDE kann die Tests ausführen oder ich kann sie über die Befehlszeile ausführen.
0

Mit einem Build, der keine IDE ist, können Sie problemlos alte Versionen wiederherstellen, ohne sich Gedanken über die Neukonfiguration Ihrer IDE zu machen. Mit diesem Build können Sie den Build nicht interaktiv ausführen, um einen nächtlichen Build zu erstellen, den die Benutzer testen oder schnell herausfinden können Wenn Sie Tests abgebrochen haben, ohne sich daran erinnern zu müssen, sie auszuführen, und warten, bis sie abgeschlossen sind.

Sie können damit auch Builds in Umgebungen ohne grafische Benutzeroberfläche ausführen, z. B. auf einen Server übertragen, und Sie können IDEs wechseln, ohne befürchten zu müssen, dass Sie nicht mehr in der Lage sind, Ihre Software zu erstellen.

Einige Build-Tools unterstützen Sie bei der Automatisierung des Tagging und der Bereitstellung von Releases, enthalten angemessene Standardeinstellungen für die Erstellung von Berichten zur Codeabdeckung usw.

Wenn Sie weitere Personen hinzufügen, stellt ein Build-Tool sicher, dass Sie nicht für die schlechte IDE-Konfiguration einer anderen Person anfällig sind. Ich mache regelmäßig Screenshares, um die Eclipse-Installationen der Kollegen zu reparieren, da sie keine Build-Tools verwenden (arbeiten daran).

Der ultimative Grund ist jedoch, dass dies nicht manuell erfolgen muss, also nicht manuell. Alles andere fällt davon ab.

Ricky Clarkson
quelle