Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,389 views

Published on

Published in: Technology
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2u6xbL5 ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❤❤❤ http://bit.ly/2u6xbL5 ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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 !

×