7

CL は初めてで、AllegroCL を使用しています。次の要件を満たすようにソース コードを整理する方法を見つけようとしています。

  1. src コードにテスト スイートが含まれないようにしたいと考えています。
  2. チームの他のメンバーがシステムを変更する必要がないように、プロジェクトの依存関係 (src とテスト deps の両方) を移植可能な方法で宣言したいと考えています。
  3. ビルドとテストの両方を含む、チェックインでの継続的な統合を容易にしたいと考えています。

これらの要件を満たすために ASDF を創造的に使用しようとしてきましたが、うまくいきません。他の人々はこの問題にどのように取り組んでいますか? これらの 2 つの要件は単に「Lispy」ではないのでしょうか?

4

5 に答える 5

5

ASDF を使用するか、Allegro CL defsystem ツールを使用します。

  1. それらを2つの異なるシステムにします。テスト スイート システムは、ソフトウェア システムに依存します。
  2. 相対パス名を使用するか、システム定義ファイルの場所に基づいて絶対パス名を計算するか、「pro」バージョンでは論理パス名 (ルールに従って再マップできる CL のパス名) を使用します。
  3. おそらく、Common Lisp 用の継続的統合ツールがあると思いますが、私はまだ使用したことがありません。デフシステムの説明を用意することは、良い出発点です。
于 2012-08-15T16:02:18.743 に答える
5

Quicklisp がインストールされている場合は、組み込み機能の Quickproject を使用できます。

(ql:quickload "quickproject")
(quickproject:make-project "~/src/lisp/swatchblade/"
                         :depends-on '(vecto hunchentoot))

これにより、次の 4 つのファイルが作成されます。

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

package.lisp はパッケージの名前空間を定義します:

(defpackage #:swatchblade  
(:use #:cl)
  (:shadowing-import-from #:vecto
                          #:with-canvas
                          #:rounded-rectangle
                          #:set-rgb-fill
                          #:save-png-stream))

swatchblade.asd は、システム/プロジェクト、ソース コード ファイル、依存関係などを定義します。

(asdf:defsystem #:swatchblade 
 :serial t
  :depends-on (#:vecto
               #:hunchentoot
               #:cl-colors)
  :components ((:file "package")
               (:file "swatchblade")))

swatchblade.lisp はソース コードの場所です。

Quicklisp のクイックロードを介してプロジェクトをロードできます。

* (ql:quickload "swatchblade")
loading output
* (swatchblade:start-web-server :port 8080)
Server started on port 8080.

次に、swatchblade システムに依存する別のプロジェクトを作成する場合:

quickproject:make-project "~/src/lisp/whimsytron/" 
                       :depends-on '(swatchblade))

テストに関しては、テスト用に package.lisp に別の名前空間を追加できます:

    (defpackage #:swatchblade-tests  
      (:use #:cl #:swatchblade))

テスト ファイルを作成し、コードを記述して、システム定義にファイルを追加します。

(asdf:defsystem #:swatchblade 
 :serial t
  :depends-on (#:vecto
               #:hunchentoot
               #:cl-colors)
  :components ((:file "package")
               (:file "swatchblade")
               (:file "swatchglade-tests")))

swatchblade-tests名前空間をロードして、テストを実行します。

ここにテストを含むサンプル プロジェクト

Quicklisp がすべての依存関係をシステムにインストールするのを避けたい場合は、私の知る限り、依存関係をインストールしてシステムを手動でロードする必要があります。

Quicklisp の作者である Zach Beane は、 quickproject の使用に関するより詳細な投稿をしています。

于 2012-08-20T13:06:35.713 に答える
5

「local-project」フォルダーが見つかるホームフォルダーに「quicklisp」フォルダーを作成するquicklispを使用しています。これには、URI を .asd ファイルに挿入できる txt ファイルが含まれています。

そのユーティリティの使用方法:

  • プロジェクトフォルダに「project.asd」と「project-test.asd」を作る

project.asd (純粋なプロジェクト コードのインクルードを管理します)

(asdf:defsystem :project-name
  :description "description here"
  :version "version here"
  :author "your name here"
  :depends-on (:a
               :list 
               :of
               :dependencie
               :libraries)
  :components ((:file "sourcefileone")
               (:file "sourcefiletwo")))

project-test.asd (テスト コードのインクルードを管理します)

(asdf:defsystem :project-name-test
  :description "testing"
  ...
  :depends-on (:project-name)
  :components ((:file "sourcefileone-test")
               (:file "sourcefiletwo-test")))
  • これらのファイルの URI を上記の名前の local-projects.txt に挿入します。

  • < filename>.lisp ファイル内のプロジェクト ソースと < filename>-test.lisp ファイル内のテスト コールを並行してプログラムします (*-test.lisp ファイルには、テスト実行コールが含まれている必要があります)。

  • sbcl または使用するものを起動し、プロジェクトをロードするかテストするかどうかに応じて(ql:quickload "project-name")orを使用します。(ql:quickload "project-name-test")

これを他の場所に移植するために必要な唯一のことは、プロジェクトがコピーされているコンピューターに local-projects.txt を書き込むことです。その後、大学は必要な他のプロジェクトで asdf ファイルとクイックロードを使用してそれに依存する可能性があります。プロジェクト フォルダをコピーするには、ctr+c/v を使用するか、git などのより洗練されたものを使用できます。

テストのために、私は独自の小さなテスト スイートをプログラムしましたが、きっと良いものもあるでしょう。quicklisp についての詳細はここで、asdf についてはここで見つけることができます。もしあなたがquicklispの設定に行き詰ったなら、この質問が助けになるかもしれません。

于 2012-08-16T09:56:13.137 に答える
4

Rainer の提案に従って、ASDF システム定義機能を使用して、メイン システムfooと補助システムfoo-testsの 2 つのシステムを定義することを提案します。

fooシステムの定義で、 on the fooin-order-toを実行する仕様を追加します。 on foo-testsを実行する必要があります。これにより、対応するテスト システムとその依存関係が読み込まれ、ASDF がテスト操作を実行することが保証されます。test-optest-op(asdf:test-system "foo")

FiveAM は、テストを構築するための適切なライブラリであることがわかりました。

上記ですべてが読み込まれますが、test-opon foo-testsを実行すると実際にテストが実行されることを確認する必要があります。PERFORMそのためには、 forTEST-OPとにメソッドを追加する必要があり(eql (find-system "foo-tests"))ます。そのPERFORMメソッドは、定義したすべての FiveAM テストを呼び出し、成功するか、テストが失敗した場合はエラーを発生させる必要があります。

ASDF 用の FiveAM-tester アドオンを作成しました。一般公開については、今後検討していきたいと思います。

于 2012-08-16T18:54:04.313 に答える