Le 16 mai 2012 à 16:44, Matt Hurne a écrit :

>>> 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.
> 
> Thanks, but I've resolved the issue.  The "force" attribute of the
> resolver for the local repository was given a value of "true".  When
> that's the case, BasicResolver.shouldReturnResolvedModule() returns
> false, effectively overriding the ChainResolver's returnFirst="true".
> With force="false" (the default) on the local resolver, the local
> resolver returns the module resolved by the WorkspaceResolver rather
> than overriding it, and resolves with IvyDE still include the
> appropriate Eclipse workspace projects in the Ivy classpath container
> rather than the artifacts in the local repository, which is what I
> want.

Thanks for sharing back. I'll write a note in the doc about that.

Nicolas

> 
> Thanks,
> Matt Hurne
> 
> 
> On Tue, May 15, 2012 at 7:32 PM, Nicolas Lalevée
> <nicolas.lale...@hibnet.org> wrote:
>> 
>> 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