代码之家  ›  专栏  ›  技术社区  ›  Michiel de Mare

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

  •  51
  • Michiel de Mare  · 技术社区  · 14 年前

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

    4 回复  |  直到 13 年前
        1
  •  48
  •   Alex Stoddard    11 年前

    这个答案继续引起人们的兴趣,大概是作为StackOverflow中Leiningen的参考,所以现在对它进行了重要的编辑,以便在2014年更新它。

    雷宁根和蛋糕早在2011年就合并了。Leiningen(版本2)现在是事实上的Clojure自动化工具。

    Leiningen Clojars .

    蛋糕和莱宁根很相似项目.clj但试图通过在后台保留持久化的jvm来避免大量的启动开销。在基于REPL的迭代开发的典型过程中,由于持久化进程(旧的函数定义等)中的累积状态,这是一种更具响应性的方法,但也为bug带来了便利。结果这是一个糟糕的交易。

    莱宁根的经验和对更快启动时间的持续渴望,导致了许多加快速度的建议和方法: https://github.com/technomancy/leiningen/wiki/Faster

        2
  •  24
  •   user61051 user61051    14 年前

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

    Leiningen的方法是“在定义了函数之后很难扩展它们,所以我们应该找到一种简单的方法来实现这一点;这样我们可以将函数用于任务,也可以扩展不是任务的东西”,这样就可以将函数的所有可组合性优势应用于任务。

        3
  •  20
  •   lancepantz    14 年前

    正如Alex提到的,最显著的区别是命令行的速度。Cake使用一个持久的JVM,因此只有在第一次在项目中运行任务时才会遇到JVM启动开销。如果您不使用emacs+slime+clojure测试模式,这可能会节省大量时间。例如,在我的一个项目上运行一组相当大的测试0.3分蛋糕中的秒,vs11.2秒在莱恩。

    除了性能,cake背后的核心思想是依赖任务模型。考虑到依赖关系图中所有可传递的先决条件,每个任务在给定的生成中只运行一次。这里有一个来自 Martin Fowler's article on rake 在cake语法中,它直接进入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中执行同样的操作,首先必须在项目中创建一个Leiningen目录,其中包含4个文件:code_gen.clj、compile.clj、data_load.clj和my_test.clj。

    (ns leiningen.code-gen
       "This task generates code. It has no dependencies.")
    
    (defn code-gen []
      (println "generating code..."))
    

    src/莱宁根/我的编译.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/leiningen/数据加载.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/leiningen/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...
    

    但是数据加载和我的编译都依赖于代码生成,所以你的实际输出是。。。

    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..."))))
    

    输出:

    正在生成代码。。。
    正在加载测试数据。。。
    正在运行测试。。。
    

    如果每个构建只运行一次任务,那么构建会更简单、更高效,因此我们将其作为cake构建中的默认行为。这种哲学已有几十年的历史,并且由一系列的构建工具所共享。您仍然可以使用函数,您仍然可以反复调用它们,并且您始终可以使用clojure的全部功能。

    ns 宏。相比之下,蛋糕看起来更整洁和简洁。

    另一个关键区别是如何附加任务。假设我们想添加 my-test 作为蛋糕/莱恩的先决条件 jar deftask

    (deftask jar #{my-test})
    

    Lein使用Robert Hooke附加到任务中。这是一个非常酷的图书馆,以每个人最喜欢的自然哲学圈命名,但它需要一个宏来简化 解除武装 .

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

    ~/.cake/project.clj 把它贯穿到你所有的项目中。全局项目还用于在项目外部启动repl进行实验。Lein通过支持 ~/.lein/init.clj ~/.lein/plugins . 一般来说,Lein目前拥有比cake更丰富的插件生态系统,但是cake包含更多现成的任务(war、deploy、java编译、本机依赖项、clojars和swank)。Cljr可能也值得一看,它本质上只是一个带有包管理器的全局项目,但是没有构建功能(但是我没有这方面的经验)。

    正如technomancy所指出的,真正不可调和的区别是任务定义。在我看来,蛋糕能更好地处理任务。当我们在lein项目中开始使用协议缓冲区时,对任务依赖模型的需求就变得很明显了。protobuf是我们所有任务的先决条件,但是编译它们非常慢。我们也有很多相互依赖的任务,所以任何构建都是痛苦的。我也不喜欢为我创建的每个任务都需要一个单独的名称空间,因此需要一个额外的src文件。开发商 创建很多任务,lein的方法通过创建太多的摩擦来阻止这一点。使用cake,您可以在项目.clj.

        4
  •  7
  •   zmx    13 年前

    截至2011年11月15日 cake and lein merge