24

clojure repl 内でプロジェクト情報を取得することは可能ですか?

たとえば、定義されたプロジェクトがあった場合:

(defproject blahproject "0.1.2" ....)

プロジェクトディレクトリでreplを実行するとき、このような機能はありますか?

> (project-version) 
;=> 0.1.2 
4

8 に答える 8

18

自分自身を解析することはできますがproject.clj、これは面倒かもしれません。大変な作業でもあります。代わりに、次のことができます。

(System/getProperty "projectname.version")
于 2014-10-08T04:01:29.990 に答える
11

システムプロパティを含む多くのソースから設定を吸い込む環境 ( https://github.com/weavejester/environ ) を使用します。プロジェクトのバージョンは次のように表示され:<project-name>-versionます。

foobar.repl=> (require '[environ.core :refer [env]])
nil
foobar.repl=> (:foobar-version env)
"0.1.0-SNAPSHOT"
于 2015-01-29T21:49:19.913 に答える
9

以下のコードを project.clj の末尾に追加します。

(def project (assoc-in project [:repl-options :init]
                       `(~'def ~'project-version ~(project :version))))

project-versionこれで、repl の初期名前空間で呼び出される var ができました。

于 2013-04-29T08:30:48.670 に答える
7

より完全な機能を備えたアプローチについては、Leiningen の configleaf プラグイン ( https://github.com/davidsantiago/configleaf ) を参照してください。これにより、アクティブなプロファイルがマージされたプロジェクト マップが作成され、選択した名前空間のプロジェクト コードで使用できるようになります。

于 2013-04-29T17:04:18.240 に答える
7

vemvが言ったように、Leiningen プロジェクト ファイルは単なる Clojure データです。したがって、通常のようにプロジェクトに簡単にアクセスできますhash-map

(->> "project.clj"
     slurp
     read-string
     (drop 2)
     (cons :version)
     (apply hash-map)
     (def project))

この変数が でのみ必要な場合は、次のreplように追加できrepl-optionsますproject.clj

(defproject yourproject "0.1.0"
  :description ""
  :url ""
  :dependencies [ [org.clojure/clojure  "1.4.0"]]
  :repl-options { :init (->>  "project.clj"
                              slurp
                              read-string
                              (drop 2)
                              (cons :version)
                              (apply hash-map)
                              (def project))})

これで、にproject変数ができましたrepl。したがって、プロジェクトのバージョンにアクセスするには、単に(:version project).

もちろん、ネイティブの Leiningen コードを使用してプロジェクト ファイルを解析することもできます。

(defproject yourproject "0.1.0"
  :description ""
  :url ""
  :dependencies [ [org.clojure/clojure  "1.4.0"]
                  [leiningen-core       "2.1.3"]]
  :repl-options { :init (do (require 'leiningen.core.project)
                            (def project
                                 (leiningen.core.project/read)))})

ただし、プロジェクトのバージョンだけが必要な場合は、Ankur のソリューションを使用することをお勧めします。

于 2013-04-29T09:15:14.757 に答える