I'm ready to release my clojurescript app. Currently i do lein ring uberjar to create my jar, which does build cljs, but i dont see any documentation on how to do a release build-- do i need to do any concat-ing/minifying/bla bla bla? Are there special release options?
Here is my cljsbuild setup in my project.clj->
{
:builds [{:id "dev"
:source-paths ["src/analyticsjs"]
:figwheel false
:clean-targets ^{:protect false} ["resources/public/js/compiled" "target"]
:compiler {:main "analyticsjs.core"
:asset-path "/js"
:output-to "resources/public/js/cljs.js"
:output-dir "resources/public/js"}}
]
}
All help is appreciated. Thanks!
I was directed in the clojurians slack channel to add :optimizations :advanced inside my :compiler map, which worked.
Related
I have been using Clojure, ClojureScript, lein, shadow-cljs, Emacs,
and CIDER to work on a Clojure/ClojureScript dynamic web app project.
Usually, I build the project by executing the command
cider-jack-in-cljs in Emacs, choosing shadow-cljs, then shadow
for REPL type, and, finally, app for the building option.
Things were working fine. I was used to watching changes on the UI on
localhost:3005.
But, an answer from a previous question indicated that the
project was using an old (and deprecated) HTTP configuration for
shadow-cljs.
On shadow-cljs.edn we had:
{:source-paths ["src" "dev"]
:dependencies ...omitted..
:nrepl {:port 8230
:nrepl-middleware [dirac.nrepl/middleware]}
:builds {:app {
:devtools {:after-load app.core/main
:http-root "public"
:http-port 3005
:preloads [shadow.cljs.devtools.client.hud
day8.re-frame-10x.preload
dirac.runtime.preload
devtools.preload]}
}}}}}
After the build was complete, I would see the live application on
localhost:3005. The mini-buffer would direct me to see the
rendered page on the browser.
On shadow-cljs.edn, now, we have:
{:source-paths ["src" "dev"]
:dependencies ...omitted..
:nrepl {:port 8230
:nrepl-middleware [dirac.nrepl/middleware]}
:builds {:app {
:devtools {:after-load app.core/main
:preloads [shadow.cljs.devtools.client.hud
day8.re-frame-10x.preload
dirac.runtime.preload
devtools.preload]}
:dev-http {3005 "public"}
}}}}}
However, the workflow for development is different.
Emacs mini-buffer redirects me on the browser to a different address:
http://localhost:9630/dashboard
Also, old localhost:3005 does not work, even though it is mentioned
on :dev-http {3005 "public"}.
1 - What is the new workflow to change the code and see the changes?
2 - Why is port localhost:3005 not working anymore even though it is mentioned in the source code?
3 - What is the purpose of the dashboard?
:dev-http is a top-level config. It is not part of a build config. It needs to sit at the same level as :nrepl and :builds.
{:source-paths ["src" "dev"]
:dependencies ...omitted..
:nrepl {:port 8230
:nrepl-middleware [dirac.nrepl/middleware]}
:dev-http {3005 "public"}
:builds
{:app
{...
:devtools
{:after-load app.core/main
:preloads
[day8.re-frame-10x.preload
dirac.runtime.preload
devtools.preload]}}}}}}
I have a simple Figwheel application which is built with Leiningen.
I want to have multiple pages in it:
index.html should use the code from hello-figwheel.core.
page2.html should use the code from hello-figwheel.page2
I assume I have to somehow modify the project.clj file:
:compiler {:main hello-figwheel.core
:asset-path "js/compiled/out"
:output-to "resources/public/js/compiled/hello_figwheel.js"
:output-dir "resources/public/js/compiled/out"
:source-map-timestamp true
;; To console.log CLJS data-structures make sure you enable devtools in Chrome
;; https://github.com/binaryage/cljs-devtools
:preloads [devtools.preload]}}
How can I tell Leiningen to compile
hello-figwheel.core to resources/public/js/compiled/hello_figwheel.js and
hello-figwheel.page2 to resources/public/js/compiled/page2.js?
There is a similar question. The difference to this one is that Leiningen is used to run Figwheel.
Update 1: I added the following to the project.clj file:
{
:id "page2"
:source-paths ["src"]
:compiler {
:output-dir "resources/public/js/compiled/page2"
:output-to "resources/public/js/compiled/page2/main.js"
:main hello-figwheel.page2
:asset-path "js/compiled/out"
:source-map-timestamp true
;; To console.log CLJS data-structures make sure you enable devtools in Chrome
;; https://github.com/binaryage/cljs-devtools
:preloads [devtools.preload]}
:figwheel {:on-jsload "hello-figwheel.page2/on-js-reload"
;; :open-urls will pop open your application
;; in the default browser once Figwheel has
;; started and compiled your application.
;; Comment this out once it no longer serves you.
:open-urls ["http://localhost:3449/page2.html"]}
}
When I run lein figwheel, the REPL is unable to connect to my web application:
It says Prompt will show when Figwheel connects to your application, but it never happens.
Also, if I open http://localhost:3449/page2.html in the browser, update page2.cljs, and refresh the page in the browser, the changes are not visible there.
I'm trying to use figwheel build for my project. I use the latest versions of libs and my leiningen version is 2.5.1. My build file looks like this:
(defproject figwheel-issue "1.2.3"
:plugins [[lein-cljsbuild "1.0.6"]
[lein-figwheel "0.3.3"]]
:dependencies [[org.clojure/clojurescript "0.0-3269"]
[org.clojure/clojure "1.7.0-beta3"]]
:cljsbuild {
:builds [{ :id "dev"
:source-paths ["src"]
:figwheel true
:compiler {
:main myproject/core
:hashbang false
:asset-path "js/out"
:output-to "resources/public/js/example.js"
:output-dir "resources/public/js/out"
:optimizations :none}}]})
Normal build works ok. So when I run:
lein cljsbuild once
I get:
Successfully compiled "resources/public/js/example.js" in 0.873 seconds.
But when I try to run:
lein figwheel
Figwheel build can't seem to find my core namespace:
Compiling "resources/public/js/example.js" failed.
clojure.lang.ExceptionInfo: failed compiling file:target/figwheel_temp/dev/figwheel/connect.cljs
at clojure.core$ex_info.invoke (core.clj:4591)
Caused by: clojure.lang.ExceptionInfo: No such namespace: core, could not locate core.cljs, core.cljc, or Closure namespace "core" at line 1 target/figwheel_temp/dev/figwheel/connect.cljs
at clojure.core$ex_info.invoke (core.clj:4591)
Any ideas what could be wrong? I created a minimal github project which demonstrates the issue here:
https://github.com/auramo/figwheel-build-issue
Problem was the namespace, it should be:
:main myproject.core
I am seriously pulling my hair right now! I am a total noob at clojure: I can't seem to be able to get a simple clojurescript compilation done without this error:
ERROR: JSC_MISSING_PROVIDE_ERROR. required "clojure.core.async" namespace never provided at /home/jldupont/workspace/$someproject/target/cljsbuild-compiler-0/domain2/main.js line 4 : 0
I've got the following project.clj file:
(defproject $someproject "0.1"
:description "some project..."
:dependencies [[org.clojure/clojure "1.5.1"]
[org.clojure/clojurescript "0.0-2030"]
[org.clojure/core.async "0.1.267.0-0d7780-alpha"]
]
:plugins [[lein-cljsbuild "0.3.2"]]
:cljsbuild {
:builds [{:id "domain2"
:source-paths ["src/cljs/model2/domain"]
:compiler {:output-to "src/assets/js/model2/domain/domain2.js"
:optimizations :advanced
:pretty-print true}
}
]
}
)
Everytime I use lein cljsbuild auto I get the error quoted above.
Please help!
Update
I've looked in my ~/.m2 directory and the dependencies ( in this case core.async ) are present.
Update 2
It would appear that it is the Google Closure Compiler that spews out this error message. Not sure how to provide it a path to the dependencies...
As mentioned in my comment above: if you want to use core.async with ClojureScript you have to require the namespace cljs.core.async (instead of Clojure's clojure.core.async).
I have created a Leiningen project on my local machine which I then turn into a template by doing:
lein create-template webdb
: Then I install the template:
cd webdb
lein install
: which allows me to create projects based on the template locally:
lein new webdb anewproject
: Everything works fine up to here. However if I try to deploy the template to clojars using:
cd webdb
lein deploy clojars
: then whenever I try to use the clojars profile to create a template I get an error:
lein new org.clojars.zubairq2/webdb anothernewproject
: gives the error:
Could not find metadata org.clojars.zubairq2/webdb:lein-template/maven-metadata.xml in local (/Users/faroukzquraishi/.m2/repository)
Failure to find org.clojars.zubairq2/webdb:lein-template/maven-metadata.xml in http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
Failure to find org.clojars.zubairq2/webdb:lein-template/maven-metadata.xml in http://clojars.org/repo/ was cached in the local repository, resolution will not be reattempted until the update interval of clojars has elapsed or updates are forced
This could be due to a typo in :dependencies or network issues.
Could not find template org.clojars.zubairq2/webdb on the classpath.
: does anyone know what I am doing wrong here?
Update - project.clj
(defproject cljstemplate "org.clojars.zubairq2/webdb"
:dependencies [
[org.clojure/clojure "1.5.1"]
[org.clojure/google-closure-library-third-party "0.0-2029"]
[domina "1.0.1"]
[crate "0.2.4"]
[prismatic/dommy "0.1.1"]
[korma "0.3.0-RC5"]
[org.postgresql/postgresql "9.2-1002-jdbc4"]
[compojure "1.1.5"]
[shoreleave "0.3.0"]
[shoreleave/shoreleave-remote-ring "0.3.0"]
[ring-middleware-format "0.3.0"]
[ring/ring-json "0.2.0"]
[jayq "2.3.0"]
]
:url "http://org.clojars.zubair2/webdb"
:plugins [
[lein-cljsbuild "0.3.0"]
[lein-httpd "1.0.0"]
[lein-ring "0.8.5"]
]
:source-paths ["src"]
:ring {:handler webapp.framework.server.core/app}
:cljsbuild
{
:builds
[
{
:source-paths ["src"]
:compiler {
:output-to "resources/public/main.js"
:optimizations :simple
:externs ["resources/public/jquery.js" "resources/public/google_maps_api_v3_3.js"]
:pretty-print false
}
}
]
}
)
your upload seems to have worked and the result is here:
https://clojars.org/webdb/lein-template
you can make a project like this:
arthur#a:~$ lein new webdb newproject
Retrieving webdb/lein-template/0.1.0-SNAPSHOT/lein-template-0.1.0-20130618.143034-5.pom from clojars
Retrieving webdb/lein-template/0.1.0-SNAPSHOT/lein-template-0.1.0-20130618.143034-5.jar from clojars
To use a lein plugin, you must make it a dependency it in your .lein/profiles.clj
Since you project is on clojars, if you add its dependency it should be available to you.