12

我正在尝试在 Heroku 上部署 Clojure/Noir 应用程序,并且我的应用程序大部分都在工作。但是,我需要的最后一件事情是在部署到 Heroku 时弄清楚我的应用程序的主机名。理想情况下,我想动态地执行此操作,而不是对其进行硬编码。

因此,例如,如果我的应用程序的 URL 是“ http://freez-windy-1800.herokuapp.com ”,我希望能够在我的 clojure 代码中动态地获取它。

我知道我可以查看传入的请求来解决这个问题,但理想情况下,我希望有某种“设置”,在其中我评估一次表达式并将值保存在我可以使用的变量中(即将到来来自 Python/Django 世界,我正在考虑settings.pyClojure 中的等价物)。

作为参考,我正在部署的代码可在https://github.com/rmanocha/cl-short获得。

4

3 回答 3

7

您可以通过以下方式在 Heroku 中设置环境变量

heroku config:add BASE_IRI=http://freez-windy-1800.herokuapp.com

并在 Clojure 中读回

(defn- base-iri []
  (or (System/getenv "BASE_IRI") "http://localhost/"))

Heroku 已经设置了你可以使用的端口

(defn -main []
  (let [port (Integer. (or (System/getenv "PORT") 8080))]
    (run-jetty #'app {:port port})))

在不同的环境中为我工作。

于 2012-05-22T10:36:29.700 回答
3

您通常会使用InetAddressJava 标准库来执行此操作。

(.getCanonicalHostName (java.net.InetAddress/getLocalHost))

但是,这不会进行 DNS 查找。

于 2012-05-21T14:04:56.703 回答
-1

获取主机名的 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)))))))
于 2018-09-21T09:04:03.403 回答