Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor PackageManagement out of Kernel packages #3206

Merged
merged 7 commits into from
Sep 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,27 +1,18 @@
Microsoft.DotNet.Interactive
public abstract class ISupportNuget
public System.Collections.Generic.IEnumerable<PackageReference> RequestedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<ResolvedPackageReference> ResolvedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<System.String> RestoreSources { get;}
public System.Void Configure(System.Boolean useResultsCache)
public PackageReference GetOrAddPackageReference(System.String packageName, System.String packageVersion = null)
public System.Void RegisterResolvedPackageReferences(System.Collections.Generic.IReadOnlyList<ResolvedPackageReference> packageReferences)
public System.Threading.Tasks.Task<PackageRestoreResult> RestoreAsync()
public System.Void TryAddRestoreSource(System.String source)
public static class KernelSupportsNugetExtensions
public static T UseNugetDirective<T>(System.Boolean useResultsCache = True)
Microsoft.DotNet.Interactive.PackageManagement
public static class KernelExtensions
public static T UseNugetDirective<T>(Func<T,System.Collections.Generic.IReadOnlyList<Microsoft.DotNet.Interactive.ResolvedPackageReference>,System.Threading.Tasks.Task> onResolvePackageReferences, System.Boolean forceRestore = False)
public class PackageRestoreContext, System.IDisposable
.ctor(System.Boolean useResultsCache = True)
public System.Collections.Generic.IEnumerable<PackageReference> RequestedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<ResolvedPackageReference> ResolvedPackageReferences { get;}
.ctor(System.Boolean forceRestore = False)
public System.Collections.Generic.IEnumerable<Microsoft.DotNet.Interactive.PackageReference> RequestedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<Microsoft.DotNet.Interactive.ResolvedPackageReference> ResolvedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<System.String> RestoreSources { get;}
public System.Void Dispose()
public PackageReference GetOrAddPackageReference(System.String packageName, System.String packageVersion = null)
public ResolvedPackageReference GetResolvedPackageReference(System.String packageName)
public Microsoft.DotNet.Interactive.PackageReference GetOrAddPackageReference(System.String packageName, System.String packageVersion = null)
public Microsoft.DotNet.Interactive.ResolvedPackageReference GetResolvedPackageReference(System.String packageName)
public System.Threading.Tasks.Task<PackageRestoreResult> RestoreAsync()
public System.Void TryAddRestoreSource(System.String source)
public class PackageRestoreResult
.ctor(System.Boolean succeeded, System.Collections.Generic.IEnumerable<PackageReference> requestedPackages, System.Collections.Generic.IReadOnlyList<ResolvedPackageReference> resolvedReferences = null, System.Collections.Generic.IReadOnlyCollection<System.String> errors = null)
.ctor(System.Boolean succeeded, System.Collections.Generic.IEnumerable<Microsoft.DotNet.Interactive.PackageReference> requestedPackages, System.Collections.Generic.IReadOnlyList<Microsoft.DotNet.Interactive.ResolvedPackageReference> resolvedReferences = null, System.Collections.Generic.IReadOnlyCollection<System.String> errors = null)
public System.Collections.Generic.IReadOnlyCollection<System.String> Errors { get;}
public System.Collections.Generic.IReadOnlyList<ResolvedPackageReference> ResolvedReferences { get;}
public System.Collections.Generic.IReadOnlyList<Microsoft.DotNet.Interactive.ResolvedPackageReference> ResolvedReferences { get;}
public System.Boolean Succeeded { get;}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Microsoft.DotNet.Interactive.Jupyter;
using Microsoft.DotNet.Interactive.Kql;
using Microsoft.DotNet.Interactive.Mermaid;
using Microsoft.DotNet.Interactive.PackageManagement;
using Microsoft.DotNet.Interactive.PowerShell;
using Microsoft.DotNet.Interactive.SQLite;
using Microsoft.DotNet.Interactive.SqlServer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
Microsoft.DotNet.Interactive.CSharp
public class CSharpKernel : Microsoft.DotNet.Interactive.Kernel, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.ChangeWorkingDirectory>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestCompletions>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestDiagnostics>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestHoverText>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestKernelInfo>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestSignatureHelp>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestValue>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestValueInfos>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.SendValue>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.SubmitCode>, Microsoft.DotNet.Interactive.ISupportNuget, System.IDisposable
public class CSharpKernel : Microsoft.DotNet.Interactive.Kernel, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.ChangeWorkingDirectory>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestCompletions>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestDiagnostics>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestHoverText>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestKernelInfo>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestSignatureHelp>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestValue>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.RequestValueInfos>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.SendValue>, Microsoft.DotNet.Interactive.IKernelCommandHandler<Microsoft.DotNet.Interactive.Commands.SubmitCode>, System.IDisposable
.ctor()
.ctor(System.String name)
public Microsoft.DotNet.Interactive.PackageRestoreContext PackageRestoreContext { get;}
public System.Collections.Generic.IEnumerable<Microsoft.DotNet.Interactive.PackageReference> RequestedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<Microsoft.DotNet.Interactive.ResolvedPackageReference> ResolvedPackageReferences { get;}
public System.Collections.Generic.IEnumerable<System.String> RestoreSources { get;}
public Microsoft.CodeAnalysis.Scripting.ScriptState ScriptState { get;}
public System.Void AddAssemblyReferences(System.Collections.Generic.IEnumerable<System.String> assemblyPaths)
public System.Threading.Tasks.Task SetValueAsync(System.String name, System.Object value, System.Type declaredType)
public System.Boolean TryGetValue<T>(System.String name, ref T& value)
public static class CSharpKernelExtensions
Expand Down
54 changes: 4 additions & 50 deletions src/Microsoft.DotNet.Interactive.CSharp/CSharpKernel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ namespace Microsoft.DotNet.Interactive.CSharp;

