3

実際のアプリケーション開発のベスト プラクティスを見つけようとしています。サードパーティ ライブラリをスタンドアロン パッケージとして展開するように適切に構成する方法がわかりません。ASDF-INSTALL と ASDF は、ライブラリをホームまたはサイトにインストールすることを意図しているようで、開発プラットフォームの状態が変化します。サーバー側アプリケーションを開発していて、ボックス上の CL インストール全体に対してこれらの依存関係を管理したい場合は、これで問題ありません。

しかし、スタンドアロン アプリケーションを作成し、インストール スクリプトを介してデプロイし、独自の CL インスタンスで単独で実行したい場合はどうすればよいでしょうか? 他のアプリケーションの CL インスタンスまたはターゲット システム構成を変更することは避けたいと思います (つまり、他のアプリケーションが依存するライブラリの他のコピーを上書きします)。Java では、これらのライブラリを含むインクルード ディレクトリを作成し、CLASSPATH を設定するだけです。独自の CL ランタイムをインストールせず、代わりにシステム上にあるものを使用すると仮定して、CL で同じレベルの分離を取得するにはどうすればよいですか?

ランタイムは、ランタイムが実行する特定のアプリケーション (Ruby や Python) よりも寿命が長く、アプリケーションは同じライブラリのロード状態を共有するため、これはすべての動的にコンパイル/解釈される言語に共通の問題であると思います。 . 私はそのような言語の経験がないので、ベスト プラクティスはおそらく私と顔を合わせることです。

これが実装固有の場合は IDK ですが、Clozure CL を実行しています。

編集:

ラマレン:

マッドボールを調べてみます。ありがとうございました。

ライブラリのインストールは、私が望んでいるものとは逆です。インストールは、ホスト システムの状態を変更することを意味するからです。キーは最後の段落にあるに違いないと思います。central-registryを隔離されたディレクトリに設定する起動スクリプトをどのように作成しますか? ASDF-INSTALL を使用して、上記のディレクトリに内容をフェッチすることは可能ですか? また、CL 実装の基本イメージに ASDF が含まれていない場合 (Clozure にはデフォルトで ASDF がありますが、CLISP はどのようにそれを行うのでしょうか)、全体をブートストラップするにはどうすればよいでしょうか?

開発チームの観点からも考えています。新しい CL プロジェクト スタブを作成し、CVS または SVN への最初のコミットを行った後、他の開発者はどのようにそれをローカル環境にチェックアウトして作業するのでしょうか? 誰もが自分のプロファイル/サイトのスタートアップに ASDF を持っていると仮定しても、他の開発者はそれぞれの中央レジストリに異なるライブラリ セットを持っている可能性があります。プロジェクトで一緒に作業するためだけに同期する必要はありません。Emacs/SLIME から CL ランタイムのプロジェクト固有のインスタンスを起動し、プロジェクトで指定されたものを正確にロードするためのクリーンな方法が必要です。

オンライン、CL、またはその他の言語でベスト プラクティスのリソースがあれば、喜んで独自のソリューションを展開し、それをオープン ソース化します。

ルイス:

SAVE-APPLICATION は展開には適していますが、私が概説した複数開発プロジェクトのスタブには適していません。

編集2:

バチン:

バージョン依存性は、まさにこれが問題である理由です。Perl または Ruby の Web アプリケーションを開発している場合、これらの依存関係を管理する Web 管理者の存在に依存できます。Lisp が異質な技術である小売業や中小企業向けのアプリを開発する場合 (そして、Lisp を管理するために IT 組織を「スキルアップ」するよう説得することはできません)、そのアプローチは受け入れられません。

昨夜、独自のプロジェクト固有の ASDF インスタンスをロードするプロジェクト レベルの .lisp ファイルを作成し、プロジェクト ローカルのcentral-registryを設定し、依存ライブラリを手動でダウンロードすることで (ASDF-INSTALL を使用せずに)、必要なものを取得することができました。これは、CLSQL と Webblock だけの依存関係の厄介なカスケードでした)。SLIME と Clozure 自体の両方について、ホームとサイトからすべてのカスタマイズを削除する必要があったため、開発ツールの観点からはまだ理想的ではありません。また、共有依存関係も解決されません (CLSQL と Webblock は両方とも MD5 を使用します)。

Java にはクラス ローダー分離機能があり、これがバージョン依存の問題を解決する方法です。次に、プロジェクトに必要なライブラリを取得する方法に関する別の問題があります(Maven風)。前者は言語の問題の核心です。後者はツールに関係しています。ASDF-INSTALL がプロジェクト インクルード ディレクトリ (Maven 風) に対して行うことを行う SLIME 拡張機能を一緒にハックし、lib ソース コードを変更して defpackage 呼び出しをインターセプトし、何らかの方法で gensym 文字列を先頭に追加して分離を強制します。このアプローチには多くの穴があることはわかっていますが、これをどれだけ深く埋めることができるかを知るには、パッケージ仕様について十分に知りません。

