代码之家  ›  专栏  ›  技术社区  ›  Tobia

如何在Ubuntu上配置FSAC或DLL Hell使用的dotnetsdk

  •  1
  • Tobia  · 技术社区  · 7 年前

    我在学习F#,以前从未使用过任何网络或单声道。我喜欢这门语言,但是我很难掌握无数的运行时版本,以及如何告诉各种工具使用哪个版本。

    总结: 似乎Ubuntu上的DLL地狱是个东西。我怎么知道 FSAC 对最新的运行时版本运行其自动完成的魔术,即Microsoft.NETCore.App应用程序2.1.5,而不是它决定使用的任何旧的化身?


    冗长的解释。

    我的平台是ubuntu18.04amd64。我已经安装了最新的DotNet核心,特别是软件包 dotnet-sdk-2.1 2.1.403-1 )及其依赖关系 dotnet-host dotnet-runtime-2.1 等(都是版本 2.1.5-1 ). 我还安装了Mono,因为许多工具显然依赖它。

    当我尝试使用最近添加到dotnetcore的一些特性时,感觉就像在揭开潘多拉魔盒。

    以这个例子为例,它使用新的 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 (哪个执行官 /usr/bin/mono /usr/lib/mono/fsharp/fsi.exe )我得到一个“ArgumentList is not defined”错误。够公平吧?

    如果我和你一起跑的话 /usr/bin/dotnet /usr/share/dotnet/sdk/2.1.403/FSharp/fsi.exe 我花了很长时间才发现我甚至可以做到,但我终于走上了正确的道路。

    ArgumentList 无效。Sublime的插件还标记 #r

    专注于Sublime的插件并深入挖掘代码,它似乎依赖于一个名为 FsAutoComplete aka. fsac 在Linux上 explicitly invokes it with mono .

    我尝试用DotNet Core运行FSAC工具,但找不到任何库或其他库:

    $ 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 . 太疯狂了。

    首先,整个 /usr/share/dotnet/sdk/NuGetFallbackFolder 子树 似乎不属于任何Deb软件包,

        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
    

    (*) 知道什么吗 论据列表

    所以其他所有的库都是旧的/遗留的版本, 包括那个 它自己。


    采取过程方法, lsof /usr/lib/mono 从它自己的本地目录。这是不可能的。

    有没有办法告诉FSAC使用Microsoft.NETCore.App应用程序2.1.5运行时/系统库的自动完成和linting工作?

    0 回复  |  直到 7 年前