[prev in list] [next in list] [prev in thread] [next in thread]
List: ivy-user
Subject: Several newbie questions about configurations
From: Tom Anderson <twic () urchin ! earth ! li>
Date: 2011-11-13 21:51:18
Message-ID: alpine.DEB.2.00.1111132108520.19917 () urchin ! earth ! li
[Download RAW message or body]
Hello!
Zeroth question: is there any good documentation about working with
configurations and configuration mappings, other than:
http://ant.apache.org/ivy/history/latest-milestone/ivyfile/configurations.html
http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html
? I've read those, but there's still plenty to know.
First question: is there any kind of standard or best practice for what
configurations a module should define? I can see that everything imported
from the Maven repositories has a standard set; should i be following that
pattern, ignoring it, or doing something else? That question is partly
about knowing what configurations my own modules should define, but also
about what i should expect from other modules; if there is no standard,
does that mean i will end up tailoring configuration mappings for every
dependency?
For now, i am using a cut-down version of the Maven configurations:
<conf name="compile"/> <!-- things needed to compile the code -->
<conf name="master"/> <!-- things published by this module -->
<conf name="runtime" extends="compile"/> <!-- things needed to run the code -->
<conf name="default" extends="runtime,master"/> <!-- everything, needed or provided, \
necessary to use this module --> <conf name="sources"/> <!-- sources for this module \
and dependencies -->
Second question: is this sane?
Third question: how do i deal with dependencies needed by unit tests, but
not the module's artefact? I am writing a module that uses JUnit and Moxie
for testing, so i have those as compile dependencies. But anyone who
wanted to obtain and use the module would not need them; they wouldn't
even need them to build from source, as long as they didn't want to run
the tests. Should i just define a separate test configuration? Any
suggestions on how that should relate to the others?
Third question: i currently have the following default configuration
mapping:
<dependencies defaultconfmapping="compile->compile;runtime->default;sources->sources">
My goal here is that if i retrieve the compile configuration, i will get
just the things i need to compile my code (ie not transitive
dependencies), if i retrieve the runtime configuration, i will get
everything i need to actually run the code, and if i retrieve the sources
configuration, i will get the source code of all my dependencies (so i can
link it into my IDE). Am i doing this right? Do i need to specify these
explicitly, or should i be relying on defaults? Is it really right that i
have to specify runtime->default in order to get modules and their
transitive dependencies? Would i be better off specifying
runtime->master,runtime explicitly? Can i rely on any of these
configurations existing across all modules?
Fourth question: what is the preferred style for writing a dependency that
means something like "the latest released version"? So far, i've been
writing:
<dependency org="junit" name="junit" rev="4.+"/>
I think i actually need JUnit 4.6 or later. Since i know that has been
released, can i safely write 4.+? Should i explicitly say [4.6,)? Any
thoughts on whether it's best to exclude, explicitly or implicitly,
version 5 and beyond, on the grounds that it might not be backward
compatible? Should i just say latest.release?
Fourth question: any idea what's going on with Moxie and cglib? For those
of you who don't know them, Moxie is a mocking library (like Mockito or
JMock - some would say better) and cglib is a bytecode generation library.
Moxie uses cglib; if you ask it to mock a class (rather than an
interface), it uses a couple of classes from cglib. That means it has a
compile-time dependency on cglib, and if you want to mock classes, a
runtime dependency. Its ivy.xml says this about configurations (this is
just the ones which look relevant):
<conf name="default" visibility="public" description="runtime dependencies and \
master artifact can be used with this conf" extends="runtime,master"/> <conf \
name="master" visibility="public" description="contains only the artifact published \
by this module itself, with no transitive dependencies"/> <conf name="compile" \
visibility="public" description="this is the default scope, used if none is \
specified. Compile dependencies are available in all classpaths."/> <conf \
name="runtime" visibility="public" description="this scope indicates that the \
dependency is not required for compilation, but is for execution. It is in the \
runtime and test classpaths, but not the compile classpath." extends="compile"/> \
<conf name="optional" visibility="public" description="contains all optional \
dependencies"/>
And this about dependencies:
<dependencies>
<dependency org="junit" name="junit" rev="4.8.1" force="true" \
conf="optional->compile(*),master(*)"/> <dependency org="org.hamcrest" \
name="hamcrest-core" rev="1.1" force="true" \
conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency \
org="org.hamcrest" name="hamcrest-library" rev="1.1" force="true" \
conf="optional->compile(*),master(*)"/> <dependency org="cglib" name="cglib" \
rev="2.1_3" force="true" conf="optional->compile(*),master(*)"/> </dependencies>
Am i right in reading that as saying that the only dependency brought in
in the compile configuration, and therefore also by the runtime and
default configurations, is hamcrest-core? And that the other three are
only brought in by the optional configuration? Does that seem correct?
It does seem to be the case, because i had to write this dependency:
<dependency org="org.moxiemocks" name="moxie" rev="0.+" \
conf="compile->compile;runtime->default,optional;sources->sources"/>
In order to bring in cglib when i did a retrieve of the runtime
configuration. On which subject ...
Fifth question: when i write a dependency-level configuration mapping, it
seems to completely override the default configuration mapping. If i take
away the sources->sources entry in the above, then when i retrieve the
sources configuration, i don't get the sources for Moxie. Is there any way
to write a dependency-level configuration mapping that lets the mappings
defined in the default mapping apply except where overridden?
In general, it strikes me that i am writing too many thing explicitly. Are
there more defaults i should be relying on here?
Thanks for reading all that, and thanks in advance for any advice you may
be able to give!
tom
--
That's the problem with google. You can usually find what you're looking
for with a fairly simple search. It's knowing *which* fairly simple
search out of the millions of possible fairly simple searches you need
to use to find it ;-) -- Paul D
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic