4

同一の開発マシンと本番マシンがあります (vm イメージのコピー)。アプリケーションを asd ファイルと一緒に運用マシンに配信したいのですが、ソース コードは配信したくありません。私は2つの方法を考えました:

1.本番マシンにFASLファイルのみを提供して、asdfにシステムをロードさせる

長所: 何かを変更する必要がある場合は、devel マシンでファイルをコンパイルし、本番マシンで fasl を置き換えるだけです。

短所:それができるかどうか、またどのようにできるかわかりません。

2. save-lisp-and-die を使用するか、できればZachary Beane の builapp ツール(私は SBCL を使用しています) を使用してプロセスを自動化します。

長所: より簡単に自動化され、より簡潔になり、1 つのファイル (サイズは大きくなりますが) のみで配信されます。

短所: 前のソリューションの長所。

私が言及したこれらの短所と長所は、互いに比較してそれほど重要ではないことを知っていますが、私のオプション、または私が考えていない他の解決策を変更する可能性があるとは思わない長所または短所を知りたい. また、何を選択しても、解決策1が可能かどうか、およびその方法を知りたいです。

4

4 に答える 4

4

私は現在 ASDF を維持しています。ASDFがそれを許可していることを知りません。私はそのために設計されていませんでした。とはいえ、私は試したことがなく、そうではない、または単純なハックではできないと断言することはできません. ASDF や拡張へのそのようなハックを歓迎します。

最悪の場合、ASDF がそれを許可しない場合、「簡単な」ハックは (eval-when (:compile-toplevel :load-toplevel :execute) (エラー「これは本当のソースではありません)」を含むファイルを作成することです。 file")) を作成し、ソース ファイルの代わりに 1970-01-01 のタイムスタンプを付けます。スクリプトを使えば、ソース レジストリを巧妙にハッキングして、本物のソース コードと偽のソース コードを切り替えることができます。

幸運を。

于 2011-07-22T10:49:57.970 に答える
4

一般に、これらのシステム ツールはそれを許可する必要があります。必要なのは、システムの説明と FASL ファイルだけです。その後、システム ツールはロードに FASL ファイルを使用する必要があります。一部のソースファイルに強く依存していないことを確認するだけで済みます。

このようにして、ソフトウェアは Lisp の世界で何十年も (> 30 年) 提供してきました。そのアプローチには何の問題もありません。特定のツール (ここでは ASDF ですが、他にもあります) に問題がある場合は、作成者に文句を言う必要があります。

実用的な問題がある場合は、ASDF メーリング リストで議論するか、ここに質問を投稿してください。実用的な問題はありますか?

これは直接の助けにはなりませんが、システム ツールが通常どのように機能するかについてのヒントが得られるかもしれません。

LispWorks 6 と独自の DEFSYSTEM を使用した例

ディレクトリ FOO に 3 つのファイルがあります。

RJMBA:foo joswig$ ls -l
-rw-r--r--  1 joswig  admin    13 22 Jul 20:42 a.lisp
-rw-r--r--  1 joswig  admin    14 22 Jul 20:42 b.lisp
-rw-r--r--  1 joswig  admin   331 22 Jul 20:41 system.lisp

system.lisp には、次のシステム記述が含まれています。

(defvar *foo-directory*
   (make-pathname :name nil
                  :type nil
                  :directory (pathname-directory *load-pathname*)
                  :defaults *load-pathname*))

(defsystem foo (:default-pathname *foo-directory*)
   :members ("a" "b"))

上記は*foo-directory*、ロードされたファイルのパス名に基づいてパス名を設定します。したがって、実際の絶対パス名を設定できますが、手動で指定する必要はありません。別の方法として、相対パス名を使用することもできます。これは、何を使用するかによって異なります。これを選んだのは、絶対パス名を自動的に設定する方法を示すためです。

次に、このファイルを LispWorks にロードし、システムをコンパイルします。

CL-USER 12 > (compile-system 'foo)

;;; Compiling file /Lisp/foo/a.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is  on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
;;; Compiling file /Lisp/foo/b.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is  on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
(FOO)

2 つの fasl ファイルを作成しました。

次に、system.lisp ファイルと fasl ファイルを新しいディレクトリにコピーします。

RJMBA:Lisp joswig$ mkdir bar
RJMBA:Lisp joswig$ cp foo/system.lisp bar/system.lisp
RJMBA:Lisp joswig$ cp foo/a.64xfasl bar/a.64xfasl
RJMBA:Lisp joswig$ cp foo/b.64xfasl bar/b.64xfasl

次に、ディレクトリで新しい LispWorks を開始しb、system.lisp ファイルをロードしてから、システムをロードします。

RJMBA:Lisp joswig$ cd bar
RJMBA:bar joswig$ lispworks
LispWorks(R): The Common Lisp Programming Environment
Copyright (C) 1987-2009 LispWorks Ltd.  All rights reserved.
Version 6.0.0
User joswig on RJMBA.local
...
CL-USER 1 > (load "system.lisp")
; Loading text file /Lisp/bar/system.lisp
;; Creating system "FOO"
#P"/Lisp/bar/system.lisp"

CL-USER 2 > (load-system 'foo)

; Loading fasl file /Lisp/bar/a.64xfasl

"a" ; whatever the file does

; Loading fasl file /Lisp/bar/b.64xfasl

"b" ; whatever the file does

(FOO)

完了し、動作します。

さらに、これは相対ディレクトリまたはいわゆる論理パス名で行うことができます。論理パス名には、あるパス名から物理パス名へのマッピングがあるため、アーキテクチャ、OS、およびディレクトリ構造から独立した、システムに依存しないパス名を使用できます。これにより、特定の展開シナリオからの独立性がさらに高まります。

于 2011-07-22T10:38:16.513 に答える
1

Faré は正しい --- ASDF のロジックは aload-opに依存し、fasl の file-write-date と .lisp の file-write-date を比較してcompile-op、 が必要かどうかを確認します。compile-opファイル。

cl -source-file のサブクラス、たとえば を定義し、メソッド on andfasl-onlyをオーバーライドして、常に を返すようにすることで、これを機能させることができるはずだと思います。 operation-done-pfasl-onlycompile-opt

が であるように defsystem をセットアップするのがおそらく最も便利です。そうすれば、:default-component-classdefsystemfasl-onlyは単にコンポーネントをリストすることができ:fileます。

メソッド onをオーバーライドしてを返すことも賢明かもしれませんが、それが必要かどうかはわかりません。input-filescompile-opfasl-onlynil

于 2011-07-26T03:29:38.637 に答える