On 6/06/10 12:56 AM, Steve Appling wrote:
On Jun 4, 2010, at 10:34 PM, Steve Appling wrote:
On Jun 4, 2010, at 2:56 AM, Adam Murdoch wrote:
On 4/06/10 5:33 AM, Steve Appling wrote:
On May 31, 2010, at 7:09 PM, Adam Murdoch wrote:
On 29/05/10 3:57 AM, Steve Appling wrote:
We would really like to resolve the issues related to circular
dependencies (GRADLE-914 in particular) sometime soon. I know
this is marked for 0.9, but so are 91 other issues. Is this
something that anyone is planning on addressing in the short term
(within the next couple of weeks)? If not, does anyone
understand the underlying problem enough to point me in the right
direction?
I know of 2 problems. There may be more, but this is as far as I got:
1. The compile configuration is now transitive by default (for
good or bad). So, using a runtime dependency to break the cycle
isn't going to work. This is easily fixed by configuring the
compile configuration to be non-transitive. But, this does
highlight some awkwardness in the dependency dsl, where the only
options are to include the jar on its own or the entire transitive
closure of everything the jar might need (even though it doesn't
for the purposes of compiling a dependent project). I think we
need something more flexible here, so we can provide a better
default behaviour.
2. The DefaultProjectDependency.getBuildDependencies()
implementation doesn't consider whether the configuration it
belongs to is transitive or not. And so, it always drags in the
tasks to build the runtime configuration of the target project,
even though only the jar may be required. This is the actual bug.
I was going to try to fix this for 0.9. But there's plenty of
other stuff to fix, so if you want to have a look at this, feel
free to do so.
The particular problem that I was running into seems to be
different from the ones you were describing. I think I have a fix
for this, but wanted to check this with you (Adam) before
committing anything. I'm over my head here, so my solution might
not be appropriate.
Simplified version of my situation:
We have a functionalTestRuntime configuration that extends runtime
and is used to specify dependencies needed to run the functional
tests for a project.
Project A has a functionalTestRuntime project dependency on Project
B. Project B has a compile project dependency on Project A.
Before executing the functionalTest task on Project A, the
isUpToDate check tries to resolve the functionalTestRuntime
configuration.
Both of the projects will have the following configurations:
archives, default, compile, runtime, testCompile, testRuntime,
functionalTestRuntime
When the DefaultIvyService is used to resolve Project A's
functionalTestRuntime configuration, it creates a ModuleDescriptor
to describe the project (DefaultIvyService:134). This
ModuleDescriptor only includes the functionalTestRuntime
configuration and its superconfigurations in the ModuleDescriptor
(which doesn't include the default configuration). When the
compile project dependency from Project B -> Project A is being
resolved, it tries to find the default configuration of Project A.
Project A really does have a default configuration, but Ivy uses
the ModuleDescriptor created that was created above, which doesn't
have it. The result is an exception like:
org.gradle.api.artifacts.LocationAwareResolveException:
Could not resolve all dependencies for configuration
':ProjectA:functionalTestRuntime':
- unresolved dependency:
com.controlj.green#ProjectA;1.0-SNAPSHOT: configuration not found in
com.controlj.green#ProjectA;1.0-SNAPSHOT: 'default'. It was required
from com.controlj.green#ProjectB;1.0-SNAPSHOT compile
Changing
DefaultIvyService line 134 to include all configurations instead of
just the ones from the current configuration's hierarchy seems to fix
this particular problem. The change would be to replace
"configuation.getHierarchy()" with "configuration.getAll()". Does this
seem appropriate?
This looks like a good solution.
This is causing the SamplesExcludesAndClassifiersIntegrationTest to
fail. It causes configurations.otherConf.resolve() to return
"service-1.0-jdk15" instead of "service-1.0-jdk14". I'm trying to
follow the Ivy code resolving this, but it's not yet clear to me why
it picks up the classifier from the wrong configuration.
I think I've tracked this down too, but again would like advice.
In AbstractDependencyDescriptorFactoryInternal.findExistingDescriptor,
it only compares the ModuleRevisionIds of the dependencies. The
ModuleRevisionId only has the group, name, and version. In
particular, it does not include information about the artifact (like
the classifier). It seems like findExistingDescriptor should pull out
the DependencyArtifactDescriptors from the DependencyDescriptor and
compare them as well.
I think this part of the code was originally written by Hans, but
didn't know if either Hans or Adam had an opinion about this.
I think this change makes sense. However, I'm not 100% sure about this
stuff. I reckon if the tests all pass after the change, then it's good
to check in.
--
Adam Murdoch
Gradle Developer
http://www.gradle.org
CTO, Gradle Inc. - Gradle Training, Support, Consulting
http://www.gradle.biz