我正在学习F#,以前从未使用过任何DotNet和Mono。我喜欢这种语言,但是在使用各种运行时版本以及如何告诉各种工具要使用哪个版本方面却遇到了困难。
摘要:看来Ubuntu上的DLL Hell是一个问题。我该如何告诉FSAC针对最新的运行时版本Microsoft.NETCore.App 2.1.5运行其自动完成魔术,而不是决定使用哪个更老的版本?
冗长的解释。
我的平台是Ubuntu 18.04 amd64。我已经安装了最新的DotNet Core,特别是软件包dotnet-sdk-2.1
(版本2.1.403-1
)及其依赖项dotnet-host
,dotnet-runtime-2.1
等(均为版本{{1} }。我还安装了Mono,因为许多工具显然都依赖它。
当我尝试使用最近添加到DotNet Core中的某些功能时,感觉就像我在发现潘多拉魔盒一样。
以这个示例为例,该示例使用新的2.1.5-1
:
ProcessStartInfo.ArgumentList
如果我天真地尝试使用#r "System.Diagnostics.Process.dll"
open System.Diagnostics
let execute exe args =
let proc = new Process()
proc.StartInfo.FileName <- exe
for arg in args do proc.StartInfo.ArgumentList.Add arg
proc.Start() |> ignore
proc.WaitForExit()
execute "echo" ["foo"; "baz"]
(该执行程序的/usr/bin/fsharpi
)运行它,则会收到“未定义ArgumentList”的错误。我猜很公平吗?
如果我使用/usr/bin/mono /usr/lib/mono/fsharp/fsi.exe
运行它,它可以正常工作!,我花了很长时间才弄清楚我什至可以做到,但最后我走在了正确的道路上。 / p>
但是,如果我在任何IDE中加载文件,例如带有Ionide插件的VSCode或带有FSharp插件的Sublime Text,它们仍将/usr/bin/dotnet /usr/share/dotnet/sdk/2.1.403/FSharp/fsi.exe
标记为无效。 Sublime的插件还将ArgumentList
行标记为无效,但没有告诉我原因。
关注Sublime的插件并深入研究代码,看来它依赖于名为FsAutoComplete aka. fsac的工具和基于Linux explicitly invokes it with mono的工具。
我尝试使用DotNet Core运行FSAC工具,但无法找到某些库或其他库:
#r
如果我采用文件系统方法并搜索$ cd .config/sublime-text-3/Packages/FSharp/fsac/fsac/
$ dotnet fsautocomplete.exe
A fatal error was encountered. The library 'libhostpolicy.so' required to execute the application was not found in '/home/tobia/.config/sublime-text-3/Packages/FSharp/fsac/fsac/'.
Failed to run as a self-contained app. If this should be a framework-dependent app, add the /home/tobia/.config/sublime-text-3/Packages/FSharp/fsac/fsac/fsautocomplete.runtimeconfig.json file specifying the appropriate framework.
,则会对结果感到困惑:
System.Diagnostics.Process.dll
在我的主目录中的/usr/lib/mono/4.5/Facades/System.Diagnostics.Process.dll
/usr/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll
/usr/lib/mono/xbuild/Microsoft/Microsoft.NET.Build.Extensions/net461/lib/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/2.1.403/Microsoft/Microsoft.NET.Build.Extensions/net461/lib/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/microsoft.netcore.app/2.1.0/ref/netcoreapp2.1/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/lib/net46/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/lib/net461/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/ref/net46/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/ref/net461/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/ref/netstandard1.3/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/ref/netstandard1.4/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/runtimes/win/lib/net46/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/runtimes/win/lib/net461/System.Diagnostics.Process.dll
/usr/share/dotnet/sdk/NuGetFallbackFolder/system.diagnostics.process/4.3.0/runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll
/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Diagnostics.Process.dll
下再添加十二打。太疯狂了。
首先,整个~/.nuget
子树似乎不归任何Deb软件包所有,令人担忧。其他属于这些软件包:
/usr/share/dotnet/sdk/NuGetFallbackFolder
运行一个简单的Grep显示,只有最后一个标有 mono-devel: /usr/lib/mono/4.5/Facades/System.Diagnostics.Process.dll
mono-devel: /usr/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll
msbuild: /usr/lib/mono/xbuild/Microsoft/Microsoft.NET.Build.Extensions/net461/lib/System.Diagnostics.Process.dll
dotnet-sdk-2.1: /usr/share/dotnet/sdk/2.1.403/Microsoft/Microsoft.NET.Build.Extensions/net461/lib/System.Diagnostics.Process.dll
(*) dotnet-runtime-2.1: /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Diagnostics.Process.dll
的人知道关于(*)
的信息。
因此,所有其他所有库都是较旧的/旧版,其中包括ArgumentList
本身的库。
我只能假定该SDK。编译器和解释器是针对运行时/系统库的旧版本而不是其针对其构建代码的版本。至少可以说,这是一个有趣的选择。
采用一种处理方法,dotnet-sdk-2.1
告诉我FSAC进程仅从lsof
内部及其本地目录打开了DLL文件。这是没有希望的。
是否有一种方法可以告诉FSAC使用Microsoft.NETCore.App 2.1.5运行时/系统库进行自动完成和整理工作?