/// <nodoc/> public PipConstructor( FrontEndContext context, FrontEndHost frontEndHost, ModuleDefinition moduleDefinition, IMsBuildResolverSettings resolverSettings, AbsolutePath pathToMsBuild, AbsolutePath pathToDotnetExe, string frontEndName, IEnumerable <KeyValuePair <string, string> > userDefinedEnvironment, IEnumerable <string> userDefinedPassthroughVariables) { Contract.Requires(context != null); Contract.Requires(frontEndHost != null); Contract.Requires(moduleDefinition != null); Contract.Requires(resolverSettings != null); Contract.Requires(pathToMsBuild.IsValid); Contract.Requires(!resolverSettings.ShouldRunDotNetCoreMSBuild() || pathToDotnetExe.IsValid); Contract.Requires(!string.IsNullOrEmpty(frontEndName)); Contract.Requires(userDefinedEnvironment != null); Contract.Requires(userDefinedPassthroughVariables != null); m_context = context; m_frontEndHost = frontEndHost; m_moduleDefinition = moduleDefinition; m_resolverSettings = resolverSettings; m_msBuildPath = pathToMsBuild; m_dotnetExePath = pathToDotnetExe; m_frontEndName = frontEndName; m_userDefinedEnvironment = userDefinedEnvironment; m_userDefinedPassthroughVariables = userDefinedPassthroughVariables; }
/// <nodoc/> public MsBuildResolverSettings( IMsBuildResolverSettings resolverSettings, PathRemapper pathRemapper) : base(resolverSettings, pathRemapper) { Root = pathRemapper.Remap(resolverSettings.Root); RootTraversal = resolverSettings.RootTraversal.IsValid? pathRemapper.Remap(resolverSettings.RootTraversal) : Root; ModuleName = resolverSettings.ModuleName; AdditionalOutputDirectories = resolverSettings.AdditionalOutputDirectories; UntrackedDirectoryScopes = resolverSettings.UntrackedDirectoryScopes; UntrackedFiles = resolverSettings.UntrackedFiles; UntrackedDirectories = resolverSettings.UntrackedDirectories; RunInContainer = resolverSettings.RunInContainer; MsBuildSearchLocations = resolverSettings.MsBuildSearchLocations; FileNameEntryPoints = resolverSettings.FileNameEntryPoints; InitialTargets = resolverSettings.InitialTargets; Environment = resolverSettings.Environment; GlobalProperties = resolverSettings.GlobalProperties; LogVerbosity = resolverSettings.LogVerbosity; EnableBinLogTracing = resolverSettings.EnableBinLogTracing; EnableEngineTracing = resolverSettings.EnableEngineTracing; KeepProjectGraphFile = resolverSettings.KeepProjectGraphFile; EnableTransitiveProjectReferences = resolverSettings.EnableTransitiveProjectReferences; UseLegacyProjectIsolation = resolverSettings.UseLegacyProjectIsolation; DoubleWritePolicy = resolverSettings.DoubleWritePolicy; AllowProjectsToNotSpecifyTargetProtocol = resolverSettings.AllowProjectsToNotSpecifyTargetProtocol; MsBuildRuntime = resolverSettings.MsBuildRuntime; DotNetSearchLocations = resolverSettings.DotNetSearchLocations; UseManagedSharedCompilation = resolverSettings.UseManagedSharedCompilation; }
/// <summary> /// Process <see cref="IMsBuildResolverSettings.Environment"/> and split the specified environment variables that need to be exposed and tracked from the passthrough environment variables /// </summary> /// <remarks> /// When <see cref="IMsBuildResolverSettings.Environment"/> is null, the current environment is defined as the tracked environment, with no passthroughs /// </remarks> public static void ComputeEnvironment(this IMsBuildResolverSettings msBuildResolverSettings, out IDictionary <string, string> trackedEnv, out ICollection <string> passthroughEnv) { if (msBuildResolverSettings.Environment == null) { var allEnvironmentVariables = Environment.GetEnvironmentVariables(); trackedEnv = new Dictionary <string, string>(allEnvironmentVariables.Count); foreach (var envVar in allEnvironmentVariables.Keys) { object value = allEnvironmentVariables[envVar]; trackedEnv[envVar.ToString()] = value.ToString(); } passthroughEnv = CollectionUtilities.EmptyArray <string>(); return; } var trackedList = new Dictionary <string, string>(); var passthroughList = new List <string>(); foreach (var kvp in msBuildResolverSettings.Environment) { var valueOrPassthrough = kvp.Value?.GetValue(); if (valueOrPassthrough == null || valueOrPassthrough is string) { trackedList.Add(kvp.Key, (string)valueOrPassthrough); } else { passthroughList.Add(kvp.Key); } } trackedEnv = trackedList; passthroughEnv = passthroughList; }
/// <nodoc/> public MsBuildGraphConstructionFailure(IMsBuildResolverSettings settings, PathTable pathTable) { Contract.Requires(settings != null); Contract.Requires(pathTable != null); m_settings = settings; m_pathTable = pathTable; }
/// <inheritdoc/> public bool TryInitialize( FrontEndHost host, FrontEndContext context, IConfiguration configuration, IResolverSettings resolverSettings) { InitializeInterpreter(host, context, configuration); m_resolverSettings = resolverSettings as IMsBuildResolverSettings; Contract.Assert(m_resolverSettings != null); return(true); }
/// <inheritdoc/> public bool TryInitialize( FrontEndHost host, FrontEndContext context, IConfiguration configuration, IResolverSettings resolverSettings) { m_host = host; m_context = context; m_configuration = configuration; m_resolverSettings = resolverSettings as IMsBuildResolverSettings; m_resolverSettings.ComputeEnvironment(out m_userDefinedEnvironment, out m_passthroughVariables, out m_processEnvironmentUsed); Contract.Assert(m_resolverSettings != null); return(true); }
/// <inheritdoc/> public Task <bool> InitResolverAsync(IResolverSettings resolverSettings, object workspaceResolver) { Name = resolverSettings.Name; m_msBuildResolverSettings = resolverSettings as IMsBuildResolverSettings; Contract.Assert( m_msBuildResolverSettings != null, I($"Wrong type for resolver settings, expected {nameof(IMsBuildResolverSettings)} but got {nameof(resolverSettings.GetType)}")); m_msBuildWorkspaceResolver = workspaceResolver as MsBuildWorkspaceResolver; Contract.Assert(m_msBuildWorkspaceResolver != null, I($"Wrong type for resolver, expected {nameof(MsBuildWorkspaceResolver)} but got {nameof(workspaceResolver.GetType)}")); if (!ValidateResolverSettings(m_msBuildResolverSettings)) { return(Task.FromResult(false)); } return(Task.FromResult(true)); }
/// <inheritdoc/> public bool TryInitialize( FrontEndHost host, FrontEndContext context, IConfiguration configuration, IResolverSettings resolverSettings, QualifierId[] requestedQualifiers) { Contract.Requires(requestedQualifiers?.Length > 0); InitializeInterpreter(host, context, configuration); m_resolverSettings = resolverSettings as IMsBuildResolverSettings; Contract.Assert(m_resolverSettings != null); m_requestedQualifiers = requestedQualifiers; return(true); }
private bool ValidateResolverSettings(IMsBuildResolverSettings msBuildResolverSettings) { var pathToFile = msBuildResolverSettings.File.ToString(Context.PathTable); if (!msBuildResolverSettings.Root.IsValid) { Tracing.Logger.Log.InvalidResolverSettings(Context.LoggingContext, Location.FromFile(pathToFile), "The root must be specified."); return(false); } if (string.IsNullOrEmpty(msBuildResolverSettings.ModuleName)) { Tracing.Logger.Log.InvalidResolverSettings(Context.LoggingContext, Location.FromFile(pathToFile), "The module name must not be empty."); return(false); } return(true); }
/// <nodoc/> public PipGraphConstructor( FrontEndContext context, FrontEndHost frontEndHost, ModuleDefinition moduleDefinition, IMsBuildResolverSettings resolverSettings, AbsolutePath pathToMsBuildExe, string frontEndName) { Contract.Requires(context != null); Contract.Requires(frontEndHost != null); Contract.Requires(moduleDefinition != null); Contract.Requires(resolverSettings != null); Contract.Requires(pathToMsBuildExe.IsValid); Contract.Requires(!string.IsNullOrEmpty(frontEndName)); m_context = context; m_frontEndHost = frontEndHost; m_pipConstructor = new PipConstructor(context, frontEndHost, moduleDefinition, resolverSettings, pathToMsBuildExe, frontEndName); }
/// <nodoc/> public PipConstructor( FrontEndContext context, FrontEndHost frontEndHost, ModuleDefinition moduleDefinition, IMsBuildResolverSettings resolverSettings, AbsolutePath pathToMsBuildExe, string frontEndName) { Contract.Requires(context != null); Contract.Requires(frontEndHost != null); Contract.Requires(moduleDefinition != null); Contract.Requires(resolverSettings != null); Contract.Requires(pathToMsBuildExe.IsValid); Contract.Requires(!string.IsNullOrEmpty(frontEndName)); m_context = context; m_frontEndHost = frontEndHost; m_moduleDefinition = moduleDefinition; m_resolverSettings = resolverSettings; m_msBuildExePath = pathToMsBuildExe; m_frontEndName = frontEndName; }
private bool ValidateResolverSettings(IMsBuildResolverSettings msBuildResolverSettings) { var pathToFile = msBuildResolverSettings.File.ToString(m_context.PathTable); if (!msBuildResolverSettings.Root.IsValid) { Tracing.Logger.Log.InvalidResolverSettings(m_context.LoggingContext, Location.FromFile(pathToFile), "The root must be specified."); return(false); } if (string.IsNullOrEmpty(msBuildResolverSettings.ModuleName)) { Tracing.Logger.Log.InvalidResolverSettings(m_context.LoggingContext, Location.FromFile(pathToFile), "The module name must not be empty."); return(false); } // Global property keys for MSBuild are case insensitive, but unfortunately we don't have maps with explicit comparers in dscript. // So we need to validate there are not two property keys that only differ in case if (msBuildResolverSettings.GlobalProperties != null) { var globalKeys = msBuildResolverSettings.GlobalProperties.Keys; // Store all keys in a case insensitive dictionary. If any of them get collapsed, there are keys that only differ in case var caseInsensitiveKeys = new HashSet <string>(globalKeys, StringComparer.OrdinalIgnoreCase); if (caseInsensitiveKeys.Count == globalKeys.Count()) { return(true); } // So there are some keys that only differ in case. Each case insensitive key that is not in the original set of keys is problematic var problematicKeys = globalKeys.Except(caseInsensitiveKeys); Tracing.Logger.Log.InvalidResolverSettings(m_context.LoggingContext, Location.FromFile(pathToFile), $"Global property key(s) '{string.Join(", ", problematicKeys)}' specified multiple times with casing differences only. MSBuild global property keys are case insensitive."); return(false); } return(true); }
/// <inheritdoc/> public bool TryInitialize( FrontEndHost host, FrontEndContext context, IConfiguration configuration, IResolverSettings resolverSettings, QualifierId[] requestedQualifiers) { Contract.Requires(requestedQualifiers?.Length > 0); m_host = host; m_context = context; m_configuration = configuration; m_resolverSettings = resolverSettings as IMsBuildResolverSettings; m_resolverSettings.ComputeEnvironment(out m_userDefinedEnvironment, out m_passthroughVariables); Contract.Assert(m_resolverSettings != null); m_requestedQualifiers = requestedQualifiers; return(true); }
/// <nodoc/> public PipGraphConstructor( FrontEndContext context, FrontEndHost frontEndHost, ModuleDefinition moduleDefinition, IMsBuildResolverSettings resolverSettings, AbsolutePath pathToMsBuildExe, string frontEndName, IEnumerable <KeyValuePair <string, string> > userDefinedEnvironment, IEnumerable <string> userDefinedPassthroughVariables) { Contract.Requires(context != null); Contract.Requires(frontEndHost != null); Contract.Requires(moduleDefinition != null); Contract.Requires(resolverSettings != null); Contract.Requires(pathToMsBuildExe.IsValid); Contract.Requires(!string.IsNullOrEmpty(frontEndName)); Contract.Requires(userDefinedEnvironment != null); Contract.Requires(userDefinedPassthroughVariables != null); m_context = context; m_frontEndHost = frontEndHost; m_pipConstructor = new PipConstructor(context, frontEndHost, moduleDefinition, resolverSettings, pathToMsBuildExe, frontEndName, userDefinedEnvironment, userDefinedPassthroughVariables); }
/// <nodoc/> public MsBuildResolverSettings( IMsBuildResolverSettings resolverSettings, PathRemapper pathRemapper) : base(resolverSettings, pathRemapper) { Root = pathRemapper.Remap(resolverSettings.Root); RootTraversal = resolverSettings.RootTraversal.IsValid? pathRemapper.Remap(resolverSettings.RootTraversal) : Root; ModuleName = resolverSettings.ModuleName; AdditionalOutputDirectories = resolverSettings.AdditionalOutputDirectories; UntrackedDirectoryScopes = resolverSettings.UntrackedDirectoryScopes; UntrackedFiles = resolverSettings.UntrackedFiles; UntrackedDirectories = resolverSettings.UntrackedDirectories; RunInContainer = resolverSettings.RunInContainer; MsBuildSearchLocations = resolverSettings.MsBuildSearchLocations; FileNameEntryPoint = resolverSettings.FileNameEntryPoint; InitialTargets = resolverSettings.InitialTargets; Environment = resolverSettings.Environment; GlobalProperties = resolverSettings.GlobalProperties; LogVerbosity = resolverSettings.LogVerbosity; EnableBinLogTracing = resolverSettings.EnableBinLogTracing; EnableEngineTracing = resolverSettings.EnableEngineTracing; KeepProjectGraphFile = resolverSettings.KeepProjectGraphFile; EnableTransitiveProjectReferences = resolverSettings.EnableTransitiveProjectReferences; }
/// <summary> /// Whether MSBuildRuntime is DotNetCore. /// </summary> /// <remarks> /// Keep in sync with Public\Sdk\Public\Prelude\Prelude.Configuration.Resolvers.dsc /// If not specified, the default is full framework, so this function returns false in that case. /// </remarks> public static bool ShouldRunDotNetCoreMSBuild(this IMsBuildResolverSettings msBuildResolverSettings) => msBuildResolverSettings.MsBuildRuntime == "DotNetCore";