public class CSharpKernel :
Kernel,
ISupportNuget,
IKernelCommandHandler<RequestCompletions>,
IKernelCommandHandler<RequestDiagnostics>,
IKernelCommandHandler<RequestHoverText>,
Expand All @@ -49,7 +48,6 @@ public class CSharpKernel :

private InteractiveWorkspace _workspace;

private Lazy<PackageRestoreContext> _lazyPackageRestoreContext;

private ScriptOptions _scriptOptions;

Expand Down Expand Up @@ -85,22 +83,11 @@ public CSharpKernel(string name) : base(name)
typeof(Kernel).Assembly,
typeof(CSharpKernel).Assembly,
typeof(PocketView).Assembly);

_lazyPackageRestoreContext = new Lazy<PackageRestoreContext>(() =>
{
var packageRestoreContext = new PackageRestoreContext();

RegisterForDisposal(packageRestoreContext);

return packageRestoreContext;
});


RegisterForDisposal(() =>
{
_workspace.Dispose();
_workspace = null;

_lazyPackageRestoreContext = null;
ScriptState = null;
_scriptOptions = null;
});
Expand All @@ -114,18 +101,6 @@ private Task<bool> IsCompleteSubmissionAsync(string code)
return Task.FromResult(SyntaxFactory.IsCompleteSubmission(syntaxTree));
}

void ISupportNuget.Configure(bool useResultsCache)
{
_lazyPackageRestoreContext = new Lazy<PackageRestoreContext>(() =>
{
var packageRestoreContext = new PackageRestoreContext(useResultsCache);

RegisterForDisposal(packageRestoreContext);

return packageRestoreContext;
});
}

Task IKernelCommandHandler<RequestValueInfos>.HandleAsync(RequestValueInfos command, KernelInvocationContext context)
{
var valueInfos =
Expand Down Expand Up @@ -499,23 +474,13 @@ async Task IKernelCommandHandler<RequestDiagnostics>.HandleAsync(
}
}

public PackageRestoreContext PackageRestoreContext => _lazyPackageRestoreContext.Value;

private bool HasReturnValue =>
ScriptState is not null &&
(bool)_hasReturnValueMethod.Invoke(ScriptState.Script, null);

