Le 15 mai 2012 à 22:55, Matt Hurne a écrit :

>>> Each time I read the ChainResolver I am bit confused by the "return first" 
>>> condition, which doesn't return. I am not sure here what should be the code 
>>> path.
>> 
>> Yeah...according to the documentation, once the module is found in a
>> given resolver in the chain resolvers that haven't yet been used
>> should be skipped altogether.  The code doesn't seem to be written
>> that way; it seems to use all of the resolvers regardless of
>> returnFirst (in addition to seemingly returning the module found last,
>> not first).  I feel like I must be missing something here.  Am I?
> 
> Further reading and looking at the commit (revision 688097) that
> introduced the current line that calls isReturnFirst() leads me to
> believe that the idea is this:  if the module found first in the chain
> should be returned, forcedRevision() is called to set a flag on the
> ResolvedModuleRevision called "force".  Then when subsequent resolvers
> are called, they are passed the previously resolved
> ResolvedModuleRevision.  It is apparently their responsibility to
> inspect the "force" flag on that revision, and if it is true, *not*
> resolve the module themselves, but rather return the previously
> resolved module instead.  So it's not nearly as straightforward as I
> had originally expected (is it ever?!).

I have understood the rationale.

> I'll need to step through the code again, and pay more attention to
> what each resolver in the chain is doing.  I'll have to pick this back
> up tomorrow.  I'll let you know what I find!

If you could share a little bit more of your project configuration, I could try 
to look into it too. Mailing lists are generally not appropriate to share 
files, so if you want to share some, you are welcomed to open a Jira issue.

Nicolas

