部署compojure应用程序,它也是一个CLI应用程序

时间:2015-06-17 14:56:37

标签: clojure compojure

我有一个Clojure应用程序,我可以在命令行和Compojure应用程序中使用它。 我通过在我的leiningen clojure.tools.cli中放置一个环处理程序和一个主函数(project.clj)来做到这一点。

{... :main my-app.core :ring {:handler my-app.handler/handler }}

handler定义为(defroutes handler ...)

现在,如果我想运行CLI应用程序,我可以运行lein uberjar,然后运行java -jar arguments。 我还可以通过lein ring server PORT运行Compojure应用程序。

现在,如何在生产服务器中将事物部署为Compojure应用程序(而不是CLI应用程序)? (用于解释lein ring server如何工作的奖励积分。)

注意:如果可以提供帮助,我已经使用了nginx,并且我对要使用的容器非常灵活。

2 个答案:

答案 0 :(得分:2)

这是我用于新项目的默认模板。它允许您对环应用程序执行依赖项注入,并从命令行运行应用程序作为uberjar。您可以在此处阅读更多内容:http://www.sparxeng.com/blog/software/improved-clojure-workflow

; handler.clj    
(defn wrap-inject-deps
  "Ring middleware that injects the dependencies into each ring request map"
  [handler deps]
  (fn [req]
    (handler (assoc req :deps deps))))

(defn create-handler
  "Similar to the default ring 'handler', but with a parameter to let you inject dependencies"
  [deps]
  (-> (routes
        api-routes
        web-routes
        (route/resources "/"))
      (kwp/wrap-keyword-params)
      (params/wrap-params)
      (json/wrap-json-params)
      (json/wrap-json-response)
      (wrap-inject-deps deps))) ; this injects dependencies

(defn start-jetty
  "Launch the Jetty instance"
  [deps]
  (let [port (Integer. (or (-> system :env :port) 5000))
        handler (create-handler deps)]
    (jetty/run-jetty handler {:port port :join? false})))


; system.clj
(defn get-env
  "Initialize configuration vars"
  []
  {:aws-access-key-id     (System/getenv "AWS_ACCESS_KEY_ID")
   :aws-secret-access-key (System/getenv "AWS_SECRET_ACCESS_KEY")
   :mongo-url             (System/getenv "MONGO_URL"))

(defn start
  "Launch dependencies such as DB connection and Jetty. Return these as a map, for use in REPL"
  [& [env]]
  (let [env (or env (get-env))
        deps {:env     env
              :monger  (db/init env)}
        jetty (handler/start-jetty deps)]
    (assoc deps :jetty jetty)))


; program.clj
(defn -main [& [port]]
  "App entrypoint"
  (let [env (system/get-env) ; "env" is just a map of config variables, that can be hard-coded, read from file, or whatever you want.
        env (if port (assoc env :port port) env)]
    (system/start env)))

如果您需要使用代码库中的不同入口点创建多个应用,则可以使用leiningen配置文件。

答案 1 :(得分:1)

lein ring server启动jetty以投放您已构建的网络应用程序。它通过使用您在:ring中指定的选项启动服务器来完成此操作。如果在环境中指定LEIN_NO_DEV,则服务器将以生产模式运行。码头是否适合您的制作需要,由您决定。

如果您想在其他服务器上运行Web应用程序,则有多个选项。其中一个是在Tomcat上运行。再看一下lein ring的文档,特别是关于war文件的部分。基本上,您可以致电lein warlein uberwar来生成war文件。你可以,例如将war文件放入Tomcat的webapps目录。

另一种选择是使用immutant,其中包含有关安装和运行应用程序的大量文档。