예제 #1
0
        /// <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;
        }
예제 #2
0
 /// <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;
 }
예제 #3
0
        /// <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);
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
        /// <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));
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        /// <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);
        }
예제 #11
0
        /// <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;
        }
예제 #12
0
        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);
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
        /// <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);
        }
예제 #15
0
 /// <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;
 }
예제 #16
0
 /// <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";