コード例 #1
0
ファイル: BuildExtensions.cs プロジェクト: lucascebertin/nuke
 private static IEnumerable <TargetDefinition> GetDependencies(
     TargetDefinition targetDefinition,
     IReadOnlyDictionary <string, TargetDefinition> nameDictionary,
     IReadOnlyDictionary <Target, TargetDefinition> factoryDictionary)
 {
     return(targetDefinition.NamedDependencies
            .Select(x => nameDictionary.TryGetValue(x, out var namedTarget)
             ? namedTarget
             : TargetDefinition.Create(x))
            .Concat(targetDefinition.FactoryDependencies.Select(x => factoryDictionary[x])));
 }
コード例 #2
0
 private static IEnumerable <TargetDefinition> GetDependencies(
     TargetDefinition targetDefinition,
     IReadOnlyDictionary <string, TargetDefinition> nameDictionary,
     IReadOnlyDictionary <Target, TargetDefinition> factoryDictionary)
 {
     return(targetDefinition.ShadowTargetDependencies
            .Select(shadowTargetName => nameDictionary.TryGetValue(shadowTargetName, out var shadowTarget)
             ? shadowTarget
             : TargetDefinition.Create(shadowTargetName))
            .Concat(targetDefinition.TargetDependencies.Select(x => factoryDictionary[x])));
 }
コード例 #3
0
        public static IReadOnlyCollection <ExecutableTarget> CreateAll <T>(
            T build,
            params Expression <Func <T, Target> >[] defaultTargetExpressions)
            where T : NukeBuild
        {
            var buildType        = build.GetType();
            var targetProperties = GetTargetProperties(build.GetType()).ToList();
            var defaultTargets   = defaultTargetExpressions.Select(x => x.Compile().Invoke(build)).ToList();

            ExecutableTarget Create(PropertyInfo property)
            {
                var baseMembers = buildType
                                  .Descendants(x => x.BaseType)
                                  .Select(x => x.GetProperty(property.Name))
                                  .Where(x => x != null && x.DeclaringType == x.ReflectedType)
                                  .Reverse().ToList();
                var definition = new TargetDefinition(property, build, new Stack <PropertyInfo>(baseMembers));

                var factory = (Target)property.GetValue(build);

                factory.Invoke(definition);

                return(new ExecutableTarget
                {
                    Name = property.GetDisplayShortName(),
                    Member = property,
                    Definition = definition,
                    Description = definition.Description,
                    Factory = factory,
                    IsDefault = defaultTargets.Contains(factory),
                    DynamicConditions = definition.DynamicConditions,
                    StaticConditions = definition.StaticConditions,
                    DependencyBehavior = definition.DependencyBehavior,
                    ProceedAfterFailure = definition.IsProceedAfterFailure,
                    AssuredAfterFailure = definition.IsAssuredAfterFailure,
                    Requirements = definition.Requirements,
                    Actions = definition.Actions,
                    Listed = !definition.IsInternal,
                    PartitionSize = definition.PartitionSize,
                    ArtifactProducts = definition.ArtifactProducts
                });
            }

            var executables = targetProperties.Select(Create).ToList();

            executables.ForEach(x => ApplyDependencies(x, executables));

            return(executables);
        }
コード例 #4
0
        private static IEnumerable <TargetDefinition> GetDependencies(
            TargetDefinition targetDefinition,
            IReadOnlyDictionary <Target, TargetDefinition> factoryDictionary)
        {
            foreach (var target in targetDefinition.FactoryDependencies.Select(x => factoryDictionary[x]))
            {
                yield return(target);
            }

            foreach (var target in targetDefinition.RunAfterTargets.Select(x => factoryDictionary[x]))
            {
                yield return(target);
            }

            foreach (var target in factoryDictionary.Values.Where(x => x.RunBeforeTargets.Contains(targetDefinition.Factory)))
            {
                yield return(target);
            }
        }
