Exemplo n.º 1
0
        public static IReadOnlyCollection <TargetDefinition> GetExecutingTargets(NukeBuild build, [CanBeNull] string[] invokedTargetNames = null)
        {
            ControlFlow.Assert(build.TargetDefinitions.All(x => !x.Name.EqualsOrdinalIgnoreCase(BuildExecutor.DefaultTarget)),
                               $"The name '{BuildExecutor.DefaultTarget}' cannot be used as target name.");

            var invokedTargets   = invokedTargetNames?.Select(x => GetDefinition(x, build)).ToList() ?? new List <TargetDefinition>();
            var executingTargets = GetUnfilteredExecutingTargets(build, invokedTargets);

            var skippedTargets = executingTargets
                                 .Where(x => !invokedTargets.Contains(x) &&
                                        build.SkippedTargets != null &&
                                        (build.SkippedTargets.Length == 0 ||
                                         build.SkippedTargets.Contains(x.Name, StringComparer.OrdinalIgnoreCase))).ToList();

            skippedTargets.ForEach(x => x.Skip = true);
            executingTargets
            .Where(x => x.DependencyBehavior == DependencyBehavior.Skip)
            .Where(x => x.Conditions.Any(y => !y()))
            .ForEach(x => SkipTargetAndDependencies(x, invokedTargets, executingTargets));

            string[] GetNames(IEnumerable <TargetDefinition> targets)
            => targets.Select(x => x.Name).ToArray();

            ReflectionService.SetValue(build, nameof(NukeBuild.InvokedTargets), GetNames(invokedTargets));
            ReflectionService.SetValue(build, nameof(NukeBuild.SkippedTargets), GetNames(skippedTargets));
            ReflectionService.SetValue(build, nameof(NukeBuild.ExecutingTargets), GetNames(executingTargets.Except(skippedTargets)));

            return(executingTargets);
        }
Exemplo n.º 2
0
        private static void TryInjectValueInteractive(MemberInfo member, NukeBuild build)
        {
            if (!member.HasCustomAttribute <ParameterAttribute>())
            {
                return;
            }

            if (member is PropertyInfo property && !property.CanWrite)
            {
                return;
            }

            var memberType        = member.GetMemberType();
            var nameOrDescription = ParameterService.GetParameterDescription(member) ??
                                    ParameterService.GetParameterMemberName(member);
            var text = $"{nameOrDescription.TrimEnd('.')}:";

            while (member.GetValue(build) == null)
            {
                var valueSet = ParameterService.GetParameterValueSet(member, build);
                var value    = valueSet == null
                    ? ConsoleUtility.PromptForInput(text, defaultValue : null)
                    : ConsoleUtility.PromptForChoice(text, valueSet.Select(x => (x.Object, x.Text)).ToArray());

                member.SetValue(build, ReflectionService.Convert(value, memberType));
            }
        }
Exemplo n.º 3
0
        private static void InjectValueInteractive(NukeBuild build, MemberInfo member)
        {
            var memberType        = member.GetMemberType();
            var nameOrDescription = ParameterService.Instance.GetParameterDescription(member) ??
                                    ParameterService.Instance.GetParameterName(member);
            var text = $"{nameOrDescription.TrimEnd('.')}:";

            while (member.GetValue(build) == null)
            {
                var valueSet = ParameterService.Instance.GetParameterValueSet(member, build);
                var value    = valueSet == null
                    ? ConsoleUtility.PromptForInput(text, defaultValue : null)
                    : ConsoleUtility.PromptForChoice(text, valueSet.Select(x => (x.Object, x.Text)).ToArray());

                member.SetValue(build, ReflectionService.Convert(value, memberType));
            }
        }
Exemplo n.º 4
0
        public static void InjectValues(NukeBuild build)
        {
            var anyInjected = false;

            var injectionMembers = build.GetInjectionMembers()
                                   .OrderByDescending(x => x.GetCustomAttribute <ParameterAttribute>() != null);

            foreach (var member in injectionMembers)
            {
                if (member.DeclaringType == typeof(NukeBuild))
                {
                    continue;
                }

                var attributes = member.GetCustomAttributes().OfType <InjectionAttributeBase>().ToList();
                if (attributes.Count == 0)
                {
                    continue;
                }
                ControlFlow.Assert(attributes.Count == 1, $"Member '{member.Name}' has multiple injection attributes applied.");

                var attribute = attributes.Single();
                var value     = attribute.GetValue(member, build);
                if (value == null)
                {
                    continue;
                }

                var valueType = value.GetType();
                ControlFlow.Assert(member.GetFieldOrPropertyType().IsAssignableFrom(valueType),
                                   $"Member '{member.Name}' must be of type '{valueType.Name}' to get its valued injected from '{attribute.GetType().Name}'.");
                ReflectionService.SetValue(build, member, value);

                anyInjected = true;
            }

            if (anyInjected)
            {
                Logger.Log();
            }
        }
Exemplo n.º 5
0
        public static IReadOnlyCollection <TargetDefinition> GetExecutingTargets(NukeBuild build)
        {
            ControlFlow.Assert(build.TargetDefinitions.All(x => !x.Name.EqualsOrdinalIgnoreCase(BuildExecutor.DefaultTarget)),
                               "The name 'default' cannot be used as target name.");

            var invokedTargets   = build.InvokedTargets.Select(x => GetDefinition(x, build)).ToList();
            var executingTargets = GetUnfilteredExecutingTargets(build, invokedTargets);
            var skippedTargets   = executingTargets
                                   .Where(x => !invokedTargets.Contains(x) &&
                                          build.SkippedTargets != null &&
                                          (build.SkippedTargets.Length == 0 ||
                                           build.SkippedTargets.Contains(x.Name, StringComparer.OrdinalIgnoreCase))).ToList();

            skippedTargets.ForEach(x => x.Conditions.Add(() => false));

            string[] GetNames(IEnumerable <TargetDefinition> targets)
            => targets.Select(x => x.Name).ToArray();

            ReflectionService.SetValue(build, nameof(NukeBuild.InvokedTargets), GetNames(invokedTargets));
            ReflectionService.SetValue(build, nameof(NukeBuild.SkippedTargets), GetNames(skippedTargets));
            ReflectionService.SetValue(build, nameof(NukeBuild.ExecutingTargets), GetNames(executingTargets.Except(skippedTargets)));

            return(executingTargets);
        }