Я изучаю 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 для его автозаполнения и работы с файлами?