Gemeinsame Lisp-Quellcodeorganisation

7

Ich bin neu in CL und benutze AllegroCL. Ich versuche herauszufinden, wie ich meinen Quellcode so organisieren kann, dass er die folgenden Anforderungen erfüllt:

  1. Ich möchte verhindern, dass der src-Code meine Testsuiten enthält.
  2. Ich möchte Projektabhängigkeiten (sowohl src als auch Test-Deps) auf portable Weise deklarieren, so dass andere Mitglieder in meinem Team ihre Systeme nicht ändern müssen.
  3. Ich möchte die kontinuierliche Integration beim Check-in vereinfachen, einschließlich Builds und Tests.

Ich habe versucht, ASDF kreativ zu nutzen, um diese Anforderungen zu erfüllen, und ich kann es nicht richtig machen. Wie gehen andere Menschen mit diesem Problem um? Sind diese 2 Anforderungen nicht "Lispy"?

    
alyssackwan 15.08.2012, 15:01
quelle

5 Antworten

5

Verwenden Sie ASDF oder verwenden Sie das Allegro CL defsystem Tool.

  1. mache sie zu zwei verschiedenen Systemen. Das Testsuite-System hängt vom Softwaresystem ab.
  2. Verwenden Sie relative Pfadnamen, berechnen Sie absolute Pfadnamen basierend auf dem Speicherort der Systemdefinitionsdatei oder verwenden Sie logische Pfadnamen (die Pfadnamen in CL sind, die nach Regeln neu zugeordnet werden können).
  3. Wahrscheinlich gibt es ein Continuous Integration Tool für Common Lisp, aber ich habe noch keins benutzt. Eine defsystem Beschreibung zu haben ist ein guter Anfang.
Rainer Joswig 15.08.2012, 16:02
quelle
5

Ich benutze quicklisp, das einen "quicklisp" -Ordner in deinem Home-Ordner erstellt, in dem ein "local-project" -Ordner gefunden werden kann. Dieser enthält eine TXT-Datei, in die Sie die URIs in die .ASD-Dateien einfügen können.

Wie man dieses Dienstprogramm benutzt:

  • Erstellen Sie "project.asd" und "project-test.asd" im Projektordner

project.asd (verwaltet die Includes für den reinen Projektcode)

%Vor%

project-test.asd (verwaltet die Includes für den Testcode)

%Vor%
  • fügen Sie nun die URIs für diese Dateien in die oben genannte local-projects.txt

  • ein
  • Programm parallel zur Projektquelle in & lt; Dateinamen & gt; .lisp Dateien und die Testaufrufe in & lt; filename & gt; -test.lisp-Dateien (die * -test.lisp-Dateien müssen einen test-execute-Aufruf enthalten)

  • Starten Sie Ihre sbcl oder was auch immer Sie verwenden und verwenden Sie (ql:quickload "project-name") oder (ql:quickload "project-name-test") abhängig, wenn Sie nur ein Projekt laden oder testen möchten.

Das einzige, was Sie sonst irgendwo portieren müssen, ist, die local-projects.txt auf den Computer zu schreiben, auf den das Projekt kopiert wird. Danach können sich Ihre Kollegen darauf verlassen, dass sie asdf-Dateien verwenden und sie in jedem anderen Projekt, das sie wollen, schnell laden können. Zum Kopieren des Projektordners können Sie entweder ctr + c / v oder etwas komplizierteres als git verwenden.

Zum Testen habe ich meine eigene kleine Test-Suite programmiert, aber ich wette, es gibt gute da draußen. Weitere Informationen zu quicklisp finden Sie hier und über asdf hier . Vielleicht kann diese Frage Ihnen helfen Wenn Sie nicht weiterkommen, konfigurieren Sie Quicklisp.

    
Sim 16.08.2012 09:56
quelle
5

Wenn Quicklisp installiert ist, können Sie die integrierte Funktion Quickproject verwenden.

