In molte app noir ho visto la seguente dichiarazione. Qual è lo scopo di saltare a più? Quando usarlo e quando non usarlo? Eventuali vantaggi/svantaggi?Motivo per saltare AOT?
:main ^{:skip-aot true} sample-app.server
In molte app noir ho visto la seguente dichiarazione. Qual è lo scopo di saltare a più? Quando usarlo e quando non usarlo? Eventuali vantaggi/svantaggi?Motivo per saltare AOT?
:main ^{:skip-aot true} sample-app.server
Questo non è specifico per noir, ma uno scenario che si potrebbe desiderare di saltare AOT per un determinato spazio dei nomi è quando si distribuisce il codice a un provider PaaS come Heroku.
Heroku esegue AOT compilation del codice di default in modo da considerare questo frammento nel vostro server.clj:
(db/connect! (System/getenv "DB_URL"))
(defn start [port]
(run-jetty app {:port port :join? false :max-threads 100}))
In linea di principio questo codice sembra innocuo e funziona a livello locale a prescindere che sia AOT-compilato.
Tuttavia durante la compilazione sul Heroku, la variabile d'ambiente "DB_URL" non è disponibile eppure così la dichiarazione di cui sopra connect!
cercherà di connettersi a nil
e un'eccezione.
Salta La compilazione di questo spazio dei nomi in AOT è un modo per impedirlo.
Un altro, e il mio approccio preferito in questo momento sarebbe quello di cambiare leggermente per questo:
(defn bootstrap! []
(db/connect! (System/getenv "DB_URL")))
(defn start [port]
(bootstrap!)
(run-jetty app {:port port :join? false :max-threads 100}))
In questo modo è un po 'più chiaro ciò che la vostra intenzione è e si evita di tentare una connessione al database durante la compilazione.
Ho imparato questo nel modo più difficile e l'ho documentato in this blog post.
Spero che questo sia utile.
http://clojure.org/compilation Questo risponde alla domanda precedente. – murtaza52