《Clojure Web开发实战》——第1章,第1.1节环境设置

本节书摘来自异步社区《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工程:
`wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
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 lein help new.`
一个新的文件夹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函数设置为应用的入口点:
`(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"]]
;;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:
StartedSelectChannelConnector@0.0.0.0:3000
Started server on port 3000`
喔,现在我们已经知道如何创建和运行应用了,接下来不妨考虑一下应该选用什么样的编辑器。
你多半已经留意到,Clojure代码中有大量的括号。保持它们起止对应很快就会成为一种挑战,所幸Clojure编辑器会替我们收拾这个摊子,否则会令人产生严重的挫败感。
事实上,这些编辑器不仅仅能平衡括号,其中的一些甚至能够感知其结构。这就意味着编辑器能够理解一个表达式是从什么地方开始,又到什么地方结束的。因此,我们可以根据逻辑上的代码块来导航和选取,而非简单针对文本行号。
在本章中,我们将会选用Light Table9来开发留言簿应用。获取并运行Light Table是非常容易的,这样我们就能尽快投入到代码的编写中了。然而,它的功能还比较有限,在较大的工程中,你对此可能有较深的体会。“附录1选择IDE”中还有对其他开发环境的讨论。
使用Light Table
Light Table不需要安装,下载完成后即可直接运行。
Light Table的外观相当简洁。默认情况下,它仅在编辑器窗格中显示了几行欢迎信息,如图1-1所示。


《Clojure Web开发实战》——第1章,第1.1节环境设置

为了显示workspace面板,我们可以在菜单中选择View →Workspace,或是按下Ctrl+T(Windows/Linux)组合键或Cmd+T(OS X)组合键。
如图1-2所示,我们可以在workspace的folder标签页中打开留言簿工程。


《Clojure Web开发实战》——第1章,第1.1节环境设置

一旦工程被选中,我们就可以浏览整个工程树,并选择我们想要编辑的文件,如图1-3所示。
现在,开发环境已经就绪,看起来我们终于可以为留言簿应用添加一些功能了。

《Clojure Web开发实战》——第1章,第1.1节环境设置
上一篇:伟仕佳杰与 OceanBase 达成战略合作,共建国产数据库新生态


下一篇:神州数码牵手 OceanBase,共迎国产分布式数据库春天