void ISupportNuget.TryAddRestoreSource(string source) => _lazyPackageRestoreContext.Value.TryAddRestoreSource(source);

PackageReference ISupportNuget.GetOrAddPackageReference(string packageName, string packageVersion) =>
_lazyPackageRestoreContext.Value.GetOrAddPackageReference(
packageName,
packageVersion);

void ISupportNuget.RegisterResolvedPackageReferences(IReadOnlyList<ResolvedPackageReference> resolvedReferences)

public void AddAssemblyReferences(IEnumerable<string> assemblyPaths)
{
var references = resolvedReferences
.SelectMany(r => r.AssemblyPaths)
var references = assemblyPaths
.Select(r => CachingMetadataResolver.ResolveReferenceWithXmlDocumentationProvider(r))
.ToArray();

Expand All @@ -526,15 +491,4 @@ void ISupportNuget.RegisterResolvedPackageReferences(IReadOnlyList<ResolvedPacka

_scriptOptions = _scriptOptions.AddReferences(references);
}

Task<PackageRestoreResult> ISupportNuget.RestoreAsync() => _lazyPackageRestoreContext.Value.RestoreAsync();

public IEnumerable<PackageReference> RequestedPackageReferences =>
PackageRestoreContext.RequestedPackageReferences;

public IEnumerable<ResolvedPackageReference> ResolvedPackageReferences =>
PackageRestoreContext.ResolvedPackageReferences;

public IEnumerable<string> RestoreSources =>
PackageRestoreContext.RestoreSources;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

<ItemGroup>
<ProjectReference Include="..\Microsoft.DotNet.Interactive.Formatting\Microsoft.DotNet.Interactive.Formatting.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.PackageManagement\Microsoft.DotNet.Interactive.PackageManagement.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive\Microsoft.DotNet.Interactive.csproj" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.Data.Analysis;
using Microsoft.DotNet.Interactive.App;
using Microsoft.DotNet.Interactive.Commands;
using Microsoft.DotNet.Interactive.CSharp;
using Microsoft.DotNet.Interactive.Events;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\dotnet-interactive\dotnet-interactive.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.ExtensionLab\Microsoft.DotNet.Interactive.ExtensionLab.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.CSharp\Microsoft.DotNet.Interactive.CSharp.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.FSharp\Microsoft.DotNet.Interactive.FSharp.fsproj" />
Expand Down
78 changes: 21 additions & 57 deletions src/Microsoft.DotNet.Interactive.FSharp/FSharpKernel.fs
Original file line number Diff line number Diff line change
Expand Up @@ -394,13 +394,6 @@ type FSharpKernel () as this =
context.Fail(requestValue, message=(sprintf "Value '%s' not found in kernel %s" requestValue.Name this.Name))
}

let createPackageRestoreContext (useResultsCache:bool) (registerForDisposal) =
let packageRestoreContext = new PackageRestoreContext(useResultsCache)
do registerForDisposal(fun () -> packageRestoreContext.Dispose())
packageRestoreContext

let mutable _packageRestoreContext = lazy createPackageRestoreContext true this.RegisterForDisposal

member this.GetValues() =
script.Value.Fsi.GetBoundValues()
|> List.filter (fun x -> x.Name <> "it") // don't report special variable `it`
Expand All @@ -421,13 +414,27 @@ type FSharpKernel () as this =
| _ ->
false

member _.RestoreSources with get () = _packageRestoreContext.Value.RestoreSources

member _.RequestedPackageReferences with get () = _packageRestoreContext.Value.RequestedPackageReferences;

member _.ResolvedPackageReferences with get () = _packageRestoreContext.Value.ResolvedPackageReferences;

member _.PackageRestoreContext with get () = _packageRestoreContext.Value
member this.AddAssemblyReferencesAndPackageRoots(assemblyReferences: IEnumerable<string>, packageRoots: IEnumerable<string>) =
let sb = StringBuilder()
let hashset = HashSet()

for packageRoot in packageRoots do
match packageRoot with
| null -> ()
| root ->
if hashset.Add(root) then
if File.Exists root then
sb.AppendFormat("#I @\"{0}\"", root) |> ignore
sb.Append(Environment.NewLine) |> ignore

