蛋糕和莱宁根有什么区别?

有帮助吗?

解决方案

这个答案继续引起人们的兴趣,大概是leiningen在Stackoverflow中的参考,因此现在已大量编辑以更新2014年。

Leiningen和Cake于2011年合并。Leiningen(版本2)现在是事实上的Clojure自动化工具。

莱宁根是Clojure的构建工具和依赖性管理器,其中包括具有适当配置的Class Path的交互式REPL的能力,以及以Maven存储库和/或基于社区的自动方式获取的所有Java和Clojure依赖关系的能力 克洛贾尔斯.

蛋糕与Leiningen非常相似(直到当时使用同一project.clj文件格式),但试图通过在后台保持持久的JVM来避免大量的启动开销。在基于迭代的基于迭代的开发的典型过程中,由于持续的过程中的积累状态(旧功能定义等)在持续的过程中积累的状态(旧功能定义等),这更响应迅速但方便了错误。事实证明这是一个不好的讨价还价。

Leiningen的经验以及对更快的启动时代的持续渴望导致了许多建议和方法来加速事务: https://github.com/technomancy/leiningen/wiki/faster

其他提示

主要区别在于实施任务的方式。

Cake的方法是“在定义后很难扩展功能,因此让我们发明一种新的任务机制,而不是使用功能”,这导致了Deftask宏。

Leiningen的方法是“在定义后很难扩展功能,因此我们应该采取一种方法来轻松执行此操作;这样我们可以将功能用于任务,并且能够扩展不是任务的内容,”使您可以将功能的所有合成优势与任务相关。

正如亚历克斯(Alex)提到的那样,最引人注目的差异是命令行的速度。 Cake使用持久的JVM,因此,当您首次在项目中运行任务时,您只会遇到JVM启动开销。如果您不使用Emacs + Slime + Clojure检验模式,则可以是一个巨大的时间。例如,我的一个项目之一的一组相当大的测试在蛋糕中的0.3秒内进行,lein vs 11.2s。

除了性能外,蛋糕背后的核心思想是依赖性任务模型。考虑到依赖关系图中的所有及传递先决条件,每个任务仅在给定的构建中运行一次。这是一个例子 马丁·福勒(Martin Fowler)关于耙子的文章 在蛋糕语法中,直接在您的project.clj中。

(deftask code-gen
  "This task generates code. It has no dependencies."
  (println "generating code...")
  ...)

(deftask compile #{code-gen}
  "This task does the compilation. It depends on code-gen."
  (println "compiling...")
  ...)

(deftask data-load #{code-gen}
  "This task loads the test data. It depends on code-gen."
  (println "loading test data...")
  ...)

(deftask test #{compile data-load}
  "This task runs the tests. It depends on compile and data-load."
  (println "running tests...")
  ...)

要在Leiningen中执行此操作,您首先必须在项目中使用4个文件创建一个Leiningen目录:code_gen.clj,compile.clj,data_load.clj和my_test.clj。

src/leinginen/code_gen.clj

(ns leiningen.code-gen
   "This task generates code. It has no dependencies.")

(defn code-gen []
  (println "generating code..."))

src/leinginen/my_compile.clj

(ns leiningen.my-compile
  "This task does the compilation. It depends on code-gen."
  (:use [leiningen.code-gen]))

(defn my-compile []
  (code-gen)
  (println "compiling..."))

src/leinginen/data_load.clj

(ns leiningen.data-load
  "This task loads the test data. It depends on code-gen."
  (:use [leiningen.code-gen]))

(defn data-load []
  (code-gen)
  (println "loading test data..."))

src/leinginen/my_test.clj

(ns leiningen.my-test
  "This task runs the tests. It depends on compile and data-load."
  (:use [leiningen.my-compile]
        [leiningen.data-load]))

(defn my-test []
  (my-compile)
  (data-load)
  (println "running tests..."))

一个人会期望...

generating code...
compiling...
loading test data...
running tests...

但是数据加载和我的编译都取决于代码 - 基因,因此您的实际ouput是...

generating code...
compiling...
generating code...
loading test data...
running tests...

您将必须记忆代码 - 以防止其运行多次:

(ns leiningen.code-gen
   "This task generates code. It has no dependencies.")

(def code-gen (memoize (fn []
                         (println "generating code..."))))

输出:

generating code...
compiling...
loading test data...
running tests...

这就是我们想要的。

如果每个构建仅运行一次任务,则构建更简单,更有效,因此我们使其在蛋糕构建中的默认行为。这种哲学是数十年历史的,并通过构建工具的血统共享。您仍然可以使用功能,您仍然可以反复称呼它们,并且您始终拥有Clojure的全部功能。

Lein只是为您提供了一个简单的函数作为一项任务,但是附加的限制是它必须在SRC中具有自己的名称空间。如果任务取决于它,则将在一个单独的名称空间中,并且必须使用/要求对方中的另一个名称空间 ns 宏。相比之下,蛋糕制造看起来更加整洁。

另一个关键区别是如何将任务附加到。假设我们想添加 my-test 作为Cake/Lein内置的先决条件 jar 任务。在蛋糕中,您可以使用 deftask 宏以附加任务的表格和依赖项。

(deftask jar #{my-test})

Lein使用罗伯特·胡克(Robert Hooke)来附加任务。这是一个非常酷的图书馆,以每个人最喜欢的天然Philosper的名字命名,但需要一个宏才能简洁 deftask.

(add-hook #'leiningen.jar/jar (fn [f & args]
                                (my-test)
                                (apply f args)))

蛋糕还具有全球项目的概念。您可以将特定于用户的DEV依赖性(如Swank)添加到 ~/.cake/project.clj 并在您的所有项目中拥有它。全球项目还用于启动在一个项目以外进行实验。 Lein通过支持每个用户配置来实现类似的功能 ~/.lein/init.clj, ,以及全局插件 ~/.lein/plugins. 。通常,Lein目前拥有比Cake更丰富的插件生态系统,但Cake开箱即用(战争,部署,Java汇编,本地依赖性,Clojars和Swank)包含更多的任务。 CLJR也可能值得一看,这实际上只是一个带有软件包经理的全球项目,但是没有构建功能(但是我没有它的经验)。

正如技术指出的那样,真正的不可恢复的差异是任务定义。在我的(有偏见的)意见中,蛋糕处理任务要好得多。当我们开始使用Lein中的项目缓冲区开始使用协议缓冲区时,对任务依赖模型的需求变得很明显。 Protobufs是我们所有任务的先决条件,但是编译它们确实很慢。我们也有很多相互依存的任务,因此任何构建都是痛苦的。对于我创建的每个任务,我也不喜欢单独的名称空间的要求,也不喜欢一个额外的SRC文件。开发人员 应该 创建很多任务,Lein的方法通过产生过多的摩擦来劝阻这一点。使用蛋糕,您只需在project.clj中使用deftask宏即可。

蛋糕还很年轻,正在进行中,但这是一个非常活跃的项目。

作为2011-11-15,宣布蛋糕和Lein合并

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top