Shiro(2015/07/02 00:29:41 UTC): スクリプトがちょっと大きめの規模になった場合に、 いくつかのライブラリに分割して見通しを良くしたいことがある。
しかしそのスクリプトをデプロイする時に、付随するライブラリをどう扱うべきか。 ちょっとしたスクリプトだとシステムライブラリパスに入れるのも気が引けるし、 かといっていちいち専用ディレクトリ作ってパスを張るのもなあ。
最近のGaucheではadd-load-pathの:relativeオプションでスクリプトから相対で ロードパスを指定できるから、メインスクリプトから(add-load-path "." :relative)しておいて、 ディレクトリごとコピーする、という手はある。でもメインスクリプトを/usr/local/binに 置きたい時、その下にサブディレクトリを掘ってライブラリ置くのも変な感じ。
ただ、インストール時にプリプロセスして良いなら、ファイルを全部catしちゃうって手はある。
例:スクリプトファイル構成:
foo.scm - スクリプト本体 foo/bar.scm - 付随ライブラリ foo/baz.scm - 付随ライブラリ
foo.scm:
(add-load-path "." :relative) (use foo.bar) (use foo.baz) (define (main args) (print (foo-bar)" "(foo-baz)) 0)
foo/bar.scm:
(define-module foo.bar (export foo-bar)) (select-module foo.bar) (define (foo-bar) "foo-bar")
foo/baz.scm
(define-module foo.baz (export foo-baz)) (select-module foo.baz) (define (foo-baz) "foo-baz")
foo.scmを実行可能にしとけば、どこからでもこのディレクトリ構成を保っていれば 実行できる状態。
ここで、
とすれば、単一の実行可能スクリプトになる。
foo:
;; foo/bar.scm (define-module foo.bar (export foo-bar)) (select-module foo.bar) (define (foo-bar) "foo-bar") (provide "foo/bar") ;; foo/baz.scm (define-module foo.baz (export foo-baz)) (select-module foo.baz) (define (foo-baz) "foo-baz") (provide "foo/baz") ;; main (select-module user) (use foo.bar) (use foo.baz) (define (main args) (print (foo-bar)" "(foo-baz)) 0)
use(require)は既にロードされているファイルはロードしないけど、 ロードされたかどうかの判断はprovideでやってるのでこれが可能。
実際にディレクトリを固めてひとつにするスクリプトは暇が出来たら書く。