for assemblyReference in assemblyReferences do
if hashset.Add(assemblyReference) then
if File.Exists assemblyReference then
sb.AppendFormat("#r @\"{0}\"", assemblyReference) |> ignore
sb.Append(Environment.NewLine) |> ignore

let command = new SubmitCode(sb.ToString(), "fsharp")
this.DeferCommand(command)

interface IKernelCommandHandler<RequestCompletions> with
member this.HandleAsync(command: RequestCompletions, context: KernelInvocationContext) = handleRequestCompletions command context
Expand Down Expand Up @@ -457,46 +464,3 @@ type FSharpKernel () as this =
interface IKernelCommandHandler<ChangeWorkingDirectory> with
member this.HandleAsync(command: ChangeWorkingDirectory, context: KernelInvocationContext) = handleChangeWorkingDirectory command context

interface ISupportNuget with
member _.TryAddRestoreSource(source: string) =
this.PackageRestoreContext.TryAddRestoreSource source

member _.GetOrAddPackageReference(packageName: string, packageVersion: string) =
this.PackageRestoreContext.GetOrAddPackageReference (packageName, packageVersion)

member _.Configure(useResultsCache:bool) =
_packageRestoreContext <- lazy createPackageRestoreContext useResultsCache this.RegisterForDisposal

member _.RestoreAsync() =
this.PackageRestoreContext.RestoreAsync()

member _.RestoreSources =
this.PackageRestoreContext.RestoreSources

member _.RequestedPackageReferences =
this.PackageRestoreContext.RequestedPackageReferences

member _.ResolvedPackageReferences =
this.PackageRestoreContext.ResolvedPackageReferences

member _.RegisterResolvedPackageReferences (packageReferences: IReadOnlyList<ResolvedPackageReference>) =
// Generate #r and #I from packageReferences
let sb = StringBuilder()
let hashset = HashSet()

for reference in packageReferences do
for assembly in reference.AssemblyPaths do
if hashset.Add(assembly) then
if File.Exists assembly then
sb.AppendFormat("#r @\"{0}\"", assembly) |> ignore
sb.Append(Environment.NewLine) |> ignore

match reference.PackageRoot with
| null -> ()
| root ->
if hashset.Add(root) then
if File.Exists root then
sb.AppendFormat("#I @\"{0}\"", root) |> ignore
sb.Append(Environment.NewLine) |> ignore
let command = new SubmitCode(sb.ToString(), "fsharp")
this.DeferCommand(command)
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@

<ItemGroup>
<ProjectReference Include="..\Microsoft.DotNet.Interactive.Formatting\Microsoft.DotNet.Interactive.Formatting.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.PackageManagement\Microsoft.DotNet.Interactive.PackageManagement.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive\Microsoft.DotNet.Interactive.csproj" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Microsoft.DotNet.Interactive.App;
using Microsoft.DotNet.Interactive.Tests.Utility;

namespace Microsoft.DotNet.Interactive.Journey.Tests.Utilities;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Threading.Tasks;
using Microsoft.DotNet.Interactive.App;
using Microsoft.DotNet.Interactive.Commands;
using Microsoft.DotNet.Interactive.CSharp;
using Microsoft.DotNet.Interactive.FSharp;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using System.Threading.Tasks;

using FluentAssertions;

using Microsoft.DotNet.Interactive.App;
using Microsoft.DotNet.Interactive.Commands;
using Microsoft.DotNet.Interactive.CSharp;
using Microsoft.DotNet.Interactive.Events;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\dotnet-interactive\dotnet-interactive.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.ExtensionLab\Microsoft.DotNet.Interactive.ExtensionLab.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.CSharp\Microsoft.DotNet.Interactive.CSharp.csproj" />
<ProjectReference Include="..\Microsoft.DotNet.Interactive.FSharp\Microsoft.DotNet.Interactive.FSharp.fsproj" />
Expand Down

This file was deleted.

Loading