1

私は Clojure に不慣れで、Leiningen が私のコードを実行するのを待つことに人生の多くの時間を費やしてきたので、Cake に移行しようとしています。Cake の永続的な JVM は非常に高速にロードされますが、より大きな問題が発生します。私の関数も永続的です!

問題を実証するために、私は Cake プロジェクトを開始し (を使用してcake new mess-up-with-cake)、これを に書きましたcore.clj:

(ns mess-up-with-cake.core)

(defn main-function[]
  (println "I'm in the main function")
)

(println "I'm in core.clj, not inside in any function") 

これはproject.clj次のとおりです。

(defproject mess-up-with-cake "0.0.1-SNAPSHOT"
  :description "TODO: add summary of your project"
  :dependencies [[clojure "1.2.0"]])

(use 'mess-up-with-cake.core)
(deftask my-task
         (println "I'm in my task")
         (main-function)
)

で実行するとcake my-task、次のようになります。

I'm in core.clj, not inside in any function
I'm in my task
I'm in the main function

ここで驚きはありません。

今、私はこれに変更core.cljしました:

(ns mess-up-with-cake.core)

(defn main-function[]
  (println "I'm in the main function")
  (println "I've made a change in the main function")
)

(println "I'm in core.clj, not inside in any function")
(println "I've made a change outside the main function") 

そして、私がそれを実行すると、私は得る

I'm in core.clj, not inside in any function
I've made a change outside the main function
I'm in my task
I'm in the main function 

core.clj明らかにリロードされましたが、メイン関数内で行った変更は出力されませんでした! JVM を停止しcake killて再実行した場合にのみ、目的の結果が得られますが、関数を変更するたびに JVM を再起動する必要がある場合は、lein に戻ることもできます...

Cake に関数を強制的にリロードさせる方法はありますか?

4

2 に答える 2

3

これはあなたの質問に直接答えないかもしれませんが、役に立てば幸いです:

leiningen を使用して実行する場合、ワークフローのように聞こえます。

  • lein run
  • JVMが起動するのを待ちます....退屈します...
  • 結果を観察する
  • コードを編集
  • 繰り返す

これはほとんどの言語で非常に一般的なパターンであり、Clojure の開発で時折使用されます (ここでは Cake が非常に役立ちます)。Clojure 開発では、プロジェクトの 1 つのインスタンスを使用し、nrepl (または Slime and Swank)を使用してエディターをそのインスタンスに接続することがより一般的です。ほとんどの人は開発を行っている間、プロジェクトを実行したままにしておくため、この苦痛を感じている人は多くないため、私の意見では、ソリューションはそれほど良くありません。Cake は大部分が Leiningen に統合されており、Cake プロジェクトの将来の方向性は明確ではありません (この点については、私が間違っている可能性が非常に高いです)。私が知っている Clojureian のうち、全員が Leiningen に移動し、Emacs や vim などのエディターからプロジェクトに接続しています。

一般的なワークフローは次のとおりです。

  • Emacsを起動
  • Mx nrepl ジャックイン
  • Ctrl-c Crtl-l すべての名前空間とそれに依存するすべての名前空間をリロードします (これは問題の解決策に近いです)
  • ハック、ロード、繰り返し ;-)

このワークフローは Emacs または VI 固有のものではありません。Eclipse および Intelij から同じ方法が使用されます。

re:「Clojure ランタイム全体 + 使用しているライブラリをリロードしても、おそらく JVM を再起動するよりもはるかに高速ではありません」。

大規模なプロジェクトでも 2 秒もかからないことがわかりました

于 2012-10-10T20:37:08.083 に答える
1

以前はJVMの起動速度が遅いことにも苦労し、Cakeとの成功はまちまちでした。著者のブログ投稿である程度説明されている、Leiningen用の優れたautoexpectプラグインを確認することをお勧めします。基本的に、autoexpectは、作業ディレクトリツリーが更新されるたびにコードをリロードします(そして、句を評価し、テストの失敗を報告します)。継続的テストを夢見ます-私は時々Emacsで2つのシェルを使用しています-1つはの出力用で、もう1つは接続されたREPLがコードのスニペットを送信するためのものです。expectlein autoexpect

私は継続的テストのスタイルがとても好きで、Clojure以外の開発用にPythonで同様のユーティリティを作成しました(このブログ投稿で説明されています)-Clojureの場合はを使用しますautoexpect

于 2012-10-10T21:06:46.597 に答える