本节书摘来自异步社区《clojure web开发实战》一书中的第1章,第1.1节环境设置,作者[美]dmitri sotnikov,更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章 起步
clojure web开发实战
在简介部分,我们谈到了在编写应用程序时,采用函数式编程风格能够获得诸多好处。当然,想要学会一门语言,仅仅通过阅读是远远不够的,只有亲手编写一些代码,你才能获得真切的体验。
在本章中,我们将会介绍如何开发一个简单的留言簿应用,用户可以使用它给他人留言。通过它,我们能够了解web应用的基本结构,并且尝试一些高效的clojure开发工具。如果你是一个clojure新手,那我建议你先跳到“附录2 clojure入门”,快速了解一下clojure的基本概念和语法。
1.1 环境设置
clojure需要java虚拟机(jvm,java virtual machine)才能运行,此外,你还需要一份1.6或是更高版本的java开发工具包1(jdk,java development kit)用于开发。clojure是作为一个jar包来分发的,你只需简单地将其包含在工程的class-path中即可。你可以使用任何常规的java工具来构建clojure应用,比方说maven2或者ant3。不过,我强烈建议你使用leiningen4,它是专为clojure定制的。
使用leiningen管理工程
借助leiningen,你可以建立、构建、测试、打包和部署工程。也就是说,它能为你提供工程管理方面的一站式服务。
maven是一个非常流行的java依赖关系管理工具,而leiningen就相当于clojure世界中的maven。重点是,leiningen与maven兼容,因此它可以毫无障碍地访问那些得到精心维护,且存放着海量java类库的存储中心。此外,clojure的库通常可以在clojars5这个存储中心找到。所以,默认情况下leiningen是启用了clojars的。
使用leiningen,你不用手动去下载那些在工程中需要用到的库。你只需要简单地声明一下工程的顶级依赖,剩下的事情leiningen就会帮你自动搞定。
leiningen的安装实在是小菜一碟,只需要从官方主页6上下载并执行安装脚本即可。
不如动手试试看。我们会通过执行下列命令,来下载这个脚本,并创建一个全新的clojure工程:
chmod +x lein
mv lein ~/bin
lein new myapp`
由于这是我们第一次运行lein这个命令,它做的第一件事情是安装它自己。一切顺利的话,你将会看到下面的输出:
`generating a project called myapp based on the 'default' template.
to see other templates (app, lein plug-in, etc), try <code>lein help new</code>.`
一个新的文件夹myapp就创建好了,里面是应用程序的骨架。应用程序的代码存放在src文件夹中。其中有另外一个myapp文件夹,这个文件夹中只有一个文件,名为core.clj。文件内容如下:
`(ns myapp.core)
(defn foo
"i don't do a whole lot."
[x]
(println x "hello, world!"))`
请注意命名空间的声明,与其文件夹结构是相匹配的。由于命名空间core位于myapp目录当中,所以它的名字就是myapp.core。
leiningen工程文件一瞥
在工程文件夹myapp里有一个project.clj文件。这个文件包含了应用程序的描述信息,你可以仔细观察一下,就会发现这个文件是用标准的clojure语法编写的,描述了应用的名称、版本、网址、许可证信息和依赖项,如下所示。
`(defproject myapp "0.1.0-snapshot"
:description "fixme: write description"
:url "http://example.com/fixme"
:license {:name "eclipse public license"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]])`
通过修改这个project.clj文件,能让我们控制应用程序的方方面面。例如,我们可以通过添加:main关键字,将myapp.core命名空间下的foo函数设置为应用的入口点:
:dependencies [[org.clojure/clojure "1.5.1"]]
;;this will set foo as the main function
:main myapp.core/foo)`
此时我们就可以通过执行lein run这个命令来运行应用了。由于foo函数要求传入一个参数,我们只得遵命行事:
`lein run first
first hello, world!`
在前面这个例子中,我们创建的应用非常简单,只有一个依赖项:clojure运行时。如果我们直接以此为基础来开发web应用的话,就免不了要编写大量的样板代码,才能让它运行起来。下面就让我们看看如何利用leiningen的模板,来创建一个开箱即用的web应用吧。
leiningen的模板
当把模板的名称提供给lein脚本时,就可以根据其对应的模板来初始化工程骨架。其实模板自身也不过是使用了lein-newnew插件7的clojure工程罢了。稍后我们将看到如何创建自己的模板。
眼下,我们将会使用compojure-app模板8来初始化下一个应用。执行lein脚本时,模板的名称是作为参数传给new关键字的,紧接其后的是工程名称。为了创建一个web应用,而不是之前那样的默认工程,我们只需执行以下命令即可:
lein new compojure-app guestbook
这样leiningen就知道创建留言簿应用时,应该使用compojure-app模板了。此类应用需要启动一个web服务才能运行。其实这很容易,我们只需要使用lein ring server来替代lein run即可。
当我们运行这个应用时,控制台会输出如下信息,与此同时还会弹出一个打开了应用主页的浏览器窗口。
`lein ring server
guestbook is starting
2013-07-14 18:21:06.603:info:oejs.server:jetty-7.6.1.v20120215
2013-07-14 18:21:06.639:info:oejs.abstractconnector:
[email protected]:3000
started server on port 3000`
喔,现在我们已经知道如何创建和运行应用了,接下来不妨考虑一下应该选用什么样的编辑器。
你多半已经留意到,clojure代码中有大量的括号。保持它们起止对应很快就会成为一种挑战,所幸clojure编辑器会替我们收拾这个摊子,否则会令人产生严重的挫败感。
事实上,这些编辑器不仅仅能平衡括号,其中的一些甚至能够感知其结构。这就意味着编辑器能够理解一个表达式是从什么地方开始,又到什么地方结束的。因此,我们可以根据逻辑上的代码块来导航和选取,而非简单针对文本行号。
在本章中,我们将会选用light table9来开发留言簿应用。获取并运行light table是非常容易的,这样我们就能尽快投入到代码的编写中了。然而,它的功能还比较有限,在较大的工程中,你对此可能有较深的体会。“附录1选择ide”中还有对其他开发环境的讨论。
使用light table
light table不需要安装,下载完成后即可直接运行。
light table的外观相当简洁。默认情况下,它仅在编辑器窗格中显示了几行欢迎信息,如图1-1所示。
为了显示workspace面板,我们可以在菜单中选择view →workspace,或是按下ctrl+t(windows/linux)组合键或cmd+t(os x)组合键。
如图1-2所示,我们可以在workspace的folder标签页中打开留言簿工程。
一旦工程被选中,我们就可以浏览整个工程树,并选择我们想要编辑的文件,如图1-3所示。
现在,开发环境已经就绪,看起来我们终于可以为留言簿应用添加一些功能了。