9

別の名前空間で動的変数を定義しようとしています。Lobosのドキュメントには次のように記載されています。

デフォルトでは、すべての移行はlobos.migrations名前空間に保持されます。移行コマンドによって自動的に読み込まれるため、自分で読み込む必要はありません。したがって、別の名前空間を使用するには、lobos.migration/ migrations-namespace動的変数を変更する必要があります。

新しい名前空間内から動的変数を設定する方法がわかりません。

(ns `lobos.migration)を介してreplでこれを行うことができますが、このcmdを自分のnsから実行します

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)

を生成しCan't create defs outside of current nsます。

どうすればこれを修正できますか?

4

1 に答える 1

20

Clojure変数は、すべてのスレッドに表示されるルートバインディングを持つことができます。さらに、動的変数はスレッドごとのバインディングを持つこともでき、それぞれが1つのスレッドにのみ表示されます。

次を使用して、現在のスレッドのスレッドごとのバインディングを一時的に作成できますbinding

(binding [lobos.migration/*migrations-namespace* 'gb.install.migrations]
  ;; binding is in effect here in the body of the binding form
  )

または、スレッドごとのバインディングがすでに有効になっている場合は、次を使用してその値を変更できますset!

(set! lobos.migration/*migrations-namespace* 'gb.install.migrations)

ただし、すべてのスレッドで表示される方法で、この特定の動的変数を変更する必要がある可能性があります。これが当てはまる場合は、次のようにしてルートバインディングを変更する必要があります。

(alter-var-root #'lobos.migration/*migrations-namespace*
                (constantly 'gb.install.migrations))

私はロボス自体について何も知らないので、これらのいずれかが実際にロボスが望む方法で変数を設定することを確実に言うことはできません。

于 2012-06-11T20:25:02.300 に答える