> 
> Thanks,
> Matt Hurne
> 
> 
> On Tue, May 15, 2012 at 4:19 PM, Matt Hurne <m...@thehurnes.com> wrote:
>>> Each time I read the ChainResolver I am bit confused by the "return first" 
>>> condition, which doesn't return. I am not sure here what should be the code 
>>> path.
>> 
>> Yeah...according to the documentation, once the module is found in a
>> given resolver in the chain resolvers that haven't yet been used
>> should be skipped altogether.  The code doesn't seem to be written
>> that way; it seems to use all of the resolvers regardless of
>> returnFirst (in addition to seemingly returning the module found last,
>> not first).  I feel like I must be missing something here.  Am I?
>> 
>> 
>>> Just a hint: what happens if you remove from your ivysettings the 
>>> defaultConflictManager ?
>> 
>> I just removed the defaultConflictManager from my ivysettings and went
>> through the clean->resolve before building and publishing->build and
>> publish->resolve again process, and the result is the same; after the
>> publish and re-resolve the workspace projects are replaced in the Ivy
>> classpath container by the artifacts in the repository.  Isn't
>> latest-revision the default when the attribute is omitted anyway?
>> 
>> Thanks,
>> Matt Hurne
>> 
>> 
>> On Tue, May 15, 2012 at 3:02 PM, Nicolas Lalevée
>> <nicolas.lale...@hibnet.org> wrote:
>>> 
>>> Le 15 mai 2012 à 20:51, Matt Hurne a écrit :
>>> 
>>>> So I've attached a debugger and have been stepping through the
>>>> resolves.  As far as I can see, there is a ChainResolver that includes
>>>> both the workspace resolver and then our default resolver (which is
>>>> itself a chain resolver).  The workspace resolver finds the module in
>>>> the workspace and returns it to the ChainResolver, and then our
>>>> resolver also finds the module (in the repository) and returns it to
>>>> the ChainResolver.  The ChainResolver appears to discard the module
>>>> resolved by the workspace resolver in favor of the module returned by
>>>> our resolver instead.
>>>> 
>>>> Here's the relevant snippet from
>>>> org.apache.ivy.plugins.resolver.ChainResolver.java starting with line
>>>> 102 (also recall this is Ivy 2.2.0):
>>>> 
>>>> ResolvedModuleRevision previouslyResolved = mr;
>>>> data.setCurrentResolvedModuleRevision(previouslyResolved);
>>>> mr = resolver.getDependency(dd, data);
>>>> if (mr != previouslyResolved && isReturnFirst()) {
>>>>    mr = forcedRevision(mr);
>>>> }
>>>> 
>>>> 
>>>> When this code is dealing with our resolver, the first line sets
>>>> previouslyResolved to the module we want (the module that represents
>>>> the project in the workspace).  The third line sets mr to the module
>>>> in the repository (the one we don't want).  In this case, mr does not
>>>> equal previouslyResolved and isReturnFirst() is true.  The body of the
>>>> if statement is executed, which just sets mr to the forcedRevision()
>>>> version of itself.  Is that right?  Shouldn't the body of the if
>>>> statement be:
>>>> 
>>>> mr = forcedRevision(previouslyResolved);    ???
>>>> 
>>>> or perhaps just:
>>>> 
>>>> mr = previouslyResolved;    ???
>>>> 
>>>> 
>>>> I don't fully grok the purpose of forcedRevision(), so maybe that's
>>>> what is throwing me off?
>>> 
>>> Each time I read the ChainResolver I am bit confused by the "return first" 
>>> condition, which doesn't return. I am not sure here what should be the code 
>>> path.
>>> 
>>> Just a hint: what happens if you remove from your ivysettings the 
>>> defaultConflictManager ?
>>> 
>>> Nicolas
>>> 
>>> 
>>>> 
>>>> Thanks,
>>>> Matt Hurne
>>>> 
>>>> 
>>>> On Tue, May 15, 2012 at 1:40 PM, Matt Hurne <m...@thehurnes.com> wrote:
>>>>>> Ok, that makes some sense.  After adding resolveMode="dynamic" to my
>>>>>> <settings>, I do see that the <dependency> elements of the delivered
>>>>>> ivy files include a resolved rev attribute as well as a revConstraint
>>>>>> attribute, such as:
>>>>>> 
>>>>>> <dependency org="com.acme" name="thingamajig" rev="20120515131106"
>>>>>> revConstraint="latest.integration" conf="default->default"/>
>>>>> 
>>>>> Not that it helps me much, but I should clarify that the <dependency>
>>>>> elements in the delivered Ivy files look the same regardless of the
>>>>> resolve mode configured; the revConstraint is included with a value of
>>>>> "latest.integration" either way.  So it's my understanding that the
>>>>> resolve mode doesn't have a direct effect on the delivered Ivy files,
>>>>> but rather which of the revision-related attributes in those delivered
>>>>> Ivy files is used in future resolves.
>>>>> 
>>>>> Matt Hurne
>>>>> 
>>>>> 
>>>>> On Tue, May 15, 2012 at 1:26 PM, Matt Hurne <m...@thehurnes.com> wrote:
>>>>>>> Have you tried to set it on the "settings" element in the ivysettings ?
>>>>>> 
>>>>>> I hadn't before, but just did:
>>>>>> 
>>>>>> <settings defaultResolver="default-chain" defaultResolveMode="dynamic"
>>>>>> defaultConflictManager="latest-revision"
>>>>>> circularDependencyStrategy="error" />
>>>>>> 
>>>>>> Unfortunately this did not solve the problem for me.  IvyDE was able
>>>>>> to resolve projects in the workspace prior to any of them being built
>>>>>> and published to the local repository, but after they were built and
>>>>>> published and I did a "resolve all" in Eclipse, the project references
>>>>>> were replaced with the published artifacts.  So this worked better
>>>>>> than when I added a <modules> section to my ivysettings to set the
>>>>>> resolve mode, but no better than if I just left the resolve mode as
>>>>>> the default across the board.
>>>>>> 
>>>>>> 
>>>>>>> When you publish your artifacts into your local repository, Ivy does a 
>>>>>>> "deliver" of the ivy.xml of your project. If there is any range version 
>>>>>>> in your dependencies, Ivy fix them as the one resolved during the 
>>>>>>> build. So the next time a resolve happens and that module is found in 
>>>>>>> you repository, Ivy will resolved the previously-resolved revision, the 
>>>>>>> fixed one, not the original range version. Setting the resolve mode to 
>>>>>>> dynamic change this behavior; it will use the range rather than the 
>>>>>>> resolved version. Look at your ivy.xml in the local repository, you'll 
>>>>>>> see some extra attributes in your dependency, if you have any range 
>>>>>>> version.
>>>>>> 
>>>>>> Ok, that makes some sense.  After adding resolveMode="dynamic" to my
>>>>>> <settings>, I do see that the <dependency> elements of the delivered
>>>>>> ivy files include a resolved rev attribute as well as a revConstraint
>>>>>> attribute, such as:
>>>>>> 
>>>>>> <dependency org="com.acme" name="thingamajig" rev="20120515131106"
>>>>>> revConstraint="latest.integration" conf="default->default"/>
>>>>>> 
>>>>>> Note that we are not specifying revisions in our modules' ivy files at
>>>>>> the moment, so Ivy appears to set the revision to the publication data
>>>>>> and time when delivering each Ivy file.  For example:
>>>>>> 
>>>>>> <info organisation="com.acme" module="thingy"
>>>>>> revision="20120515131237" status="integration"
>>>>>> publication="20120515131237">
>>>>>> 
>>>>>> Not sure where to go from here.  Do you have any additional thoughts?
>>>>>> Thanks for your time thus far!
>>>>>> 
>>>>>> Matt H
>>>>>> 
>>>>>> 
>>>>>> On Tue, May 15, 2012 at 5:01 AM, Nicolas Lalevée
>>>>>> <nicolas.lale...@hibnet.org> wrote:
>>>>>>> 
>>>>>>> Le 14 mai 2012 à 22:38, Matt Hurne a écrit :
>>>>>>> 
>>>>>>>>> Maybe there are some transitive dependency which confuse the 
>>>>>>>>> Workspace resolver. See at the end of the doc:
>>>>>>>>> http://ant.apache.org/ivy/ivyde/history/latest-milestone/cpc/workspace.html
>>>>>>>>> 
>>>>>>>>>> In some setup, if you want to mix some resolver of your own and the 
>>>>>>>>>> workspace resolver, and still want the transitive dependencies work 
>>>>>>>>>> nicely between them, you may want to turn the resolve mode to 
>>>>>>>>>> dynamic:
>>>>>>>>>>       • see the defaultResolveMode attribute of settings in the 
>>>>>>>>>> ivysettings.
>>>>>>>>>>       • see the resolveMode attribute of module in the ivysettings.
>>>>>>>> 
>>>>>>>> Yes, I had seen that before sending my original note to the list since
>>>>>>>> it did seem relevant.  I added a <modules> element to the
>>>>>>>> ivysettings.xml like:
>>>>>>>> 
>>>>>>>> <modules>
>>>>>>>>    <module organisation="com.company" name="*" resolveMode="dynamic"/>
>>>>>>>> </modules>
>>>>>>>> 
>>>>>>>> After doing so, IvyDE seemed unable to resolve a given project's
>>>>>>>> dependencies at all, including projects in the workspace, even with an
>>>>>>>> empty local repository.  I'm not sure what to make of that;
>>>>>>> 
>>>>>>> I don't either. Have you tried to set it on the "settings" element in 
>>>>>>> the ivysettings ?
>>>>>>> 
>>>>>>>> to be
>>>>>>>> honest, I don't really understand what difference it should have made.
>>>>>>>> Any chance you can elaborate?
>>>>>>> 
>>>>>>> When you publish your artifacts into your local repository, Ivy does a 
>>>>>>> "deliver" of the ivy.xml of your project. If there is any range version 
>>>>>>> in your dependencies, Ivy fix them as the one resolved during the 
>>>>>>> build. So the next time a resolve happens and that module is found in 
>>>>>>> you repository, Ivy will resolved the previously-resolved revision, the 
>>>>>>> fixed one, not the original range version. Setting the resolve mode to 
>>>>>>> dynamic change this behavior; it will use the range rather than the 
>>>>>>> resolved version. Look at your ivy.xml in the local repository, you'll 
>>>>>>> see some extra attributes in your dependency, if you have any range 
>>>>>>> version.
>>>>>>> 
>>>>>>> Nicolas
>>>>>>> 
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Matt Hurne
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Mon, May 14, 2012 at 4:28 PM, Nicolas Lalevée
>>>>>>>> <nicolas.lale...@hibnet.org> wrote:
>>>>>>>>> Maybe there are some transitive dependency which confuse the 
>>>>>>>>> Workspace resolver. See at the end of the doc:
>>>>>>>>> http://ant.apache.org/ivy/ivyde/history/latest-milestone/cpc/workspace.html
>>>>>>>>> 
>>>>>>>>>> In some setup, if you want to mix some resolver of your own and the 
>>>>>>>>>> workspace resolver, and still want the transitive dependencies work 
>>>>>>>>>> nicely between them, you may want to turn the resolve mode to 
>>>>>>>>>> dynamic:
>>>>>>>>>>       • see the defaultResolveMode attribute of settings in the 
>>>>>>>>>> ivysettings.
>>>>>>>>>>       • see the resolveMode attribute of module in the ivysettings.
>>>>>>>>> 
>>>>>>>>> Nicolas
>>>>>>>>> 
>>>>>>>>> Le 14 mai 2012 à 20:36, Matt Hurne a écrit :
>>>>>>>>> 
>>>>>>>>>> On Mon, May 14, 2012 at 2:31 PM, Matt Hurne <m...@thehurnes.com> 
>>>>>>>>>> wrote:
>>>>>>>>>>> We are using Ivy to manage the dependencies of our projects on each
>>>>>>>>>>> other, and we're planning to use IvyDE as well.  One of the 
>>>>>>>>>>> resolvers
>>>>>>>>>>> we have in our Ivy configuration is used to publish our build
>>>>>>>>>>> artifacts to a local repository (with status "integration") so that
>>>>>>>>>>> they are available when building the projects that depend on them.  
>>>>>>>>>>> In
>>>>>>>>>>> a clean environment, this repository is initially empty.  If the 
>>>>>>>>>>> local
>>>>>>>>>>> repository is empty and we configure IvyDE to resolve dependencies 
>>>>>>>>>>> in
>>>>>>>>>>> the workspace, the projects do end up in the Ivy classpath 
>>>>>>>>>>> containers
>>>>>>>>>>> of the projects that depend on them as expected.  However, if we 
>>>>>>>>>>> then
>>>>>>>>>>> build and publish the projects to the local repository and then
>>>>>>>>>>> perform a new resolve-all in Eclipse/IvyDE, the projects are removed
>>>>>>>>>>> from the Ivy classpath containers and the artifacts in the local
>>>>>>>>>>> repository take their places.
>>>>>>>>>>> 
>>>>>>>>>>> Is this behavior expected/correct?  Is there a way to ensure that
>>>>>>>>>>> IvyDE will always put workspace projects in the classpath container
>>>>>>>>>>> rather than artifacts with identical module revision IDs that exist 
>>>>>>>>>>> in
>>>>>>>>>>> one of our configured repositories?
>>>>>>>>>>> 
>>>>>>>>>>> If I were dealing with this type of scenario outside of 
>>>>>>>>>>> Eclipse/IvyDE,
>>>>>>>>>>> I would look at putting the resolvers into a chain and using the
>>>>>>>>>>> "returnFirst" attribute to enforce a specific order.  That's
>>>>>>>>>>> effectively what I'm looking to do with the workspace resolver.  Is
>>>>>>>>>>> that possible?
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> I should have mentioned the following details about our environment:
>>>>>>>>>> 
>>>>>>>>>> Windows XP 32bit
>>>>>>>>>> Eclipse 3.7 Indigo
>>>>>>>>>> IvyDE 2.2.0.beta1 with Ivy 2.2.0 (we had some other show-stopping
>>>>>>>>>> issues when using IvyDE with Ivy 2.3.0, so we installed Ivy 2.2.0
>>>>>>>>>> explicitly)
>>>>>>>>>> 
>>>>>>>>>> In addition, when building projects using Ant we're using Ivy 2.2.0.
>>>>>>>>>> 
>>>>>>>>>> Thanks,
>>>>>>>>>> Matt Hurne
>>>>>>>>> 
>>>>>>> 
>>> 

Reply via email to