public static CSharpKernel UseWho(this CSharpKernel kernel)
 {
     kernel.AddDirective(who_and_whos());
     Formatter.Register(new CurrentVariablesFormatter());
     return(kernel);
 }
Exemplo n.º 2
0
        public static CSharpKernel UseNugetDirective(
            this CSharpKernel kernel)
        {
            var packageRefArg = new Argument <NugetPackageReference>((SymbolResult result, out NugetPackageReference reference) =>
                                                                     NugetPackageReference.TryParse(result.Token.Value, out reference))
            {
                Name = "package"
            };

            var command = new Command("#r")
            {
                packageRefArg
            };

            var restoreContext = new PackageRestoreContext();

            command.Handler = CommandHandler.Create <NugetPackageReference, KernelInvocationContext>(async(package, pipelineContext) =>
            {
                var addPackage = new AddNugetPackage(package);

                addPackage.Handler = async context =>
                {
                    var message = $"Installing package {package.PackageName}";
                    if (!string.IsNullOrWhiteSpace(package.PackageVersion))
                    {
                        message += $", version {package.PackageVersion}";
                    }

                    message += "...";

                    var key       = message;
                    var displayed = new DisplayedValueProduced(message, context.Command, valueId: key);
                    context.Publish(displayed);

                    var addPackageTask = restoreContext.AddPackage(
                        package.PackageName,
                        package.PackageVersion,
                        package.RestoreSources);

                    while (await Task.WhenAny(Task.Delay(500), addPackageTask) != addPackageTask)
                    {
                        message += ".";
                        context.Publish(new DisplayedValueUpdated(message, key));
                    }

                    message += "done!";
                    context.Publish(new DisplayedValueUpdated(message, key));

                    var result = await addPackageTask;

                    var helper = kernel.NativeAssemblyLoadHelper;

                    if (result.Succeeded)
                    {
                        switch (result)
                        {
                        case AddNugetPackageResult packageResult:

                            var nativeLibraryProbingPaths = packageResult.NativeLibraryProbingPaths;
                            helper?.SetNativeLibraryProbingPaths(nativeLibraryProbingPaths);

                            var addedAssemblyPaths =
                                packageResult
                                .AddedReferences
                                .SelectMany(added => added.AssemblyPaths)
                                .ToArray();

                            if (helper != null)
                            {
                                foreach (var addedReference in packageResult.AddedReferences)
                                {
                                    helper.Handle(addedReference);
                                }
                            }

                            kernel.AddScriptReferences(packageResult.AddedReferences);

                            context.Publish(
                                new DisplayedValueProduced($"Successfully added reference to package {package.PackageName}, version {packageResult.InstalledVersion}",
                                                           context.Command));

                            context.Publish(new NuGetPackageAdded(addPackage, package));

                            var resolvedNugetPackageReference = await restoreContext.GetResolvedNugetPackageReference(package.PackageName);

                            await context.HandlingKernel.SendAsync(
                                new LoadExtensionsInDirectory(
                                    resolvedNugetPackageReference.PackageRoot,
                                    addedAssemblyPaths));
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        var errors = $"{string.Join(Environment.NewLine, result.Errors)}";

                        switch (result)
                        {
                        case AddNugetPackageResult _:
                            context.Publish(
                                new ErrorProduced(
                                    $"Failed to add reference to package {package.PackageName}{Environment.NewLine}{errors}"));
                            break;

                        case AddNugetRestoreSourcesResult _:
                            context.Publish(
                                new ErrorProduced(
                                    $"Failed to apply RestoreSources {package.RestoreSources}{Environment.NewLine}{errors}"));
                            break;

                        default:
                            break;
                        }
                    }

                    context.Complete();
                };

                await pipelineContext.HandlingKernel.SendAsync(addPackage);
            });

            kernel.AddDirective(command);

            return(kernel);
        }
        public static CSharpKernel UseNugetDirective(this CSharpKernel kernel)
        {
            var packageRefArg = new Argument <PackageReference>(
                result =>
            {
                var token = result.Tokens.Select(t => t.Value).SingleOrDefault();
                if (PackageReference.TryParse(token, out var reference))
                {
                    return(reference);
                }
                else
                {
                    result.ErrorMessage = $"Could not parse \"{token}\" as a package reference.";
                    return(null);
                }
            })
            {
                Name = "package"
            };

            var poundR = new Command("#r")
            {
                packageRefArg
            };

            var restoreContext = new PackageRestoreContext();

            kernel.RegisterForDisposal(restoreContext);

            poundR.Handler = CommandHandler.Create <PackageReference, KernelInvocationContext>(HandleAddPackageReference);

            kernel.AddDirective(poundR);

            var restore = new Command("#!nuget-restore")
            {
                Handler  = CommandHandler.Create(DoNugetRestore(kernel, restoreContext)),
                IsHidden = true
            };

            kernel.AddDirective(restore);

            return(kernel);

            async Task HandleAddPackageReference(PackageReference package, KernelInvocationContext pipelineContext)
            {
                var addPackage = new AddPackage(package)
                {
                    Handler = (command, context) =>
                    {
                        var alreadyGotten =
                            restoreContext.ResolvedPackageReferences
                            .Concat(restoreContext.RequestedPackageReferences)
                            .FirstOrDefault(r => r.PackageName.Equals(package.PackageName, StringComparison.OrdinalIgnoreCase));

                        if (alreadyGotten is { } &&
                            !string.IsNullOrWhiteSpace(package.PackageVersion) &&
                            package.PackageVersion != alreadyGotten.PackageVersion)
                        {
                            var errorMessage = $"{GenerateErrorMessage(package, alreadyGotten)}";
                            context.Publish(new ErrorProduced(errorMessage));
                        }
Exemplo n.º 4
0
        public static CSharpKernel UseNugetDirective(
            this CSharpKernel kernel,
            Func <NativeAssemblyLoadHelper> getHelper = null)
        {
            var packageRefArg = new Argument <PackageReference>((SymbolResult result, out PackageReference reference) =>
                                                                PackageReference.TryParse(result.Token.Value, out reference))
            {
                Name = "package"
            };

            var command = new Command("#r")
            {
                packageRefArg
            };

            var restoreContext = new PackageRestoreContext();

            command.Handler = CommandHandler.Create <PackageReference, KernelInvocationContext>(async(package, pipelineContext) =>
            {
                var addPackage = new AddPackage(package)
                {
                    Handler = async context =>
                    {
                        var added =
                            await Task.FromResult(
                                restoreContext.AddPackagReference(
                                    package.PackageName,
                                    package.PackageVersion,
                                    package.RestoreSources));

                        if (!added)
                        {
                            var errorMessage = $"{GenerateErrorMessage(package)}{Environment.NewLine}";
                            context.Publish(new ErrorProduced(errorMessage));
                        }

                        context.Complete();
                    }
                };

                await pipelineContext.HandlingKernel.SendAsync(addPackage);
            });

            kernel.AddDirective(command);

            var restore = new Command("#!nuget-restore")
            {
                Handler = CommandHandler.Create(async(KernelInvocationContext pipelineContext) =>
                {
                    var nugetRestoreDirective = new RestoreNugetDirective();

                    nugetRestoreDirective.Handler = async context =>
                    {
                        var messages = new Dictionary <string, string>();
                        foreach (var package in restoreContext.PackageReferences)
                        {
                            var key = InstallingPackageMessage(package);
                            if (key == null)
                            {
                                context.Publish(new ErrorProduced($"Invalid Package Id: '{package.PackageName}'{Environment.NewLine}"));
                            }
                            else
                            {
                                var message   = key + "...";
                                var displayed = new DisplayedValueProduced(message, context.Command, null, valueId: key);
                                context.Publish(displayed);
                                messages.Add(key, message);
                            }
                        }

                        // Restore packages
                        var restorePackagesTask = restoreContext.Restore();
                        while (await Task.WhenAny(Task.Delay(500), restorePackagesTask) != restorePackagesTask)
                        {
                            foreach (var key in messages.Keys.ToArray())
                            {
                                var message = messages[key] + ".";
                                context.Publish(new DisplayedValueUpdated(message, key, null, null));
                                messages[key] = message;
                            }
                        }

                        var helper = kernel.NativeAssemblyLoadHelper;

                        var result = await restorePackagesTask;

                        if (result.Succeeded)
                        {
                            switch (result)
                            {
                            case PackageRestoreResult packageRestore:

                                var nativeLibraryProbingPaths = packageRestore.NativeLibraryProbingPaths;
                                helper?.SetNativeLibraryProbingPaths(nativeLibraryProbingPaths);

                                var addedAssemblyPaths =
                                    packageRestore
                                    .ResolvedReferences
                                    .SelectMany(added => added.AssemblyPaths)
                                    .Distinct()
                                    .ToArray();

                                if (helper != null)
                                {
                                    foreach (var addedReference in packageRestore.ResolvedReferences)
                                    {
                                        helper.Handle(addedReference);
                                    }
                                }

                                kernel.AddScriptReferences(packageRestore.ResolvedReferences);

                                foreach (var resolvedReference in packageRestore.ResolvedReferences)
                                {
                                    string message;
                                    string key = InstallingPackageMessage(resolvedReference);
                                    if (messages.TryGetValue(key, out message))
                                    {
                                        context.Publish(new DisplayedValueUpdated(message + " done!", key, null, null));
                                        messages[key] = message;
                                    }

                                    context.Publish(new PackageAdded(new AddPackage(resolvedReference)));

                                    // Load extensions
                                    await context.HandlingKernel.SendAsync(
                                        new LoadExtensionsInDirectory(
                                            resolvedReference.PackageRoot,
                                            addedAssemblyPaths));
                                }
                                break;

                            default:
                                break;
                            }
                        }
                        else
                        {
                            var errors = $"{string.Join(Environment.NewLine, result.Errors)}";

                            switch (result)
                            {
                            case PackageRestoreResult packageRestore:
                                foreach (var resolvedReference in packageRestore.ResolvedReferences)
                                {
                                    if (string.IsNullOrEmpty(resolvedReference.PackageName))
                                    {
                                        context.Publish(new ErrorProduced($"Failed to apply RestoreSources {resolvedReference.RestoreSources}{Environment.NewLine}{errors}"));
                                    }
                                    else
                                    {
                                        context.Publish(new ErrorProduced($"Failed to add reference to package {resolvedReference.PackageName}{Environment.NewLine}{errors}"));
                                    }
                                }
                                break;

                            default:
                                break;
                            }
                        }

                        // Events for finished
                        context.Complete();
                    };

                    await pipelineContext.HandlingKernel.SendAsync(nugetRestoreDirective);
                })
            };

            kernel.AddDirective(restore);

            return(kernel);