9

との上にアプリケーションを構築するnet.aserveとしbordeaux-threadsます。私のパッケージ宣言は次のようになります。

(defpackage :my-package
  (:use :cl :net.aserve :bordeaux-threads)
  (:export …))

私はQuicklispを使用しているので(ql:quickload "aserve") (ql:quickload "bordeaux-threads")、パッケージをコンパイルする前にSLIMEで実行し、すべてが正常です。

もちろん、明日はSLIMEを再度起動するQUICKLOADので、コンパイルする前にsを発行することを忘れないでください。そうしないと、問題が発生します。

私は次のようなものを置くことができます

(eval-when (:compile-toplevel)
  (ql:quickload "aserve")
  (ql:quickload "bordeaux-threads"))

パッケージの一番上にあります—これは私が開発のために行ったことです—しかし、ユーザーにパッケージマネージャーを強制するのは良い考えではないと感じています。

より良い代替案はありますか?

4

4 に答える 4

14

asdファイルで、依存関係を次のように定義する必要があります:''

(asdf:defsystem #:aserve
 :serial t
 :depends-on (#:hunchentoot :hunchentoot-cgi
           #::bordeaux-threads
           #:parenscript)
 ...)

その後、(ql:quickload:aserve)を実行する必要があります。

于 2012-03-23T01:26:26.240 に答える
11

quickproject (からアクセス可能)を使用(ql:quickload :quickproject)て、アプリケーション用のシステムを作成します。z_axisで説明されているように、次に、defsystem宣言に依存関係のリストを入力できます(呼び出したときに依存関係を見逃した場合quickproject:make-project)。

Quicklispインストールのパスで新しいプロジェクトを作成する場合は、プロジェクトlocal-projectsをクイックロードすることもできます(Quicklispディストリビューションの一部でなくても)。プロジェクトをクイックロードすると、もちろん依存関係がダウンロードされ(Quicklispディストリビューションの一部である場合)、ロードされます。

于 2012-03-23T06:45:07.977 に答える
3

デプロイされたソースコードにquicklisp呼び出しをまったく含めたくない場合は、quickprojectシステム定義ファイルを残りのソースから分離します。

defpackageソースの上部で、呼び出しの直前に、(require ...)パッケージの依存関係に必要なを追加します。これは、先に進む前にそれらのlispパッケージが(何らかの方法で)ロードされることを保証しますが、それらのパッケージがロードされる「方法」を指定しません。ql:quickload :my-packageそれらは、 (quickprojectを使用して)呼び出しを実行することによってロードできます。これにより、最初に依存関係がロードされ、次にソースをロードするときにrequire呼び出しが実行されます。または、ユーザーが(を呼び出さずに)ソースを直接ロードql:quickloadし、それらの依存関係がにある場合は、require呼び出し中に依存関係がロードされる可能性があります*module-search-path*。あなたが言ったように、このテクニックはエンドユーザーがあなたのソースをロードしたいどんなビルドツールでも使うことを可能にするでしょう。

これを数分間試した後、quicklispはrequire関数呼び出しにラッチしているようです。そのため、quicklispがインストールされている場合、(require :bordeaux-threads)たとえばが呼び出された場合、lispはquicklispを使用してその依存関係をダウンロードしてインストールします。これは非常に優れた機能(IMO)です。これは、Common Lisp標準require関数がインターフェース層として機能し、依存関係を満たすために使用される特定のビルドツールを抽象化できるためです。Quicklispはrequireにラッチでき、asdfはそれにラッチします(IIRC)など。

したがって、質問に答えるために、quicklisp呼び出しは、デプロイされたソースコードのどこにも行かないようにrequiresする必要があり、パッケージ定義ファイルが評価される前に依存関係がロードされるようにするために使用する必要があります。パッケージ定義ファイルをロードする前に誰かがquicklispをインストールしている場合は、quicklispを使用して依存関係をダウンロードしてインストールすることで、これらの要件を満たすことができます。誰かがasdfをインストールしている場合、それらの依存関係はそのビルドツールで満たされます。そして、誰かがすでに依存関係をインストールしている場合(他の手法を使用して)、requiresは単に渡されます。

于 2013-05-29T18:56:10.513 に答える
2

私はまったく同じ質問をしました、そして私はユーザーにパッケージマネージャーを強制するべきではないことに同意します。quicklispの時代以前は、clbuildを使用していて、すべての.asdファイルをsystems/ディレクトリに配置していました。`systems /'ディレクトリがasdf:central-registryにある限り、少なくともSBCLとCCLでは、関連するすべてのパッケージを簡単にロードできます(「a-package」が必要です)。新しいclbuild2は、upstreamからインストールする場合でもこの機能を保持し、統合されたquicklispは、個別にインストールされたupstreamパッケージを尊重しますが、quicklispでインストールされたパッケージは.asdファイルを公開しなくなります。

したがって、私の解決策は、通常はdists / quicklisp / software /の下にある、quicklispでインストールされたすべてのパッケージをスキャンするシェルスクリプトを作成し、そこにあるすべての.asdファイルを中央の場所にリンクすることです。このように、quicklispがインストールされたパッケージのみを使用したい場合は、clイメージにquicklispをロードする必要はありません。quicklispがこの機能をデフォルトで出荷できることを願っています。

于 2013-05-21T00:47:48.023 に答える