public void MultiPassResolutionDoesNotIntroduceConflictingRequirements() { var a = new Service { ProjectName = "Test", ServiceName = "A", DesiredLevel = ServiceDesiredLevel.Recommended, Requires = new List<string> { "Test/B" }, }; var b = new Service { ProjectName = "Test", ServiceName = "B", }; var c = new Service { ProjectName = "Test", ServiceName = "C", Conflicts = new List<string> { "Test/A", "Test/B" }, }; var services = new List<Service> { a, b, c }; var manager = new ServiceManager("Windows"); manager.EnableService("Test/C"); manager.EnableDefaultAndExplicitServices(services); // This should not throw an exception. var enabled = manager.ResolveServices(services); Assert.DoesNotContain(a, enabled); Assert.DoesNotContain(b, enabled); Assert.Contains(c, enabled); }
public override bool Execute() { if (string.Compare(this.Platform, "Web", StringComparison.InvariantCultureIgnoreCase) == 0) { // Trigger JSIL provider download if needed. string jsilDirectory, jsilCompilerFile; if (!this.m_JSILProvider.GetJSIL(out jsilDirectory, out jsilCompilerFile)) { return false; } } var module = ModuleInfo.Load(Path.Combine(this.RootPath, "Build", "Module.xml")); this.LogMessage( "Starting generation of projects for " + this.Platform); var definitions = module.GetDefinitionsRecursively(this.Platform).ToArray(); var loadedProjects = new List<XmlDocument>(); foreach (var definition in definitions) { this.LogMessage("Loading: " + definition.Name); loadedProjects.Add( this.m_ProjectLoader.Load( Path.Combine( definition.ModulePath, "Build", "Projects", definition.Name + ".definition"), this.Platform, module.Path, definition.ModulePath)); } var serviceManager = new ServiceManager(this.Platform); List<Service> services; string serviceSpecPath; if (this.ServiceSpecPath == null) { serviceManager.SetRootDefinitions(module.GetDefinitions()); if (this.EnableServices == null) { this.EnableServices = new string[0]; } if (this.DisableServices == null) { this.DisableServices = new string[0]; } foreach (var service in this.EnableServices) { serviceManager.EnableService(service); } foreach (var service in this.DisableServices) { serviceManager.DisableService(service); } if (this.DebugServiceResolution) { serviceManager.EnableDebugInformation(); } try { services = serviceManager.CalculateDependencyGraph(loadedProjects); } catch (InvalidOperationException ex) { Console.WriteLine("Error during service resolution: " + ex.Message); return false; } serviceSpecPath = serviceManager.SaveServiceSpec(services); foreach (var service in services) { if (service.ServiceName != null) { this.LogMessage("Enabled service: " + service.FullName); } } } else { services = serviceManager.LoadServiceSpec(this.ServiceSpecPath); serviceSpecPath = this.ServiceSpecPath; } // Run Protobuild in batch mode in each of the submodules // where it is present. foreach (var submodule in module.GetSubmodules(this.Platform)) { this.LogMessage( "Invoking submodule generation for " + submodule.Name); var noResolve = submodule.HasProtobuildFeature("no-resolve") ? " -no-resolve" : string.Empty; submodule.RunProtobuild( "-generate " + this.Platform + " -spec " + serviceSpecPath + " " + this.m_PackageRedirector.GetRedirectionArguments() + noResolve); this.LogMessage( "Finished submodule generation for " + submodule.Name); } var repositoryPaths = new List<string>(); foreach (var definition in definitions.Where(x => x.ModulePath == module.Path)) { string repositoryPath; var definitionCopy = definition; this.m_ProjectGenerator.Generate( loadedProjects, this.RootPath, definition.Name, this.Platform, services, out repositoryPath, () => this.LogMessage("Generating: " + definitionCopy.Name)); // Only add repository paths if they should be generated. if (module.GenerateNuGetRepositories && !string.IsNullOrEmpty(repositoryPath)) { repositoryPaths.Add(repositoryPath); } } var solution = Path.Combine( this.RootPath, this.ModuleName + "." + this.Platform + ".sln"); this.LogMessage("Generating: (solution)"); this.m_SolutionGenerator.Generate( module, loadedProjects, this.Platform, solution, services, repositoryPaths); // Only save the specification cache if we allow synchronisation if (module.DisableSynchronisation == null || !module.DisableSynchronisation.Value) { var serviceCache = Path.Combine(this.RootPath, this.ModuleName + "." + this.Platform + ".speccache"); this.LogMessage("Saving service specification"); File.Copy(serviceSpecPath, serviceCache, true); } this.LogMessage( "Generation complete."); return true; }
public void Autopackage( FileFilter fileFilter, Execution execution, ModuleInfo module, string rootPath, string platform, List<string> temporaryFiles) { var definitions = module.GetDefinitionsRecursively(platform).ToArray(); var loadedProjects = new List<LoadedDefinitionInfo>(); foreach (var definition in definitions) { Console.WriteLine("Loading: " + definition.Name); loadedProjects.Add( this.m_ProjectLoader.Load( platform, module, definition)); } var serviceManager = new ServiceManager(platform); List<Service> services; serviceManager.SetRootDefinitions(module.GetDefinitions()); var enabledServices = execution.EnabledServices.ToArray(); var disabledServices = execution.DisabledServices.ToArray(); foreach (var service in enabledServices) { serviceManager.EnableService(service); } foreach (var service in disabledServices) { serviceManager.DisableService(service); } if (execution.DebugServiceResolution) { serviceManager.EnableDebugInformation(); } services = serviceManager.CalculateDependencyGraph(loadedProjects.Select(x => x.Project).ToList()); foreach (var service in services) { if (service.ServiceName != null) { Console.WriteLine("Enabled service: " + service.FullName); } } var packagePaths = module.Packages .Select(x => new DirectoryInfo(System.IO.Path.Combine(module.Path, x.Folder)).FullName) .ToArray(); foreach (var definition in definitions) { if (definition.SkipAutopackage) { Console.WriteLine("Skipping: " + definition.Name); continue; } var definitionNormalizedPath = new FileInfo(definition.AbsolutePath).FullName; if (packagePaths.Any(definitionNormalizedPath.StartsWith)) { Console.WriteLine("Skipping: " + definition.Name + " (part of another package)"); continue; } switch (definition.Type) { case "External": Console.WriteLine("Packaging: " + definition.Name); this.AutomaticallyPackageExternalProject(definitions, services, fileFilter, rootPath, platform, definition, temporaryFiles); break; case "Include": Console.WriteLine("Packaging: " + definition.Name); this.AutomaticallyPackageIncludeProject(definitions, services, fileFilter, rootPath, platform, definition); break; case "Content": Console.WriteLine("Content project definition skipped: " + definition.Name); break; default: Console.WriteLine("Packaging: " + definition.Name); this.AutomaticallyPackageNormalProject(definitions, services, fileFilter, rootPath, platform, definition, temporaryFiles); break; } } // If there is no Module.xml in the source mappings already, then copy the current module. var filterDictionary = fileFilter.ToDictionarySafe( k => k.Key, v => v.Value, (dict, d) => Console.WriteLine ("WARNING: More than one file maps to " + d.Key)); if (!filterDictionary.ContainsValue("Build/Module.xml")) { fileFilter.AddManualMapping(Path.Combine(module.Path, "Build", "Module.xml"), "Build/Module.xml"); } }
public override bool Execute() { if (string.Compare(Platform, "Web", StringComparison.InvariantCultureIgnoreCase) == 0) { // Trigger JSIL provider download if needed. string jsilDirectory, jsilCompilerFile; if (!m_JSILProvider.GetJSIL(out jsilDirectory, out jsilCompilerFile)) { return false; } } var module = ModuleInfo.Load(Path.Combine(RootPath, "Build", "Module.xml")); LogMessage( "Starting generation of projects for " + Platform); var definitions = module.GetDefinitionsRecursively(Platform).ToArray(); var loadedProjects = new List<LoadedDefinitionInfo>(); foreach (var definition in definitions) { LogMessage("Loading: " + definition.Name); loadedProjects.Add( m_ProjectLoader.Load( Platform, module, definition)); } var serviceManager = new ServiceManager(Platform); List<Service> services; TemporaryServiceSpec serviceSpecPath; if (ServiceSpecPath == null) { serviceManager.SetRootDefinitions(module.GetDefinitions()); if (EnableServices == null) { EnableServices = new string[0]; } if (DisableServices == null) { DisableServices = new string[0]; } foreach (var service in EnableServices) { serviceManager.EnableService(service); } foreach (var service in DisableServices) { serviceManager.DisableService(service); } if (DebugServiceResolution) { serviceManager.EnableDebugInformation(); } try { services = serviceManager.CalculateDependencyGraph(loadedProjects.Select(x => x.Project).ToList()); } catch (InvalidOperationException ex) { Console.WriteLine("Error during service resolution: " + ex.Message); return false; } serviceSpecPath = serviceManager.SaveServiceSpec(services); foreach (var service in services) { if (service.ServiceName != null) { LogMessage("Enabled service: " + service.FullName); } } } else { services = serviceManager.LoadServiceSpec(ServiceSpecPath); serviceSpecPath = new TemporaryServiceSpec(ServiceSpecPath, true); } using (serviceSpecPath) { // Run Protobuild in batch mode in each of the submodules // where it is present. foreach (var submodule in module.GetSubmodules(Platform)) { if (_featureManager.IsFeatureEnabledInSubmodule(module, submodule, Feature.OptimizationSkipInvocationOnNoStandardProjects)) { if (submodule.GetDefinitionsRecursively(Platform).All(x => !x.IsStandardProject)) { // Do not invoke this submodule. LogMessage( "Skipping submodule generation for " + submodule.Name + " (there are no projects to generate)"); continue; } } LogMessage( "Invoking submodule generation for " + submodule.Name); var noResolve = _featureManager.IsFeatureEnabledInSubmodule(module, submodule, Feature.PackageManagementNoResolve) ? " -no-resolve" : string.Empty; var noHostPlatform = DisableHostPlatformGeneration && _featureManager.IsFeatureEnabledInSubmodule(module, submodule, Feature.NoHostGenerate) ? " -no-host-generate" : string.Empty; _moduleExecution.RunProtobuild( submodule, _featureManager.GetFeatureArgumentToPassToSubmodule(module, submodule) + "-generate " + Platform + " -spec " + serviceSpecPath + " " + m_PackageRedirector.GetRedirectionArguments() + noResolve + noHostPlatform); LogMessage( "Finished submodule generation for " + submodule.Name); } var repositoryPaths = new List<string>(); foreach (var definition in definitions.Where(x => x.ModulePath == module.Path)) { if (definition.PostBuildHook && RequiresHostPlatform != null) { // We require the host platform projects at this point. RequiresHostPlatform(); } string repositoryPath; var definitionCopy = definition; m_ProjectGenerator.Generate( definition, loadedProjects, RootPath, definition.Name, Platform, services, out repositoryPath, () => LogMessage("Generating: " + definitionCopy.Name)); // Only add repository paths if they should be generated. if (module.GenerateNuGetRepositories && !string.IsNullOrEmpty(repositoryPath)) { repositoryPaths.Add(repositoryPath); } } var solution = Path.Combine( RootPath, ModuleName + "." + Platform + ".sln"); LogMessage("Generating: (solution)"); m_SolutionGenerator.Generate( module, loadedProjects.Select(x => x.Project).ToList(), Platform, solution, services, repositoryPaths); // Only save the specification cache if we allow synchronisation if (module.DisableSynchronisation == null || !module.DisableSynchronisation.Value) { var serviceCache = Path.Combine(RootPath, ModuleName + "." + Platform + ".speccache"); LogMessage("Saving service specification"); File.Copy(serviceSpecPath.Path, serviceCache, true); } LogMessage( "Generation complete."); } return true; }