@@ -1789,6 +1789,8 @@ type internal FsiInteractionProcessor
1789
1789
initialInteractiveState) =
1790
1790
1791
1791
let mutable currState = initialInteractiveState
1792
+ let mutable createdPaketFile = false
1793
+ let mutable needsPaketInstall = false
1792
1794
let event = Control.Event< unit>()
1793
1795
let setCurrState s = currState <- s; event.Trigger()
1794
1796
let runCodeOnEventLoop errorLogger f istate =
@@ -1859,20 +1861,58 @@ type internal FsiInteractionProcessor
1859
1861
stopProcessingRecovery e range0
1860
1862
None
1861
1863
1864
+ let tempDir = @" D:\temp\fsi"
1865
+ let paketPrefix = " paket: "
1866
+
1867
+ let resolvePaket ctok istate errorLogger m =
1868
+ if not needsPaketInstall then istate else
1869
+ let paketExePath = @" D:\temp\fsi\.paket\paket.exe"
1870
+
1871
+ let startInfo = ProcessStartInfo()
1872
+ startInfo.FileName <- paketExePath
1873
+ startInfo.WorkingDirectory <- tempDir
1874
+ startInfo.Arguments <- " install"
1875
+ startInfo.UseShellExecute <- false
1876
+ let p = Process.Start( startInfo)
1877
+ p.WaitForExit()
1878
+ if p.ExitCode <> 0 then
1879
+ failwithf " Paket restore failed."
1880
+
1881
+ let loadScript = Path.Combine( tempDir, " .paket" , " load" , " main.group.fsx" )
1882
+ needsPaketInstall <- false
1883
+ fsiDynamicCompiler.EvalSourceFiles ( ctok, istate, m, [ loadScript], lexResourceManager, errorLogger)
1884
+
1862
1885
/// Execute a single parsed interaction. Called on the GUI/execute/main thread.
1863
1886
let ExecInteraction ( ctok , tcConfig : TcConfig , istate , action : ParsedFsiInteraction , errorLogger : ErrorLogger ) =
1864
1887
istate |> InteractiveCatch errorLogger ( fun istate ->
1865
1888
match action with
1866
1889
| IDefns ([ ],_) ->
1867
1890
istate, Completed None
1868
- | IDefns ([ SynModuleDecl.DoExpr(_, expr,_)],_) ->
1891
+ | IDefns ([ SynModuleDecl.DoExpr(_, expr,_)], m) ->
1892
+ let istate = resolvePaket ctok istate errorLogger m
1869
1893
fsiDynamicCompiler.EvalParsedExpression( ctok, errorLogger, istate, expr)
1870
- | IDefns ( defs,_) ->
1894
+ | IDefns ( defs, m) ->
1895
+ let istate = resolvePaket ctok istate errorLogger m
1871
1896
fsiDynamicCompiler.EvalParsedDefinitions ( ctok, errorLogger, istate, true , false , defs), Completed None
1872
1897
1873
1898
| IHash ( ParsedHashDirective( " load" , sourceFiles, m),_) ->
1874
1899
fsiDynamicCompiler.EvalSourceFiles ( ctok, istate, m, sourceFiles, lexResourceManager, errorLogger), Completed None
1875
-
1900
+ | IHash ( ParsedHashDirective(( " reference" | " r" ),[ path],_),_) when path.StartsWith paketPrefix ->
1901
+ let package = path.Substring( paketPrefix.Length)
1902
+ let paketDepsFile = FileInfo( Path.Combine( tempDir, " paket.dependencies" ))
1903
+ let s =
1904
+ if not createdPaketFile then
1905
+ Directory.CreateDirectory( paketDepsFile.Directory.FullName) |> ignore
1906
+ " generate_load_scripts: true" + Environment.NewLine +
1907
+ " source https://nuget.org/api/v2" + Environment.NewLine +
1908
+ package + Environment.NewLine
1909
+ else
1910
+ let s = File.ReadAllText paketDepsFile.FullName
1911
+ s + package + Environment.NewLine
1912
+ File.WriteAllText( paketDepsFile.FullName, s)
1913
+ createdPaketFile <- true
1914
+ needsPaketInstall <- true
1915
+ istate, Completed None
1876
1916
| IHash ( ParsedHashDirective(( " reference" | " r" ),[ path], m),_) ->
1877
1917
let resolutions , istate = fsiDynamicCompiler.EvalRequireReference( ctok, istate, m, path)
1878
1918
resolutions |> List.iter ( fun ar ->
0 commit comments