I am encountering challenges with the Ivy cache and also with setting up what I 
would consider to be a typical (if not classic) developer workflow. Here is the 
desired workflow:

I have a Nexus repository (releases and snapshots) plus a local file system 
repository used for local development. I have Project which depends upon 
Library. I wish to modify Library, publish locally, and then pull it into the 
local build of Project.

And for my Jenkins "continuous" integration server, if the copy of 
Library-1.0.0-SNAPSHOT in Nexus is newer than what is in the cache on the build 
machine, then I would like Ivy to grab the newer version (just like Maven does).

ISSUE #1

Assuming I start with an empty cache and empty internal repo on my local dev 
machine, I build Project and it pulls Library from Nexus. Perfect. Works great. 
But then if I publish Library locally and build Project again, I will get the 
cached version of Library that came from Nexus. No matter what I do, I will 
always get the cached copy. This happens even though my chain resolver 
specifies my internal repo before the Nexus repo.

If I blow away the cache, then I get my locally published build, but only if I 
blow away the cache. Otherwise I get stale stuff. Issue #2 below is all about 
stale stuff.

I debugged Ivy (for hours upon hours) and during the resolve, it checks my 
internal repo, finds the fresh artifact (yay!) and the next thing it does is 
checks its cache, finds a module descriptor that points at Nexus, and proceeds 
to pull in the wrong artifact into Project.

The behavior is either a bug, or implies that Ivy assumes that an artifact can 
only come from one place, and if it came from there once, it will come from 
there forever, and will never change. Again, Ivy finds the artifact in local 
repo, stops searching, then ends up delivering the cached artifact that came 
from Nexus sometime earlier.

ISSUE #2

I have been working on this problem for quite some time and I thought I had it 
fixed, but I don't. That is, my integration server needs the latest snapshot 
build of Library-1.0.0-SNAPSHOT. But what I get is the cached version from the 
Ivy cache. An SVN commit happens, triggers a build of Library, Library get 
published, triggers a build of Project, and a stale build of Library is 
delivered to Project from the cache (which breaks Project build).

SUMMARY

Ivy will resolve and cache deps, but once a dep is in the cache, that's what I 
get forever until I blow away the cache. I see this question asked quite often 
regarding obtaining latest integration versions, and I see that Ivy claims to 
support the local development workflow, but I have yet to see a working example 
of either of these. Surely some of you have solved these issues.

Is there any place anywhere in the world that has an example of development 
workflow configuration and/or integration configuration? Can anybody provide an 
example? So far I have not found anything, and advice on the net seems to be 
general suggestions like "try this, try that" and nobody really has the 
configuration solution. Is Ivy capable of these behaviors or do I need to hand 
roll a dependency management solution. Maven is too strict for these projects 
(C++ code). Ivy is good if I can just obtain these fundamental behaviors.

Note that I have not provided any configs in this message that demonstrate the 
issues I am having but definitely can upon request.

Thanks in advance,

L.K.

Reply via email to