예제 #1
0
        private async Task Proceed(IBuildTask task, IList<ProjectItem> items)
        {
            if (!task.DependsOn.IsMatch(items))
                return;

            var querySets = task.DependsOn.Select(_project.GetItems(), items).ToList();
            foreach (var querySet in querySets)
            {
                var sources = task.Proceed(querySet.GetItems());
                if (sources == null)
                    throw new InvalidOperationException("The proceed method has to return a value.");

                foreach (var source in sources)
                {
                    ProjectItem existing;
                    if (_project.TryGetItemById(source.Identifier, out existing))
                    {
                        var defferred = existing as DefferedProjectItem;
                        defferred?.SetDirty(source.Content);

                        var inMemory = existing as InMemoryProjectItem;
                        inMemory?.SetContent((await CopyToStream(source)).GetBuffer());

                        _project.Touch(existing);
                    }
                    else
                    {
                        ProjectItem item2;
                        if (task.Options == BuildOptions.BuildInBackground)
                        {
                            item2 = await BuildInMemoryItem(source);
                        }
                        else
                            item2 = new DefferedProjectItem(source.Identifier, source.Content);

                        _project.AddItem(item2);

                        foreach (var linkedItem in querySet.GetItems())
                            _project.AddLink(linkedItem, new ProjectItemLinkDescriptionFromBuilder(task.Name, this, linkedItem), item2);
                    }
                }
            }
        }