8.10: About Dependency Granularity
- Page ID
- 45281
We want to discuss the difference between depending on a package, depending on a project and the different ways to express it. Imagine the following baseline1.1 from Fame.
baseline11: spec <version: '1.1-baseline'> spec for: #'common' do: [ spec blessing: #'baseline'. spec description: 'Baseline 1.1 first version on SmalltalkHub, copied from baseline 1.0 on SqueakSource'. spec repository: 'http://www.smalltalkhub.com/mc/Moose/Fame/main'. spec package: 'Fame-Core'; package: 'Fame-Util'; package: 'Fame-ImportExport' with: [spec requires: #('Fame-Core' ) ]; package: 'Fame-SmalltalkBinding' with: [spec requires: #('Fame-Core' ) ]; package: 'Fame-Example'; package: 'Phexample' with: [spec repository: 'http://smalltalkhub.com/mc/ PharoExtras/Phexample/main' ]; package: 'Fame-Tests-Core' with: [spec requires: #('Fame-Core' 'Fame- Example' 'Phexample' ) ]. spec group: 'Core' with: #('Fame-Core' 'Fame-ImportExport' 'Fame-Util' 'Fame- SmalltalkBinding' ); group: 'Tests' with: #('Fame-Tests-Core' ) ].
In this baseline, package: 'Phexample' with: [spec repository: 'http://smalltalkhub. com/mc/PharoExtras/Phexample/main' ];
expresses that there is one package that can be found in the specified repository. However, such an approach is not good because this way you are just downloading a package from a repository and Metacello is not involved. For example, if PhexampleCore has dependencies they will not be loaded.
In the following baseline1.2 we express dependencies between projects as presented above.
baseline12: spec <version: '1.2-baseline'> spec for: #'common' do: [ spec blessing: #'baseline'. spec description: 'Baseline 1.2 to make explicit that Fame depends on HashTable and Phexample (now on smalltalkHub and with working configurations'. spec repository: 'http://www.smalltalkhub.com/mc/Moose/Fame/main'. spec project: 'HashTable' with: [ spec versionString: #stable; repository: 'http://www.smalltalkhub.com/mc/Moose/HashTable/main' ]. spec project: 'Phexample' with: [ spec versionString: #stable; repository: 'http://www.smalltalkhub.com/mc/Phexample/main' ]. spec package: 'Fame-Core' with: [spec requires: 'HashTable']; package: 'Fame-Util'; package: 'Fame-ImportExport' with: [spec requires: #('Fame-Core' ) ]; package: 'Fame-SmalltalkBinding' with: [spec requires: #('Fame-Core' ) ]; package: 'Fame-Example'; package: 'Fame-Tests-Core' with: [spec requires: #('Fame-Core' 'Fame- Example') ]. spec group: 'Core' with: #('Fame-Core' 'Fame-ImportExport' 'Fame-Util' 'Fame- SmalltalkBinding' ); group: 'Tests' with: #('Fame-Tests-Core' ) ].
Now when we express dependencies between projects we lose the fact that this is the package Fame-Tests-Core that depends on Phexample and this is a loss of information.
To keep such information we can simply define in our configuration a new project named for example, PhexampleCore and we will be able to express that Fame-Tests-Core is dependent on PhexampleCore as follows.
spec project: 'PhexampleCore' with: [ spec versionString: #stable; loads: #('Core'); repository: 'http://www.smalltalkhub.com/mc/Phexample/main' ]. .... 'Fame-Tests-Core' with: [spec requires: #('Fame-Core' 'Fame-Example' 'PhexampleCore' ) ].