LifeCycle Management for Clojure Development Clojure 开发的生命周期管理
About Me <ul><li>孙宁
@Sunng
Tekelec, Nanjing
http://sunng.info/
http://github.com/sunng87 </li></ul>
My Clojure Projects <ul><li>Reddit.clj
Lein-control / Clojure-Control
Geohash
Rage Viewer </li><ul><li>http://rageviewer.cloudfoundry.com/ </li></ul></ul>
Agenda <ul><li>构建工具
版本控制
IDE
开发
发布
部署 </li></ul>
Agenda <ul><li>构建工具
版本控制
IDE
开发
发布
部署 </li></ul>
Build Tools <ul><li>Lancet
Leiningen  ['laɪnɪŋən]
Cake
Maven
Gradle </li></ul>
Build - Lancet <ul><li>基于Ant的Clojure构建工具(库)
build.clj 以clojure语法替代Ant XML
作为Programming Clojure一书的例子 </li></ul>
Build Tools - Leiningen <ul><li>基于Lancet库
基于Maven的依赖管理/共享Maven本地仓库
标准的项目骨架
基于插件的扩展机制 </li><ul><li>lein-ring 用于web开发 </li></ul><li>常用Task </li><ul><li>new/deps/repl/test/install/uberjar </li></ul></ul>
Build Tools - Leiningen (defproject clooj &quot;0.1.18&quot; :description &quot;clooj, a small IDE for clojure&quot; :main...
Build Tools - Leiningen (defproject reddit.clj &quot;0.2.0&quot; :description &quot;A reddit API wrapper for clojure&quot;...
Build Tools - Leiningen (defproject rageviewer &quot;1.0.0-SNAPSHOT&quot; :description &quot;A rage comic viewer&quot; :de...
Build Tools - Leiningen <ul><li>Lein 与 Maven 的区别 </li><ul><li>简化的 coordinator
dependencies 和 dev-dependencies
依赖拷贝到项目目录( Ant 方式)
支持可运行的插件(例如 swank-clojure ) </li></ul></ul>
Build Tools - Cake <ul><li>兼容lein的项目框架,兼容lein的project.clj
快速启动 </li><ul><li>JVM后台进程 / Ruby 命令行客户端 </li></ul><li>改进的Task定义DSL </li><ul><li>Explanation on StackOverflow </li></ul></ul>
Build Tools - Maven <ul><li>clojure-quickstart  Archetype </li><ul><li>Github page </li></ul><li>clojure-maven-plugin </li...
Build Tools - Gradle <ul><li>Clojuresque, Gradle的clojure插件 </li><ul><li>Bitbucket page </li></ul></ul>apply plugin: &quot;...
Build Tools - Wrap Up <ul><li>对原生的clojure项目优先选择lein </li><ul><li>社区事实标准
大量插件 </li></ul><li>频繁构建可以考虑cake/lein interactive
Upcoming SlideShare
Loading in …5
×

Clojure cnclojure-meetup

3,315 views

Published on

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,315
On SlideShare
0
From Embeds
0
Number of Embeds
403
Actions
Shares
0
Downloads
69
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Clojure cnclojure-meetup

  1. 1. LifeCycle Management for Clojure Development Clojure 开发的生命周期管理
  2. 2. About Me <ul><li>孙宁
  3. 3. @Sunng
  4. 4. Tekelec, Nanjing
  5. 5. http://sunng.info/
  6. 6. http://github.com/sunng87 </li></ul>
  7. 7. My Clojure Projects <ul><li>Reddit.clj
  8. 8. Lein-control / Clojure-Control
  9. 9. Geohash
  10. 10. Rage Viewer </li><ul><li>http://rageviewer.cloudfoundry.com/ </li></ul></ul>
  11. 11. Agenda <ul><li>构建工具
  12. 12. 版本控制
  13. 13. IDE
  14. 14. 开发
  15. 15. 发布
  16. 16. 部署 </li></ul>
  17. 17. Agenda <ul><li>构建工具
  18. 18. 版本控制
  19. 19. IDE
  20. 20. 开发
  21. 21. 发布
  22. 22. 部署 </li></ul>
  23. 23. Build Tools <ul><li>Lancet
  24. 24. Leiningen ['laɪnɪŋən]
  25. 25. Cake
  26. 26. Maven
  27. 27. Gradle </li></ul>
  28. 28. Build - Lancet <ul><li>基于Ant的Clojure构建工具(库)
  29. 29. build.clj 以clojure语法替代Ant XML
  30. 30. 作为Programming Clojure一书的例子 </li></ul>
  31. 31. Build Tools - Leiningen <ul><li>基于Lancet库
  32. 32. 基于Maven的依赖管理/共享Maven本地仓库
  33. 33. 标准的项目骨架
  34. 34. 基于插件的扩展机制 </li><ul><li>lein-ring 用于web开发 </li></ul><li>常用Task </li><ul><li>new/deps/repl/test/install/uberjar </li></ul></ul>
  35. 35. Build Tools - Leiningen (defproject clooj &quot;0.1.18&quot; :description &quot;clooj, a small IDE for clojure&quot; :main clooj.core :dependencies [[clojure &quot;1.2.1&quot;] [clojure-contrib &quot;1.2.0&quot;]])
  36. 36. Build Tools - Leiningen (defproject reddit.clj &quot;0.2.0&quot; :description &quot;A reddit API wrapper for clojure&quot; :dependencies [[org.clojure/clojure &quot;1.2.1&quot;], [clj-http &quot;0.1.3&quot;], [org.clojure/clojure-contrib &quot;1.2.0&quot;]] :dev-dependencies [[lein-clojars &quot;0.6.0&quot;] [org.clojars.weavejester/autodoc &quot;0.9.0&quot; :exclusions [ org.clojure/clojure-contrib org.clojure/clojure]]])
  37. 37. Build Tools - Leiningen (defproject rageviewer &quot;1.0.0-SNAPSHOT&quot; :description &quot;A rage comic viewer&quot; :dependencies [[org.clojure/clojure &quot;1.2.1&quot;] [org.clojure/clojure-contrib &quot;1.2.0&quot;] [compojure &quot;0.6.5&quot;] [reddit.clj &quot;0.1.1&quot;] [clj-redis &quot;0.0.12&quot;]] :dev-dependencies [[lein-ring &quot;0.4.5&quot;] [lein-control &quot;0.1.1&quot;]] :ring {:handler rageviewer.core/app :init rageviewer.core/app-init})
  38. 38. Build Tools - Leiningen <ul><li>Lein 与 Maven 的区别 </li><ul><li>简化的 coordinator
  39. 39. dependencies 和 dev-dependencies
  40. 40. 依赖拷贝到项目目录( Ant 方式)
  41. 41. 支持可运行的插件(例如 swank-clojure ) </li></ul></ul>
  42. 42. Build Tools - Cake <ul><li>兼容lein的项目框架,兼容lein的project.clj
  43. 43. 快速启动 </li><ul><li>JVM后台进程 / Ruby 命令行客户端 </li></ul><li>改进的Task定义DSL </li><ul><li>Explanation on StackOverflow </li></ul></ul>
  44. 44. Build Tools - Maven <ul><li>clojure-quickstart Archetype </li><ul><li>Github page </li></ul><li>clojure-maven-plugin </li><ul><li>clojure-contrib基于这个插件 pom.xml </li></ul></ul>
  45. 45. Build Tools - Gradle <ul><li>Clojuresque, Gradle的clojure插件 </li><ul><li>Bitbucket page </li></ul></ul>apply plugin: &quot;clojure&quot; repositories { mavenCentral() clojarsRepo() } dependencies { compile 'org.clojure:clojure:1.2.1' }
  46. 46. Build Tools - Wrap Up <ul><li>对原生的clojure项目优先选择lein </li><ul><li>社区事实标准
  47. 47. 大量插件 </li></ul><li>频繁构建可以考虑cake/lein interactive
  48. 48. 与java结合可以考虑gradle和maven </li></ul>
  49. 49. Agenda <ul><li>构建工具
  50. 50. 版本控制
  51. 51. IDE
  52. 52. 开发
  53. 53. 发布
  54. 54. 部署 </li></ul>
  55. 55. Version Control <ul><li>Git </li><ul><li>lein new 默认生成 .gitignore 文件
  56. 56. Clojure社区生存在github上 </li></ul></ul>
  57. 57. Agenda <ul><li>构建工具
  58. 58. 版本控制
  59. 59. IDE
  60. 60. 开发
  61. 61. 发布
  62. 62. 部署 </li></ul>
  63. 63. IDE <ul><li>Emacs
  64. 64. Vim: VimClojure
  65. 65. Eclipse: Counterclockwise
  66. 66. Netbeans: Enclojure
  67. 67. IDEA: La Clojure
  68. 68. Clooj </li></ul>
  69. 69. IDE Features Emacs VimClojure Counterclockwise Enclojure La Clojure Clooj Syntax Helper H,BM H,BM H,BM H,F,BM H,F,BM BM Symbol Browser ○ ○ ● ● ● X Debugger X X ● ● ● X REPL ● ● ● ● ● ● Code Assist ● ● ● ● ● ○ Refactoring X X X X ● X H: Syntax Highlighting; F: Folding; BM: Brace Matching
  70. 70. IDE - clooj <ul><li>轻量级(~5MB)基于swing
  71. 71. 支持独立运行和嵌入式运行方式
  72. 72. 开发者@arthuredelstein,托管在 github 上
  73. 73. 内置REPL
  74. 74. 可以识别 lein/cake 项目骨架
  75. 75. 活跃开发中,每天一个build </li></ul>
  76. 76. IDE - clooj
  77. 77. IDE - La Clojure
  78. 78. IDE Conclusion <ul><li>选择熟练的编辑器
  79. 79. 推荐La Clojure </li><ul><li>功能最完备
  80. 80. 支持Leiningen </li></ul></ul>
  81. 81. Agenda <ul><li>构建工具
  82. 82. 版本控制
  83. 83. IDE
  84. 84. 开发
  85. 85. 发布
  86. 86. 部署 </li></ul>
  87. 87. Development <ul><li>调试
  88. 88. 单元测试
  89. 89. 持续集成 </li></ul>
  90. 90. Development - Debug <ul><li>clojure.contrib.trace </li><ul><li>dotrace </li><ul><ul><li>自1.2后不再支持内联/递归函数 </li></ul></ul></ul></ul>geohash.core=> (dotrace [do-encode] (encode 32.112 119.34 7)) TRACE t200: (do-encode 32.112 119.34 7 {:maxlon 180, ... TRACE t200: => &quot;wtsyetu&quot; &quot;wtsyetu&quot;
  91. 91. Development - Debug <ul><li>Clojure debugging toolkit (CDT) </li><ul><li>基于标准的Java Debugger Interface
  92. 92. 通过以下参数启动JVM: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8030
  93. 93. Docs </li></ul></ul>
  94. 94. Development - Debug <ul><li>通过定义宏print输出
  95. 95. SO 上关于Debug Macro的讨论 </li></ul>(defmacro dbg [x] `(let [x# ~x] (println &quot;dbg:&quot; '~x &quot;=&quot; x#) x#))
  96. 96. Development – UnitTest <ul><li>clojure.test
  97. 97. 通过宏 deftest 创建单元测试例
  98. 98. 目前只有一个断言函数: is
  99. 99. 通过 run-tests 运行
  100. 100. 在 lein 项目里执行 lein test </li></ul>
  101. 101. Development - CI <ul><li>build.clojure.org 使用 Hudson
  102. 102. 目前还没有支持Leiningen的Jenkins/Hudson 插件(运行测试例并生成报表)
  103. 103. 但可以在Jenkins/Hudson中通过运行自定义shell命令构建Leiningen 项目( link )
  104. 104. Travis.org 可以对github项目进行定时构建,支持lein </li></ul>
  105. 105. Agenda <ul><li>构建工具
  106. 106. 版本控制
  107. 107. IDE
  108. 108. 开发
  109. 109. 发布
  110. 110. 部署 </li></ul>
  111. 111. Publish - Clojars <ul><li>Clojars.org 仓库 </li><ul><li>是一个Maven2仓库
  112. 112. 对developer权限完全开放 </li></ul><li>将开源clojure库发布到clojars </li><ul><li>scp pom.xml project.jar to clojars
  113. 113. Leiningen clojars plugin: lein push </li></ul></ul>
  114. 114. Publish - Nexus <ul><li>发布到 Maven 私服
  115. 115. 在 project.clj 中定义仓库 : </li><ul><li>:repositories {“releases” {:url ...} }
  116. 116. 类似于 maven pom.xml 中 distributeManagement
  117. 117. lein deploy releases </li></ul></ul>
  118. 118. Publish - Documentation <ul><li>通过autodoc 自动生成文档
  119. 119. 配置autodoc的lein插件 </li><ul><li>注意使用fork的版本 org.clojars.weavejester/autodoc </li></ul></ul>[org.clojars.weavejester/autodoc &quot;0.9.0&quot; :exclusions [ org.clojure/clojure-contrib org.clojure/clojure]
  120. 120. Publish - Documentation <ul><li>将API文档发布到github页面 </li><ul><li>Add autodoc/** to your .gitignore
  121. 121. Remove generated autodoc directory
  122. 122. Clone your repository into autodoc
  123. 123. $ cd autodoc
  124. 124. $ git symbolic-ref HEAD refs/heads/gh-pages
  125. 125. $ rm .git/index
  126. 126. $ git clean -fdx
  127. 127. $ cd .. </li></ul></ul>
  128. 128. Publish - Documentation <ul><ul><li>Generate document with lein autodoc
  129. 129. $ cd autodoc
  130. 130. $ git add -A
  131. 131. $ git commit -m&quot;Documentation update&quot;
  132. 132. $ git push origin gh-pages </li></ul></ul>
  133. 133. Agenda <ul><li>构建工具
  134. 134. 版本控制
  135. 135. IDE
  136. 136. 开发
  137. 137. 发布
  138. 138. 部署 </li></ul>
  139. 139. Deployment <ul><li>lein项目与Maven项目一致
  140. 140. 应用项目通过 lein uberjar进行发布
  141. 141. 程序库通过lein push或lein deploy部署到相应仓库中 </li></ul>
  142. 142. Deployment <ul><li>Web项目,将lein-ring 添加到project.clj: </li><ul><li>:dev-dependencies [[lein-ring “0.4.5”]]
  143. 143. 在 project.clj 中定义 ring-app </li></ul><li>将web项目打成war包: </li><ul><li>lein ring uberwar </li></ul><li>资源文件的处理: </li><ul><li>Ring 插件默认认为资源文件位于 ./resources/ </li></ul></ul>:ring {:handler rageviewer.core/app :init rageviewer.core/app-init}
  144. 144. Deployment <ul><li>通过lein-control 进行大规模部署
  145. 145. 将lein-control添加到project.clj: </li><ul><li>:dev-dependencies [[lein-control “0.1.1”]] </li></ul><li>创建默认的control file: </li><ul><li>lein control init </li></ul></ul>
  146. 146. Deployment – Clojure-Control (defcluster :sunng-info :clients [ {:host &quot;sunng.info&quot; :user &quot;sunng&quot;} ]) (deftask :deploy-war &quot;Deploy war to jetty&quot; [] (scp [&quot;rageviewer.war&quot;] &quot;/home/sunng/jetty/webapps/&quot;)) (deftask :restart-jetty &quot;Restart jetty server&quot; [] (ssh &quot;cd /home/sunng/jetty/; ./bin/jetty.sh restart&quot;)) <ul><li>control.clj </li></ul>
  147. 147. Deployment – Clojure-Control (defcluster :sunng-info :clients [ {:host &quot;sunng.info&quot; :user &quot;sunng&quot;} ]) (deftask :deploy-war &quot;Deploy war to jetty&quot; [] (scp [&quot;rageviewer.war&quot;] &quot;/home/sunng/jetty/webapps/&quot;)) (deftask :restart-jetty &quot;Restart jetty server&quot; [] (ssh (cd &quot;/home/sunng/jetty/&quot; (run &quot;./bin/jetty.sh restart&quot;)) ))
  148. 148. Deployment – Clojure-Control lein control run sunng-info deploy-war lein control run sunng-info restart-jetty
  149. 149. Summary <ul><li>Don't repeat yourself </li></ul>
  150. 150. Thank You !

×