Tetyana and Antoine, thank you for your responses.
I'd like to refine my questions to a specific problem: I'm attempting to
build a repo for a default Grails application. Grails auto-generates the
app/ivy.xml and the app/ivysettings.xml, which resolve dependencies just
fine, and the apps compile and run via ant&ivy with no problem.
My approach to building a local repo initially involved taking the
app/ivy.xml, and migrating the app/ivy.xml:<dependencies...> to my
repository/build.xml:<ivy:install...> tasks. However, I have found that
this naive migration resulted in a number of unresolved dependencies,
and that if I replaced the resolvers in app/ivysettings.xml (which
resolve to ibiblio, etc.) with resolvers to my local filesystem, then
ivy would download a significantly smaller subset of the dependencies
needed by the grails app. Subsequently, the grails app would fail to
compile or run.
So, my second approach has been to try to generate the local repo
directly from the app/build.xml, using the original unmodified
app/ivy.xml and app/ivysettings.xml. With this approach, ivy downloads
the dependency artifacts to a staging area. Exciting stuff. However, I'm
a bit stuck w/ respect to publishing. I'll include my targets below, but
to wrap up, when I publish, only the top level object, my grails app,
gets published. My goal is to publish not just the top level project (in
fact, I don't really need this top level), but what I need to publish
are all the dependencies of this project.
Looking at the docs
(http://ant.apache.org/ivy/history/2.1.0-rc1/use/publish.html), I don't
see anything re: publishing the dependencies of a module. What are my
options here? Do I need to write some code to walk the directory where
I'm staging all my dependencies, and publish each one in turn? Or is
there a cleaner approach?
Here are my some of my artifacts:
#===============================================
#app/ivy.xml // grails generated
#===============================================
<ivy-module version="2.0">
<info organisation="org.foo" module="asmc"/>
<configurations
defaultconfmapping="build->default;compile->compile(*),master(*);test,runtime->runtime(*),master(*)">
<conf name="build"/>
<conf name="compile"/>
<conf name="test" extends="compile"/>
<conf name="runtime" extends="compile"/>
</configurations>
<dependencies>
<dependency org="org.grails" name="grails-bootstrap"
rev="1.1-RC2" conf="build"/>
<dependency org="org.grails" name="grails-scripts"
rev="1.1-RC2" conf="build"/>
<dependency org="org.grails" name="grails-gorm" rev="1.1-RC2"
conf="compile"/>
<dependency org="org.grails" name="grails-web" rev="1.1-RC2"
conf="compile"/>
<dependency org="org.grails" name="grails-test" rev="1.1-RC2"
conf="test"/>
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.5.5"
conf="runtime"/>
<dependency org="opensymphony" name="oscache" rev="2.4"
conf="runtime">
<exclude org="javax.jms" module="jms" name="*" type="*"
ext="*" conf="" matcher="exact"/>
<exclude org="commons-logging" module="commons-logging"
name="*" type="*" ext="*" conf="" matcher="exact"/>
<exclude org="javax.servlet" module="servlet-api" name="*"
type="*" ext="*" conf="" matcher="exact"/>
</dependency>
<dependency org="hsqldb" name="hsqldb" rev="1.8.0.5"
conf="runtime"/>
<dependency org="mysql" name="mysql-connector-java" rev="5.1.6"
conf="runtime"/>
<!--
<dependency org="mysql" name="mysql-connector-java" rev="5.1.6"
conf="runtime"/>
<dependency org="postgresql" name="postgresql"
rev="8.3-603.jdbc3" conf="runtime"/>
-->
</dependencies>
</ivy-module>
#===============================================
#app/build.xml // my custom tasks for dependency publishing
#===============================================
<!-- =================================
target: resolve and publish dependencies to staging repository
================================= -->
<target name="-resolve-deps-to-staging" description="--> Resolve
application dependencies to staging repository" depends="init-ivy">
<ivy:retrieve
pattern="${foo.repo.staging.dir}/foo/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"
ivypattern="${foo.repo.staging.dir}/foo/[organisation]/[module]/ivys/ivy-[revision].xml"
/>
</target>
<!-- =================================
target: publish dependencies from staging repository to repo
================================= -->
<target name="publish" description="--> Publish application
dependencies from staging to repository" depends="-resolve-deps-to-staging">
<ivy:publish resolver="foo-repo" pubrevision="1.0">
<artifacts
pattern="${foo.repo.staging.dir}/foo/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
<artifacts
pattern="${foo.repo.staging.dir}/foo/[organisation]/[module]/ivys/ivy-[revision].xml"/>
</ivy:publish>
</target>
#===============================================
#repo/staging // subset of what gets downloaded
#===============================================
to...@laptop:~/src/Main/FOO/etc/project/main/foo-ivy-repo/staging/foo$
find xpp3/
xpp3/
xpp3/xpp3_min
xpp3/xpp3_min/ivys
xpp3/xpp3_min/ivys/ivy-1.1.3.4.O.xml
xpp3/xpp3_min/jars
xpp3/xpp3_min/jars/xpp3_min-1.1.3.4.O.jar
#===============================================
#repo/staging // subset of what gets downloaded
#===============================================
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="1.0" xmlns:m="http://ant.apache.org/ivy/maven">
<info organisation="xpp3"
module="xpp3_min"
revision="1.1.3.4.O"
status="release"
publication="20060218133216"
>
<description
homepage="http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/">
MXP1 is a stable XmlPull parsing engine that is based on ideas from
XPP and in particular XPP2 but completely revised and rewritten to take
the best advantage of latest JIT JVMs such as Hotspot in JDK 1.4+.
</description>
</info>
<configurations>
<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="provided" visibility="public" description="this is much
like compile, but indicates you expect the JDK or a container to provide
it. It is only available on the compilation classpath, and is not
transitive."/>
<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="test" visibility="private" description="this scope
indicates that the dependency is not required for normal use of the
application, and is only available for the test compilation and
execution phases." extends="runtime"/>
<conf name="system" visibility="public" description="this scope is
similar to provided except that you have to provide the JAR which
contains it explicitly. The artifact is always available and is not
looked up in a repository."/>
<conf name="sources" visibility="public" description="this
configuration contains the source artifact of this module, if any."/>
<conf name="javadoc" visibility="public" description="this
configuration contains the javadoc artifact of this module, if any."/>
<conf name="optional" visibility="public" description="contains all
optional dependencies"/>
</configurations>
<publications>
<artifact name="xpp3_min" type="jar" ext="jar" conf="master"/>
</publications>
</ivy-module>
Again, thank you for your time.
-Todd