4

私は Clojure コーディングの初心者であり、開発用に Emacs をセットアップするために多くの記事を読みました。
セットアップ自体は設計どおりに機能しますが、コードを変更するときに Cider セッションからサーバーを実行し、Emacs を完全に強制終了しました。または、シェル セッションからサーバー プロセスを見つけて、そこから強制終了する必要があります。これは理想とはかけ離れています。

clojure-getting-started/web.clj

(defn -main [& [port]]
  (let [port (Integer. (or port (env :port) 5000))]
    (jetty/run-jetty (site #'app) {:port port :join? false})))

サイダーセッション

clojure-getting-started.web> (defonce server (-main))

サーバーを起動した後、(server)関数で以下のエラーが発生します。

1. Unhandled java.lang.ClassCastException
   org.eclipse.jetty.server.Server cannot be cast to clojure.lang.IFn


エラー メッセージは理にかなっていますが、Emacs だけを使用してコード ベースを更新するにはどうすればよいでしょうか?
Emacsでシェルセッションを開始してそこでプロセスを強制終了するよりも良い方法があると思います(そして願っています)...

4

3 に答える 3

3

あなたが望んでいるのは、jetty サーバーを実行し、emacs 内からコードを変更するときにコードをロードまたはリロードすることであると仮定します。すでに与えられたアドバイスは良いものですが、始めるときには必要以上に複雑になるかもしれません。私のアドバイスは、最初にデフォルトの環境とワークフローをセットアップする lein 用のテンプレートのいくつかを利用することです。その後、自分に合ったワークフローが得られるまで、さらに学習しながらこのデフォルトを調整できます。私のお勧めは、デフォルトの Compojure テンプレートから始めることです。

lein new compojure my-project

これにより、基本的なリング ライブラリと compojure ライブラリ、lein プラグイン、および単純な開発プロファイルを含む必要最小限のプロジェクトが作成されます。

src/my_project/handler.clj ファイルを編集して、ring.middleware.reload ミドルウェアを追加します。

(ns my-project.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.reload :refer [wrap-reload]]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (-> app-routes
      wrap-reload
      (wrap-defaults site-defaults)))

wrap-reload ミドルウェアを使用すると、コードが変更されるとコードが再ロードされます。コードの変更を有効にするために jetty サーバーを再起動する必要はありません。ページをリロードするだけです。

ターミナルで次のいずれかを実行します

lein ring server

また

lein ring server-headless

これにより、ポート 3000 でリッスンする jetty サーバーが開始されます。その後、emacs 内から、コードの記述中に使用する cider repl を開くことができます。project.clj ファイルを変更しない限り、サーバー プロセスを再起動する必要はありません。サイダープロセスと同じです。

次に、これに慣れたら、lein-ring のドキュメントを参照してください。そこには、プロジェクト内で repl.clj ファイルをセットアップする方法に関する情報があります。それを行うと、次のようなことができるようになります

lein repl

そして、そのreplの中から、次のようなことをします

(start-server)

サーバーを起動します。その後、emacs に切り替えることができ、cider-jack-in を実行する代わりに、cider-connect を実行できます。これにより、2 番目の repl セッションを開始するのではなく、既に実行中の repl に接続されます。後で、clojurescript も調べ始めることにした場合は、clojure+clojurescript アプリのデフォルト テンプレートのいくつかを確認できます。私はfigwheelがとても好きで、試薬をかなり使用しているので、試薬テンプレートも非常に優れています.

そこにはかなりの数のleinテンプレートがあり、それらを実行して、それらが何をするかを見るだけで本当に便利だと思います. 次に、好きな機能/オプションを厳選する傾向があります。

于 2015-02-08T01:11:18.393 に答える
1

同様の質問に対して私が与えた答えのほとんどは次のとおりです。


名前空間で(refresh)関数を試してください:clojure.tools.namespace.repl

更新機能は、Clojure ソース ファイルのクラスパス上のすべてのディレクトリをスキャンし、それらの ns 宣言を読み取り、それらの依存関係のグラフを作成し、それらを依存関係順にロードします。

https://github.com/clojure/tools.namespace#reloading-code-usage

通常、これに加えていくつかの便利なものをuser名前空間に追加するため、起動時に REPL にロードされます。

(ns user
  (:require [clojure.tools.namespace.repl :refer [refresh]]
            [clojure.repl :refer [doc source]]
            [clojure.pprint :refer [pprint pp]]
            [midje.repl :as midje]
            [clojure.stacktrace :as st]))

そのコードをメイン ソースとテスト ソースから分離しておくには<project root>/dev/user.clj、それを のファイルに置き、leinproject.cljファイルに次を追加します。

:profiles {:dev {:source-paths ["dev"]}}
于 2015-02-07T09:05:18.540 に答える