【问题标题】:F# on Linux - targeting net4xxLinux 上的 F# - 以 net4xx 为目标
【发布时间】:2018-04-08 13:36:39
【问题描述】:

我的 Linux Mint (18.3) 机器上安装了 mono (5.10.1.20) 和 dotnet core (2.1.4)。

我想使用 VS Code Ionide 创建一个项目:Ctrl+Shift+P -> F#: New Project -> 控制台。这没有问题。但是,当我尝试构建它时,我得到:

错误 MSB3644:框架的参考程序集 未找到“.NETFramework,Version=v4.6.1”。为了解决这个问题, 为此框架版本安装 SDK 或 Targeting Pack,或 将您的应用程序重新定位到您所针对的框架版本 已安装 SDK 或 Targeting Pack。

我查看了我的 .fsproj 文件,确实 - 它说:

<TargetFramework>net461</TargetFramework>

但是,我在网上找到了一些文章,人们声称能够毫无问题地构建它(例如,此处找到的 Suave-Music-Store 教程:

https://legacy.gitbook.com/book/theimowski/suave-music-store/details)

我肯定在这里遗漏了一些东西。所以我的问题是:究竟是什么(以及如何使这项工作)?

PS:我可以通过将目标框架更改为“netcoreapp2.0”来解决这个问题,但我仍然很确定模板应该开箱即用。

【问题讨论】:

  • 您不必使用 ionide 模板来创建 F# 控制台项目。只需使用 .net core cli,然后使用 ionide 打开目录。 docs.microsoft.com/en-us/dotnet/fsharp/get-started/…
  • 是的,这是一个令人讨厌的问题,错误消息很差。你安装了referenceassemblies-pcl 包吗?
  • 是的 - 安装了它,不过版本有点旧:apt-cache policy referenceassemblies-pcl referenceassemblies-pcl: Installed: 2014.04.14-1xamarin4+ubuntu1604b1 Candidate: 2014.04.14-1xamarin4+ubuntu1604b1 我尝试将项目的目标框架更改为例如net45(2014 年存在的任何东西),但这也无济于事。

标签: linux f# mono visual-studio-code .net-core


【解决方案1】:

另一个答案是设置 FrameworkPathOverride MsBuild 参数。您需要的程序集已经包含在 Mono 中,您可以通过设置 FrameworkPathOverride 告诉编译器在哪里找到它们。您可以通过在此处包含netfx.props 文件轻松做到这一点:https://github.com/fsprojects/FSharp.TypeProviders.SDK/blob/master/netfx.props。您可以将其下载到您的存储库中,然后将以下行添加到您的所有项目文件中:

<Import Project="..\netfx.props" />

这是几个项目所做的。一旦 MSBuild 也更改为查看此处,或者发布了官方 nuget 包,我预计许多 FSharp 项目会切换到其中一种方法。

【讨论】:

  • 谢谢 - 实际上比我的解决方案更好,因为它在 VS Code 中启用了 IntelliSense。好东西!
  • 这个答案仍然是最新的吗?
【解决方案2】:

问题在于您没有 .NET Framework 参考程序集。编译器需要它们才能了解您的代码引用的 .NET Framework API。

好消息是您可以通过 nuget 获取这些参考程序集

坏消息是它尚未在 nuget.org 上发布,因此您需要将 myget 提要添加到您的项目中

要解决此问题,请将以下内容添加到您的 fsproj

<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
    <PackageReference 
          Include="Microsoft.TargetingPack.NETFramework.v4.6.1" 
          Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
</ItemGroup>

然后你需要在你的项目中添加一个Nuget.Config文件

<configuration>
 <packageSources>
    <add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
 </packageSources>
</configuration>

有了这些,你应该能够在 Linux 上构建 net461 exe 和 dll

【讨论】:

  • 谢谢 - 我稍后会试一试。我需要稍微修改一下这个解决方案,因为我使用 paket,所以没有 Nuget.Cofig。无论如何,我认为这并没有太大变化。
【解决方案3】:

谢谢大家的回复 - 让我发布一些我自己发现的东西。 我发现在我的 build.sh 脚本中添加以下行也可以解决问题: export FrameworkPathOverride=$(dirname $(which mono))/../lib/mono/4.5/ 我想这与切斯特所说的相似,但方式有所不同。

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2017-06-13
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多