Reden voor het overslaan van AOT?

In veel noir-apps heb ik de onderstaande verklaring gezien. Wat is het doel van het overslaan van aot? Wanneer gebruiken en wanneer niet gebruiken? Alle voordelen/nadelen?

:main ^{:skip-aot true} sample-app.server
25
clojure.org/compilation Dat beantwoordt de bovenstaande vraag.
toegevoegd de auteur murtaza52, de bron

1 antwoord

Dit is niet specifiek voor noir, maar één scenario dat u misschien wilt overslaan AOT voor een bepaalde naamruimte is wanneer u uw code distribueert naar een PaaS-provider zoals heroku.

Heroku voert standaard AOT-compilatie van uw code uit, dus overweeg dit fragment in uw server.clj:

(db/connect! (System/getenv "DB_URL"))

(defn start [port]
  (run-jetty app {:port port :join? false :max-threads 100}))

In principe lijkt deze code onschadelijk en zal deze lokaal werken, ongeacht of deze AOT-gecompileerd is.

Tijdens de compilatie op heroku is de omgevingsvariabele "DB_URL" nog niet beschikbaar, dus de bovenstaande instructie connect! probeert verbinding te maken met nul en een uitzondering te genereren.

Het overslaan van de AOT-compilatie van deze naamruimte is een manier om dit te voorkomen.

Een andere, en mijn voorkeursbenadering zou het op dit moment zijn om dit enigszins te veranderen:

(defn bootstrap! []
  (db/connect! (System/getenv "DB_URL")))

(defn start [port]
  (bootstrap!)  
  (run-jetty app {:port port :join? false :max-threads 100}))

Op die manier is het een beetje duidelijker wat uw bedoeling is en vermijdt u een databaseverbinding tijdens de compilatie.

Ik heb dit op de harde manier geleerd en gedocumenteerd in deze blogpost .

Ik hoop dat dit nuttig is.

27
toegevoegd