You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ivy-user@ant.apache.org by Tom Anderson <tw...@urchin.earth.li> on 2011/11/13 22:51:18 UTC
Several newbie questions about configurations
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
Re: Several newbie questions about configurations
Posted by Jimmy Wan <ji...@indeed.com>.
Tom, we have always used a separate configuration called "test" to handle
test dependencies and that has always worked well for us. We generally
don't worry about test artifacts that are test dependencies for another
project.
On Sun, Nov 13, 2011 at 15:51, Tom Anderson <tw...@urchin.earth.li> wrote:
> 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
>