Andreas,

Your 'self answers' all look good.

|       spec
|               package:'Foo' with:[spec requires: 'Bar'];
|               package:'Foo' with:[spec requires: 'Baz'];
| 
| and
|       spec
|               package: 'Foo' with:[spec requires: #('Bar' 'Baz')].

are indeed equivalent. So the difference pieces of the spec can be included in 
different #for:do: blocks based on the platform.

To take you a little bit into the internals...You will notice that all 
packages/projects/groups are named, so for each spec of a given name an ordered 
list of modifications are recorded while resolving the spec on a given platform.

  1. all #version: pragmas (no import and therefore self-contained) are 
processed 
     first
  2. #version:import: pragmas are processed next (using the imported version as 
a 
     starting point).
  3. within a #version: or #version:import: method, the specs are processed in 
     project attribute order (i.e., for Squeak -> #common, #squeakCommon, 
#squeak).
  4. the individual statements in the #for:do: for a given attribute are 
processed 
     in order.
  5. there are 4 unique operations supported:
     - add
     - copy
     - merge
     - remove

Once the initial processing is complete, the operations are collapsed to form 
the final named spec. The named specs are collected into the version ....

The #add operation is used by the constructors with 'overrides' in their name. 
The #add operation replaces the named spec.

The #copy operation is used the by the #project:copyFrom:with: constructor. 
Note that #copy requires that an #add/#merge operation proceeds it in it's list.

The #merge operation merges it's items into the previous version of the named 
spec. Not that #merge is equivalent to #add if the name spec doesn't exist yet. 
Most of the constructors use the #merge operation.

The #remove operation is used by the constructors with 'remove' in their name. 
The #remove operation removes it's from the previous version of the named spec.

So you can imagine that as you traverse through an attribute list for a 
particular project, that each of the individual constructor statements for a 
named spec are processed in a very specific order with each of the #add, #copy, 
#merge, and #remove operations applied in order...

Hope this helps,

Dale

----- "Andreas Raab" <[email protected]> wrote:

| On 5/6/2010 5:26 PM, Dale Henrichs wrote:
| > I don't think I've completely answered your questions so we might
| want to continue the dialog on this question....
| 
| We're getting close :-) Let me take my own questions and answer them
| in 
| my own words to see if I understand the issues correctly:
| 
| Q1: #includes: vs. #requires:
| 
| If I understand correctly what you're saying then, in heavily
| simplified 
| form, I'd say they're both dependencies, except that #requires: is 
| loaded before the package it relates to and #includes: afterwords.
| Thus:
| 
|       spec package: 'B' with:[
|               spec requires: 'A'.
|               spec includes: 'C'.
|       ].
| 
| will load A, B, and C in that order. One thing one can do with this is
| 
| to have mutually dependent packages, for example if package Foo and
| Bar 
| always must be loaded together (Foo before Bar) one would specify:
| 
|       spec package: 'Foo' with:[spec includes: 'Bar'].
|       spec package: 'Bar' with:[spec requires: 'Foo'].
| 
| There is now no way by which Foo or Bar could be loaded without its 
| companion. Correct?
| 
| Q2: Why is HelpSystem not loaded?
| 
| A: That's a bug which I can work around by specifying either #version:
| 
| or #versionString:.
| 
| Q3: When exactly is HelpSystem loaded?
| A: In the context of my configuration HelpSystem is loaded for two 
| reasons: a) because it's a dependency for WebClient-Help and b)
| because 
| no 'default' group has been specified it would be loaded implicitly.
| 
| Q4: How does one define dependencies that differ based on platform?
| A: I'm not really sure about this. My understanding is that I could
| use 
| #includes: to model the dependency in the "for: #pharo" branch, but
| one 
| question that is still open is whether the following two expressions
| are 
| equivalent:
| 
|       spec
|               package:'Foo' with:[spec requires: 'Bar'];
|               package:'Foo' with:[spec requires: 'Baz'];
| 
| and
|       spec
|               package: 'Foo' with:[spec requires: #('Bar' 'Baz')].
| 
| Are these equivalent?
| 
| Cheers,
|    - Andreas

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to