コード例 #5
0
        private static void SkipTargetAndDependencies(
            TargetDefinition targetDefinition,
            IReadOnlyCollection <TargetDefinition> invokedTargets,
            IReadOnlyCollection <TargetDefinition> executingTargets,
            IDictionary <TargetDefinition, List <TargetDefinition> > skipRequestDictionary = null)
        {
            skipRequestDictionary = skipRequestDictionary ?? new Dictionary <TargetDefinition, List <TargetDefinition> >();

            targetDefinition.Skip = true;
            foreach (var dependency in targetDefinition.TargetDefinitionDependencies)
            {
                if (invokedTargets.Contains(dependency))
                {
                    continue;
                }

                var skipRequests = skipRequestDictionary.GetValueOrDefault(dependency);
                if (skipRequests == null)
                {
                    skipRequests = skipRequestDictionary[dependency] = new List <TargetDefinition>();
                }

                var executingDependentTargets = executingTargets
                                                .Where(x => x != targetDefinition)
                                                .Where(x => x.TargetDefinitionDependencies.Contains(dependency) && !skipRequests.Contains(x));

                if (executingDependentTargets.Any())
                {
                    skipRequests.Add(targetDefinition);
                }
                else
                {
                    SkipTargetAndDependencies(dependency, invokedTargets, executingTargets, skipRequestDictionary);
                }
            }
        }
コード例 #6
0
        public static IReadOnlyCollection <ExecutableTarget> CreateAll <T>(
            T build,
            params Expression <Func <T, Target> >[] defaultTargetExpressions)
            where T : NukeBuild
        {
            var defaultTargets = defaultTargetExpressions.Select(x => x.Compile().Invoke(build)).ToList();
            var properties     = build.GetType()
                                 .GetProperties(ReflectionService.Instance)
                                 .Where(x => x.PropertyType == typeof(Target)).ToList();

            var executables = new List <ExecutableTarget>();

            foreach (var property in properties)
            {
                var factory    = (Target)property.GetValue(build);
                var definition = new TargetDefinition();
                factory.Invoke(definition);

                var target = new ExecutableTarget
                {
                    Name                = property.Name,
                    Member              = property,
                    Definition          = definition,
                    Description         = definition.Description,
                    Factory             = factory,
                    IsDefault           = defaultTargets.Contains(factory),
                    DynamicConditions   = definition.DynamicConditions,
                    StaticConditions    = definition.StaticConditions,
                    DependencyBehavior  = definition.DependencyBehavior,
                    ProceedAfterFailure = definition.IsProceedAfterFailure,
                    AssuredAfterFailure = definition.IsAssuredAfterFailure,
                    Requirements        = definition.Requirements,
                    Actions             = definition.Actions,
                    Listed              = !definition.IsInternal
                };

                executables.Add(target);
            }

            foreach (var executable in executables)
            {
                IEnumerable <ExecutableTarget> GetDependencies(
                    Func <TargetDefinition, IReadOnlyList <Target> > directDependenciesSelector,
                    Func <TargetDefinition, IReadOnlyList <Target> > indirectDependenciesSelector)
                {
                    foreach (var factoryDependency in directDependenciesSelector(executable.Definition))
                    {
                        yield return(executables.Single(x => x.Factory == factoryDependency));
                    }

                    foreach (var otherExecutables in executables.Where(x => x != executable))
                    {
                        var otherDependencies = indirectDependenciesSelector(otherExecutables.Definition);
                        if (otherDependencies.Any(x => x == executable.Factory))
                        {
                            yield return(otherExecutables);
                        }
                    }
                }

                executable.ExecutionDependencies.AddRange(GetDependencies(x => x.DependsOnTargets, x => x.DependentForTargets));
                executable.OrderDependencies.AddRange(GetDependencies(x => x.AfterTargets, x => x.BeforeTargets));
                executable.TriggerDependencies.AddRange(GetDependencies(x => x.TriggeredByTargets, x => x.TriggersTargets));
                executable.Triggers.AddRange(GetDependencies(x => x.TriggersTargets, x => x.TriggeredByTargets));
            }

            return(executables);
        }
コード例 #7
0
        private static TargetDefinition LoadTargetDefinition(NukeBuild build, PropertyInfo property)
        {
            var targetFactory = (Target)property.GetValue(build);

            return(TargetDefinition.Create(property.Name, targetFactory));
        }
コード例 #8
0
 private static string GetDeclaration(this TargetDefinition targetDefinition)
 {
     return(targetDefinition.IsDefault
         ? $"defaultTarget[{targetDefinition.Name}]"
         : targetDefinition.Name);
 }