Python については何も知りませんが、小売レベルのアプリが存在することは知っています。私はいつも MusicBrainz Picard を使っています。Pythonがどのようにそれを行うかを調べます。

4

5 に答える 5

1

開発環境では、外部ライブラリをいつでもどこかにチェックインして、各開発者にasdf:*central-registry*.

別のオプションは、単一の開発ボックスを用意し、各開発者に Lisp + Swank を実行させることです。

于 2009-01-09T04:18:47.593 に答える
1

まず、ASDF はライブラリのインストールとは関係ありません。ファイル間の依存関係によって定義された順序で一連のファイルをコンパイルしてロードするための単なるツールです。ASDF-INSTALL は物事をインストールし、依存関係を決定するために ASDF を使用します (私が思うに) が、 clbuild 、手動での抽出とシンボリックリンク、または ASDF を置き換える最近の開発 Mudballs など、インストールのための他のメカニズムあります

特別な変数asdf:*central-registry*は、asdf システムを検索するディレクトリのリストを保持します。通常、実際のシステム定義ファイルへのシンボリックリンクを含むディレクトリへのパッチが含まれていますが、システム定義ファイルを含むすべてのディレクトリを含めることができるため、これは必須ではありません。

この変数は、ほとんどの場合、システム/サイト ライブラリ レジストリを使用してスタートアップ スクリプトによって入力されますが、分離されたローカル ディレクトリなど、好きなように変更できます。最後の段落の前の段落については、同じ CL ランタイムで多くのアプリケーションを実行することは特に一般的ではないことに注意してください。通常、いくつかのデフォルトのベア コアが起動され、次にライブラリとアプリケーションがロードされて実行され、終了時にシャットダウンされます。

編集:

ASDF は単なるライブラリであり、その変数は他の Lisp 変数と同じです。あなたが説明した場合、実装固有のシステム/ユーザー起動スクリプトを抑制したい可能性が高く(CCLでは明らかに-nまたは--no-initコマンドライン引数です)、手動でasdf.lispをロードします(setf asdf:*central-registry* (list #p"pathtoprojectcentralregistry")). または、プロジェクト ディレクトリを再帰的にスキャンし、そこに .asd ファイルを含むすべてのサブディレクトリをプッシュする関数を作成することもできます。

于 2009-01-05T14:04:09.347 に答える
1

一般に、サードパーティ ライブラリとしてインストールされたものはすべて、ホスト システムの状態を (いわば) 変更する必要があると言えます。ローカルで開発されたものは、いくつかの方法で処理できます。私が使用するのは、自分用のシンボリック リンク ファームです (必要なときにファームを再構築するための付随するシェルスクリプトを使用します)。Lisp プロジェクトは、独自のディレクトリにチェックアウトされます。相互に依存するプロジェクトも同様にチェックアウトされ、ASDF システム定義で相互に参照され、シンボリック リンク ファームを介して取得されます。

このモデルで考えられる問題の 1 つは、サポート ライブラリの一部がライブラリ BLAHONGA に依存し、2008 年 12 月 1 日より前に CVS からチェックアウトされ、サポート ライブラリの他の部分も BLAHONGA に依存していることに突然気付いた場合です。この機能は、2008 年 12 月 29 日から CVS でのみ利用可能です。バージョンの依存関係も可​​能性があると思います。

于 2009-01-06T12:52:58.040 に答える
1

CCL:SAVE-APPLICATIONが必要です。

于 2009-01-05T17:31:49.053 に答える
0

私は以前にこのような問題を抱えていました。私が通常それを解決した方法は次のとおりです。

  1. 必要なライブラリを含むシステム全体の構造をリビジョン管理システムに取得します。(svn externals や同等の git などの手法がこれに役立ちます)
  2. asdf:*central-registry*ファイルを含む作業コピー内のディレクトリを指すように cl init ファイルを適切に構成し.asdます。

実際、私は複数のプロジェクトに同時に取り組んでいるため、通常、cl init ファイルに上記のような複数の構成を設定します。例えば、

(defun project1 ()
  (push "/home/rpg/project1/src/" asdf:*central-registry*)
  (push "/home/rpg/project1/extlib/" asdf:*central-registry*))

次に、開発環境を起動して と入力するだけ(project1)で、ASDF が構成され、プロジェクト 1 のコンテキストで作業できるようになります。

プロジェクトごとにロード ファイルを作成し、それをソース ライブラリのルートにチェックインする方法もあります。このロード ファイルは、ASDF の中央レジストリを構成し、システムをロードします。を使用することで、中央レジストリの構成を作業コピーの配置から独立させることができます*load-truename*

もう 1 つの方法は、作業ディレクトリ ツリーを自動的に検索して、.asdファイルを含むすべてのディレクトリを見つけ、asdf:*central-registry*それに応じてデータを入力することです。

于 2011-09-07T18:59:53.677 に答える