%Vor%

Dies erstellt 4 Dateien:

  • package.lisp
  • swatchblade.lisp
  • swatchblade.asd
  • README.txt

package.lisp definiert Paket-Namespaces:

%Vor%

swatchblade.asd definiert das System / Projekt, Quellcodedateien, Abhängigkeiten usw.

%Vor%

swatchblade.lisp ist, wo der Quellcode geht.

Sie können das Projekt über Quicklisp Quickload laden:

%Vor%

Wenn Sie dann ein anderes Projekt erstellen, das vom swatchblade-System abhängig ist:

%Vor%

Betreffend Tests können Sie einen weiteren Namespace in package.lisp für Ihre Tests hinzufügen:

%Vor%

Erstellen Sie eine Testdatei, schreiben Sie den Code und fügen Sie die Datei der Systemdefinition hinzu:

%Vor%

Laden Sie den swatchblade-tests -Namespace, um die Tests auszuführen.

Beispielprojekt mit Tests hier

Wenn Sie vermeiden möchten, dass Quicklisp alle Abhängigkeiten in das System installiert, müssen Sie die Abhängigkeiten installieren und das System, soweit ich weiß, manuell laden.

Der Autor von Quicklisp, Zach Beane, hat einen ausführlicheren Beitrag auf mit quickproject .

    
momo 20.08.2012 13:06
quelle
4

Nach dem Vorschlag von Rainer schlage ich vor, dass Sie die ASDF-Systemdefinition verwenden, um zwei Systeme zu definieren, Ihr Hauptsystem foo und das Nebensystem foo-tests .

Fügen Sie in der Definition des foo -Systems eine Spezifikation hinzu, die in-order-to die test-op auf der foo angibt, Sie müssen test-op ausführen foo-Tests . Dies stellt sicher, dass, wenn Sie (asdf:test-system "foo") ausführen, das entsprechende Testsystem mit seinen Abhängigkeiten geladen wird und dann ASDF den Test-op ausführt.

Ich finde, dass FiveAM eine geeignete Bibliothek für den Aufbau von Tests ist.

Das obige wird alles geladen, aber jetzt müssen Sie sicherstellen, dass die test-op on foo-Tests tatsächlich die Tests ausführt! Dazu müssen Sie eine Methode für PERFORM für TEST-OP und (eql (find-system "foo-tests")) hinzufügen. Diese PERFORM -Methode sollte alle von Ihnen definierten FiveAM-Tests aufrufen und entweder erfolgreich sein oder einen Fehler auslösen, wenn die Tests fehlschlagen.

Ich habe ein FiveAM-Tester Add-On für ASDF gemacht. Ich werde versuchen, es öffentlich zugänglich zu machen.

    
Robert P. Goldman 16.08.2012 18:54
quelle
1

WICHTIG

Der obige Hinweis ist gut, aber Sie werden frustriert sein, wenn Sie versuchen, nicht exportierte Dinge zu testen. Ein einfacher Workaround besteht nicht darin, zwei Pakete zu definieren. Stellen Sie Ihre Tests einfach in das gleiche Paket mit Ihren anderen Quellen. Was ist der Schaden?

Wenn du denkst, dass es Schaden geben wird, dann musst du es so machen:

%Vor%

Der wichtige Teil ist :import-from Ihr Quellpaket statt :use es.

Dann müssen Sie die Symbole in Ihrem Quellpaket qualifizieren, wenn Sie sie in Ihrem Testpaket verwenden. Angenommen, Sie haben diese Funktion:

%Vor%

Ihr Test könnte wie folgt aussehen:

%Vor%

Der wichtige Teil ist, dass du (sources::return-true) statt nur (return-true) sagst. Das gleiche gilt für Symbole wie 'sym ; Beziehen Sie sich darauf als 'sources::sym .

    
Michael Fox 08.02.2017 20:19
quelle

Tags und Links