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