サーチ…


備考

ASDF - 別のシステム定義機能

ASDFは、Common Lispソフトウェアのシステムがどのようにコンポーネント(サブシステムとファイル)で構成されているか、これらのコンポーネントをコンパイル、ロード、テストなどのために正しい順序で操作する方法を指定するためのツールです。

フラットなディレクトリ構造を持つシンプルなASDFシステム

フラットなディレクトリ構造を持つこの単純なプロジェクトを考えてみましょう。

example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp

example.asdファイルは実際にASDF特有の関数呼び出しを少ししか持たない別のLispファイルです。プロジェクトがdrakmaおよびclsqlシステムに依存していると仮定すると、その内容は次のようになります。

(asdf:defsystem :example
    :description "a simple example project"
    :version "1.0"
    :author "TheAuthor"
    :depends-on (:clsql
                 :drakma)
    :components ((:file "packages")
                 (:file "tools" :depends-on ("packages"))
                 (:file "functions" :depends-on ("packages"))
                 (:file "main" :depends-on ("packages"
                                            "functions"))))

このLispファイルをロードすると、あなたは:exampleシステムについてASDFに指示しますが、システム自体はまだロードされていません。これは、 (asdf:require-system :example)または(ql:quickload :example)いずれかで行われます。

システムをロードすると、ASDFは次のことを行います。

  1. 依存関係をロードする - この場合はclsqlシステムのclsqldrakma
  2. 指定された依存関係に基づいてシステムのコンポーネント、つまりLispファイルをコンパイルしてロードする
    1. 最初にpackages (依存関係なし)
    2. functionspackages (それだけに依存するpackages )が、前にmain (それに依存します)
    3. main after functionspackagesfunctions依存functions
    4. packages後のいつでもtools

心に留めておいてください:

  • 必要に応じて依存関係を入力します(使用前にマクロ定義が必要です)。そうしないと、システムをロードするときにASDFがエラーになります。
  • リストされたすべてのファイルは.lisp終わりますが、この.lispファイルはasdfスクリプトにドロップする必要があります
  • あなたのシステムが.asdファイルと同じ名前で、そのフォルダをquicklisp/local-projects/フォルダに移動(またはシンボリックリンク) quicklisp/local-projects/(ql:quickload "example")を使ってプロジェクトを読み込むことができます。
  • あなたのシステムが依存しているライブラリは、 QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*ASDF:*CENTRAL-REGISTRY変数)またはQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*変数を介して、またはそのいずれかのQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*利用可能なQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*どちらかにQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*知らなければなりません。

システムのテスト操作を定義する方法

(in-package #:asdf-user)

(defsystem #:foo
  :components ((:file "foo"))
  :in-order-to ((asdf:test-op (asdf:load-op :foo)))
  :perform (asdf:test-op (o c)
                    (uiop:symbol-call :foo-tests 'run-tests)))

(defsystem #:foo-tests
  :name "foo-test"
  :components ((:file "tests")))

;; Afterwards to run the tests we type in the REPL
(asdf:test-system :foo)

ノート:

  • システムは、foo-testsが "FOO-TESTS"というパッケージを定義していると仮定しています
  • run-testsはテストランナーのエントリーポイントです
  • uoip:symbol-callでは、まだ読み込まれていない関数を呼び出すメソッドを定義することができます。関数を定義したパッケージは、システムを定義するときには存在しません

私のASDFシステムをどのようなパッケージで定義する必要がありますか?

ASDFは、開発者がパッケージを定義するためのパッケージASDF-USERを提供します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow