Skip to content

Commit 0f5194a

Browse files
committed
#r "paket: "
1 parent bac94be commit 0f5194a

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

src/fsharp/fsi/fsi.fs

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,6 +1789,8 @@ type internal FsiInteractionProcessor
17891789
initialInteractiveState) =
17901790

17911791
let mutable currState = initialInteractiveState
1792+
let mutable createdPaketFile = false
1793+
let mutable needsPaketInstall = false
17921794
let event = Control.Event<unit>()
17931795
let setCurrState s = currState <- s; event.Trigger()
17941796
let runCodeOnEventLoop errorLogger f istate =
@@ -1859,20 +1861,58 @@ type internal FsiInteractionProcessor
18591861
stopProcessingRecovery e range0
18601862
None
18611863

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+
18621885
/// Execute a single parsed interaction. Called on the GUI/execute/main thread.
18631886
let ExecInteraction (ctok, tcConfig:TcConfig, istate, action:ParsedFsiInteraction, errorLogger: ErrorLogger) =
18641887
istate |> InteractiveCatch errorLogger (fun istate ->
18651888
match action with
18661889
| IDefns ([ ],_) ->
18671890
istate,Completed None
1868-
| IDefns ([ SynModuleDecl.DoExpr(_,expr,_)],_) ->
1891+
| IDefns ([ SynModuleDecl.DoExpr(_,expr,_)],m) ->
1892+
let istate = resolvePaket ctok istate errorLogger m
18691893
fsiDynamicCompiler.EvalParsedExpression(ctok, errorLogger, istate, expr)
1870-
| IDefns (defs,_) ->
1894+
| IDefns (defs,m) ->
1895+
let istate = resolvePaket ctok istate errorLogger m
18711896
fsiDynamicCompiler.EvalParsedDefinitions (ctok, errorLogger, istate, true, false, defs),Completed None
18721897

18731898
| IHash (ParsedHashDirective("load",sourceFiles,m),_) ->
18741899
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
18761916
| IHash (ParsedHashDirective(("reference" | "r"),[path],m),_) ->
18771917
let resolutions,istate = fsiDynamicCompiler.EvalRequireReference(ctok, istate, m, path)
18781918
resolutions |> List.iter (fun ar ->

0 commit comments

Comments
 (0)