Skip to main content
Engineering LibreTexts

8.10: About Dependency Granularity

  • Page ID
    45281
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    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' ) ].
    

    This page titled 8.10: About Dependency Granularity is shared under a CC BY-SA 3.0 license and was authored, remixed, and/or curated by Alexandre Bergel, Damien Cassou, Stéphane Ducasse, Jannik Laval (Square Bracket Associates) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.