Stef,
If you need to leverage the multi-package load, you can do that in Metacello by using the #atomic loadType in the project method of your configuration:
project ^ project ifNil: [ "Bootstrap Metacello if it is not already loaded" self class ensureMetacello. project := self projectClass new projectAttributes: self customProjectAttributes. "Create the Metacello project" project versionNumberClass: self versionNumberClass. project class versionConstructorClass on: self project: project. "Construct the project" project loadType: #'atomic'. "change to #atomic if desired" project ]
With #atomic, all of the packages are loaded in one multi-package load. with #linear (the default) each package is loaded individually.
Ok I was not aware of that and I will
If you inspect the loadDirectives that are produced by the #record message, the load type is encoded in the class of the directive, so you can tell whether #linear or #atomic loadTypes are used in the configurations...
Does this help?
Yes I will try. I disabled the cache disabling because loading 800 packages to try is a pain :)
Dale
----- Original Message ----- | From: "Stéphane Ducasse" <stephane.ducasse@inria.fr> | To: "Pharo Development" <Pharo-project@lists.gforge.inria.fr> | Sent: Saturday, November 17, 2012 11:28:03 AM | Subject: [Pharo-project] Metacello loading semantics | | Hi dale | | I implemented a little tool that | - create a kind of specification (version, package, repo) for all | the packages reachable from a configurationOf | (see below method method | packagesAndAssociatedRepositoriesFromConfigurationRecord ) | | It generates a script looking as follows: | script3 | ^ #( | #('ConfigurationOfFame-TudorGirba.5.mcz' | 'http://www.squeaksource.com/Fame/' 'ConfigurationOfFame' ) | #('ConfigurationOfMooseAlgos-usmanbhatti.27.mcz' | 'http://www.squeaksource.com/MooseAlgos/' | 'ConfigurationOfMooseAlgos' ) | #('ConfigurationOfGlamour-TudorGirba.98.mcz' | 'http://www.squeaksource.com/Glamour/' 'ConfigurationOfGlamour' | ) | #('ConfigurationOfDSM-AlexandreBergel.56.mcz' | 'http://www.squeaksource.com/dsm/' 'ConfigurationOfDSM' ) | #('ConfigurationOfKumpel-AlexandreBergel.3.mcz' | 'http://www.squeaksource.com/Kumpel/' 'ConfigurationOfKumpel' ) | #('ConfigurationOfSmallDudâ¦â¦â¦â¦.) | | - I keep the order given by Metacello. I extract the information as | follows: | | packagesAndAssociatedRepositoriesFromConfigurationRecord: | aConfigurationRecord | "| record | | record := ((Smalltalk globals at: #ConfigurationOfMoose) project | version: 'default') ignoreImage: true; record. | self packagesAndAssociatedRepositoriesFromConfigurationRecord: | record | " | | | pkgs | | pkgs := OrderedCollection new. | aConfigurationRecord loadDirective packageDirectivesDo: | [:directive | | pkgs add: | {directive spec name, '*'. | (self removeCache: directive spec workingCopy | repositoryGroup repositories) anyOne | locationWithTrailingSlash} ]. | ^ pkgs | | | - then I try to load the package as follows: | | flatVersion47: spec | <version: '4.7-flat'> | | spec for: #common do: [ | self populateSpec: spec with: self script3 ] | | I load them doing | (ConfigurationOfMoose project version: '4.7-flat') load | Now It does not work because after fetching all the packages, the | system complain that some classes that will be loaded later are not | present. | I imagine that you use Gofer and that Gofer does not use the merging | semantics of MC over multiple projects (that you can have multiple | package in any order and that the classes get loaded - as I use it | for the scriptLoader and below). | | | - before I was doing it by doing a diff between the pharo package | and the one loaded and I was loading the specification after | installing the repository | and the working copies using the MCVersionLoader and it worked I | could reload completely Moose! | | | load: aCollectionOfPackageString | "self new | load: #( 'Famix-C-TudorGirba.15' | 'Famix-Core-NicolasAnquetil.201'))" | | | loader | | loader := MCVersionLoader new. | (self newerVersionsIn: aCollectionOfPackageString) | do: [ :fn | loader addVersion: (self loadVersionFromFileNamed: fn). | (Delay forSeconds: 2) wait.] | displayingProgress: 'Adding versions...'. | loader hasVersions ifTrue: [loader load]. | | | So my question is | - Does the packageDirectivesDo: provide an order that I can use to | load package with the gofer-load on project at a time? | May be my code does not keep the same order but I payed attention to | this point. I will check that further. | | - may be I could extend Gofer to support multiple project merge | loading. | | So right now I'm stuck and this is sad because freezing a complex | configuration is really needed. | | Stef | | | | | |