我正在玩Heroku上部署Clojure / Noir应用程序,我的应用程序大部分都在工作。但是,我需要的最后一件事是在Heroku上部署时找出我的应用程序的主机名。理想情况下,我想动态地执行此操作,而不是对其进行硬编码。
因此,例如,如果我的应用的网址为“http://freez-windy-1800.herokuapp.com”,我希望能够在我的clojure代码中动态获取此内容。
我知道我可以查看传入的请求来解决这个问题,但理想情况下,我想要某种“设置”,我在一次评估表达式并将值保存在变量中然后我可以使用(来自Python / Django世界,我在考虑Clojure中的settings.py
等价物。)
作为参考,我正在部署的代码位于https://github.com/rmanocha/cl-short。
答案 0 :(得分:5)
您可以通过
在Heroku中设置环境变量heroku config:add BASE_IRI=http://freez-windy-1800.herokuapp.com
并在Clojure中读回来
(defn- base-iri []
(or (System/getenv "BASE_IRI") "http://localhost/"))
Heroku已设置您可以使用的PORT
(defn -main []
(let [port (Integer. (or (System/getenv "PORT") 8080))]
(run-jetty #'app {:port port})))
在不同环境中适合我。
答案 1 :(得分:2)
您通常会使用Java标准库中的InetAddress
执行此操作。
(.getCanonicalHostName (java.net.InetAddress/getLocalHost))
但是,这不会进行DNS查找。
答案 2 :(得分:0)
3种获取主机名的方法。随便使用。
(ns service.get-host-name
(require [clojure.java.shell :as shell]
[clojure.string :as str])
(:import [java.net InetAddress]))
(defn- hostname []
(try
(-> (shell/sh "hostname") (:out) (str/trim))
(catch Exception _e
(try
(str/trim (slurp "/etc/hostname"))
(catch Exception _e
(try
(.getHostName (InetAddress/getLocalHost))
(catch Exception _e
nil)))))))