Как настроить DotNet SDK, используемый FSAC –или– DLL Hell в Ubuntu - PullRequest
0 голосов
/ 10 октября 2018

Я изучаю F #, никогда раньше не использовал ни DotNet, ни Mono.Мне нравится язык, но мне тяжело с бесчисленными версиями среды выполнения и с тем, как сказать различным инструментам, какую версию использовать.

Резюме: Похоже, DLL Hell в Ubuntuэто вещь.Как я могу сказать FSAC запустить магию автозаполнения против последней версии времени выполнения, а именно Microsoft.NETCore.App 2.1.5, вместо того, чтобы использовать более старое воплощение?


Длинное объяснение.

Моя платформа - Ubuntu 18.04 amd64.Я установил последнее ядро ​​DotNet, в частности пакеты dotnet-sdk-2.1 (версия 2.1.403-1) и его зависимости dotnet-host, dotnet-runtime-2.1 и т. Д. (Все версии 2.1.5-1).У меня также установлен Mono, потому что многие инструменты, очевидно, полагаются на него.

Когда я пытаюсь использовать некоторые функции, недавно добавленные в DotNet Core, мне кажется, что я открываю ящик Pandora.

Возьмите этот пример, который использует новый 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 (который exec /usr/bin/mono /usr/lib/mono/fsharp/fsi.exe), я получаю «ArgumentList не определен»ошибка.Честно, я полагаю?

Если я запускаю его с /usr/bin/dotnet /usr/share/dotnet/sdk/2.1.403/FSharp/fsi.exe , это работает! Мне потребовалось много времени, чтобы понять, что я могу это сделать, но, наконец, яна правильном пути.

Но если я загружаю файл в любую IDE, такую ​​как VSCode с плагином Ionide или Sublime Text с плагином FSharp, они по-прежнему отмечают ArgumentList как недействительные.Плагин Sublime также помечает строку #r как недействительную, но не говорит мне, почему.

Сосредоточив внимание на плагине Sublime и копаясь в коде, кажется, что он опирается на инструмент под названием FsAutoComplete aka,fsac и в Linux явно вызывают его с помощью mono .

Я попытался запустить инструмент FSAC с DotNet Core, но ему не удалось найти какую-либо библиотеку или другую:

$ 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

Запуск простого Grep показывает, что только последний, помеченный (*), знает что-либо о ArgumentList.

Так что все этидругие библиотеки являются более старыми / устаревшими версиями, , в том числе и в самой dotnet-sdk-2.1.

Я могу только предположить, что SDK, иначе.компиляторы и интерпретаторы создаются на основе более старой версии библиотек времени выполнения / системы, чем та, с которой они создают код.Это интересный выбор, если не сказать больше.


Используя процессный подход, lsof говорит мне, что процесс FSAC открыл только файлы DLL изнутри /usr/lib/mono и из своего локального каталога.,Это не многообещающе.

Есть ли способ указать FSAC использовать библиотеки времени выполнения / system Microsoft / .NETCore.App 2.1.5 для его автозаполнения и работы с файлами?

...