/// <summary>
/// The entry method into the bottles environment
/// </summary>
/// <param name="configuration"></param>
/// <param name="runActivators"></param>
public static void LoadPackages(Action <IPackageFacility> configuration, bool runActivators = true)
//consider renaming to InitializeEnvironment
//have it return an environment object.
{
_packages.Clear();
_remotes.Clear();
Diagnostics = new BottlingDiagnostics(new LoggingSession());
var record = new BottleLoadingRecord();
Diagnostics.LogExecution(record, () => {
var remotes = RemoteService.LoadLinkedRemotes();
_remotes.AddRange(remotes);
var remoteTasks = remotes.Select(x => x.Start()).ToArray();
var facility = new PackageFacility();
var assemblyLoader = new AssemblyLoader(Diagnostics);
var graph = new PackagingRuntimeGraph(Diagnostics, assemblyLoader, _packages);
var codeLocation = ProvenanceHelper.GetProvenanceFromStack();
graph.InProvenance(codeLocation, g =>
{
//collect user configuration
configuration(facility);
//applies collected configurations
facility.Configure(g);
});
graph.DiscoverAndLoadPackages(() =>
{
//clearing assemblies why? - my guess is testing.
// this should only really be called once.
_assemblies.Clear();
_assemblies.AddRange(assemblyLoader.Assemblies);
//the above assemblies are used when we need to resolve bottle assemblies
}, runActivators);
Task.WaitAll(remoteTasks);
});
record.Finished = DateTime.Now;
}