Beispiel #1
0
        Configuration.PackageReference[] GetWorkflowPackageDependencies(string[] fileNames)
        {
            var assemblies = new HashSet <Assembly>();

            foreach (var path in fileNames)
            {
                var metadata = WorkflowBuilder.ReadMetadata(path);
                using (var markupReader = new StringReader(metadata.WorkflowMarkup))
                    using (var reader = XmlReader.Create(markupReader))
                    {
                        reader.ReadToFollowing(WorkflowElementName);
                        using (var workflowReader = reader.ReadSubtree())
                        {
                            while (workflowReader.ReadToFollowing(ExpressionElementName))
                            {
                                if (!workflowReader.HasAttributes)
                                {
                                    continue;
                                }
                                if (workflowReader.GetAttribute(TypeAttributeName, XsiAttributeValue) == IncludeWorkflowTypeName)
                                {
                                    var includePath    = workflowReader.GetAttribute(PathAttributeName);
                                    var separatorIndex = includePath != null?includePath.IndexOf(AssemblySeparator) : -1;

                                    if (separatorIndex >= 0 && !Path.IsPathRooted(includePath))
                                    {
                                        var assemblyName = includePath.Split(new[] { AssemblySeparator }, 2)[0];
                                        if (!string.IsNullOrEmpty(assemblyName))
                                        {
                                            var assembly = Assembly.Load(assemblyName);
                                            assemblies.Add(assembly);
                                        }
                                    }
                                }
                            }
                        }
                    }

                assemblies.Add(typeof(WorkflowBuilder).Assembly);
                assemblies.AddRange(metadata.GetExtensionTypes().Select(type => type.Assembly));

                var layoutPath = Path.ChangeExtension(path, Path.GetExtension(path) + Constants.LayoutExtension);
                if (File.Exists(layoutPath))
                {
                    var visualizerMap = new Lazy <IDictionary <string, Type> >(() =>
                                                                               TypeVisualizerLoader.GetVisualizerTypes(packageConfiguration)
                                                                               .Select(descriptor => descriptor.VisualizerTypeName).Distinct()
                                                                               .Select(typeName => Type.GetType(typeName, false))
                                                                               .Where(type => type != null)
                                                                               .ToDictionary(type => type.FullName)
                                                                               .Wait());

                    using (var reader = XmlReader.Create(layoutPath))
                    {
                        var layout = (VisualizerLayout)VisualizerLayout.Serializer.Deserialize(reader);
                        foreach (var settings in GetVisualizerSettings(layout))
                        {
                            var typeName = settings.VisualizerTypeName;
                            if (typeName == null)
                            {
                                continue;
                            }
                            if (visualizerMap.Value.TryGetValue(typeName, out Type type))
                            {
                                assemblies.Add(type.Assembly);
                            }
                        }
                    }
                }
            }

            var packageMap   = packageConfiguration.GetPackageReferenceMap();
            var dependencies = packageConfiguration.GetAssemblyPackageReferences(
                assemblies.Select(assembly => assembly.GetName().Name),
                packageMap);

            if (File.Exists(scriptEnvironment.ProjectFileName))
            {
                dependencies = dependencies.Concat(
                    from id in scriptEnvironment.GetPackageReferences()
                    where packageConfiguration.Packages.Contains(id)
                    select packageConfiguration.Packages[id]);
            }

            return(dependencies.ToArray());
        }