Actually, putting Clojurescript and any Clojurescript libraries into :dev
dependencies doesn't quite work in a trouble-free way because it still
breaks the Clojurescript compilation step in some circumstances. If I do
the following:
lein clean
lein uberjar (or lein ring uberwar)
.. then the following error is seen:
Compiling "resources/public/js/script.js" failed.
clojure.lang.ExceptionInfo: Could not locate hiccups/core__init.class or
hiccups/core.clj on classpath: at line 1 {:tag :cljs/analysis-error,
:file nil, :line 1, :column 1}
at clojure.core$ex_info.invoke(core.clj:4327)
<snip>
I guess lein cljsbuild is trying to build the .cljs source into .js
(because lein clean has removed all the generated .js files) but it can't
see any Clojurescript dependencies because the :dev profile isn't active.
I can run
lein with-profile dev uberjar
... which allows lein cljsbuild to see the Clojurescript dependencies, but
then puts Clojurescript and all its dependencies into the resulting uberjar
(which is what I was trying to avoid).
The best way I've found to work round this is always to run lein cljsbuild
once before running lein uberjar. That gives me an uberjar that does not
contain the Clojurescript compiler (nor its dependencies) but it seems like
a bit of a hack to have to do this. Indeed, as far as I understand it,
using the :dev profile in the manner that I am doing seems like a bit of a
hack.
In the long term, a solution might be for Leiningen to differentiate
between Clojurescript and Clojure dependencies and to treat them
differently. Does that sound like it might be sensible?
On 9 June 2014 00:31, Chris Jenkins <[email protected]> wrote:
> Thanks Gary. That fixed it once I realised that another library,
> cljs-ajax, was also pulling in clojurescript. After moving clojurescript,
> hiccups and cljs-alax into the :dev dependencies, I can now run the app or
> create an uberjar or uberwar and it doesn't pull in Clojurescript's
> dependencies.
>
>
>
> On 9 June 2014 00:00, Gary Trakhman <[email protected]> wrote:
>
>> Well, like I mentioned, you can wrap dev-specific dependencies into a
>> :dev profile.
>>
>> :profiles {:dev {:dependencies {[[org.clojure/clojurescript "Blah"]
>> [hiccups "hiccups-version"]}}}
>>
>> they will get merged in when the dev profile is active, but won't end up
>> in artifacts. You could put your :cljsbuild settings in there too, but
>> there's no harm in leaving it top-level.
>>
>> https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md
>>
>>
>> On Sun, Jun 8, 2014 at 6:52 PM, Chris Jenkins <[email protected]>
>> wrote:
>>
>>> If I remove clojurescript from my :dependencies in project.clj, two
>>> things happen:
>>>
>>> 1) When I run lein cljsbuild, it complains and says:
>>>
>>> "WARNING: It appears your project does not contain a ClojureScript
>>> dependency. One will be provided for you by lein-cljsbuild ...<snip>" -
>>> lein-cljsbuild seems to be saying that I *do* need to specify a dependency
>>> on Clojurescript. Is this correct?
>>>
>>> 2) My app depends on hiccups 0.3.0, which in turn pulls in
>>> clojurescript 0.0-2069 This is slightly earlier than the level that I just
>>> removed from my dependencies... but I still don't really want that
>>> dependency to be there. Is hiccups doing the wrong thing here?
>>>
>>> So I still have the same question really: Whether I'm writing an app or
>>> a library, how can I depend upon Clojurescript in such a way that I can run
>>> lein cljsbuild at dev time and generate some .js files, and such that, at
>>> run time, my server-side Clojure code can then forget that Clojurescript
>>> even exists (and certainly not depend upon the Clojurescript compiler)?
>>>
>>>
>>>
>>> On 8 June 2014 23:40, Gary Trakhman <[email protected]> wrote:
>>>
>>>> Clojurescript libs shouldn't specify a Clojurescript dependency (I
>>>> think).
>>>>
>>>> You can perhaps separate the clojurescript part of your app into a
>>>> separate project or lein profile.
>>>>
>>>> There are other issues that can come about by mixing and matching JVM +
>>>> CLJS deps, one nasty one I hit is a tools.reader incompatibility. CLJS
>>>> itself is sensitive to tools.reader versions, and it took an hour or so to
>>>> debug.
>>>>
>>>>
>>>> On Sun, Jun 8, 2014 at 5:58 PM, Chris Jenkins <[email protected]>
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I notice that if my project.clj specifies a dependency on
>>>>> Clojurescript (or on a Clojurescript library which in turn pulls in
>>>>> Clojurescript), this causes my project to have a dependency on the Google
>>>>> Closure compiler and all of its dependencies. If I understand this
>>>>> correctly, it means that stuff like Guava and FindBugs is on the classpath
>>>>> of my application at runtime and those libraries are included in any
>>>>> uberjar or uberwar that I export.
>>>>>
>>>>> Is this necessary? Is there any need for my project to see these
>>>>> libraries at runtime and, if not, is there any way to suppress this
>>>>> behaviour?
>>>>>
>>>>> The reason that this is particular importance to me right now is that
>>>>> i'm trying to deploy an uberwar of my Clojure+Clojurescript app to a
>>>>> WebSphere Liberty app server and I think I'm hitting a bug in Guava 15
>>>>> (which is pulled in by the Google Closure compiler): [1] . I can work
>>>>> around this by changing my Clojurescript dependency to point to an earlier
>>>>> version of Clojurescript (which indirectly then depends on an earlier
>>>>> version of Guava that doesn't suffer from the bug) but there has to be a
>>>>> better way to make this work.
>>>>>
>>>>> I guess this follows on from Nikita's recent question about how to
>>>>> specify Clojurescript dependencies [2]. Is there a way to specify a
>>>>> dependency on Clojurescript such that I can use it at dev time but not
>>>>> pull
>>>>> in its dependencies at runtime?
>>>>>
>>>>> Cheers,
>>>>> Chris
>>>>>
>>>>> [1] https://code.google.com/p/guava-libraries/issues/detail?id=1527
>>>>> [2] https://groups.google.com/forum/#!topic/clojurescript/ppGsyD0xmyw
>>>>>
>>>>> --
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "ClojureScript" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>>
>>>>
>>>> --
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "ClojureScript" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>
>>>
>>> --
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ClojureScript" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>
>>
>> --
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "ClojureScript" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/clojurescript.
>>
>
>
--
Note that posts from new members are moderated - please be patient with your
first post.
---
You received this message because you are subscribed to the Google Groups
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.