如何在MSBuild项目中使用特定版本的F#编译器?

Ara*_*ion 7 msbuild f# visual-studio

我有一些使用visual studio生成的F#项目文件.

在我的计算机上安装了几个F#版本,它似乎选择了最新版本.

但是,我想使用特定的F#编译器 - 使用版本3.1.2安装的编译器.

我该怎么办?

Ant*_*fer 5

我正在使用类似的设置,只是因为我正在使用其nuget包中的F#编译器- 这在共享构建环境中更好用.

你需要一个.props文件包含在你所有的F#项目中,我称之为fsharp_project.props.通过更改该props文件,您可以更新所有F#项目的编译器版本.其内容应如下:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PackageRoot>C:\packages\Fsharp.Compiler.Tools.Nuget</PackageRoot>
    <FscToolPath>$(PackageRoot)\tools</FscToolPath>
    <FSharpVersion>v3.0</FSharpVersion>
  </PropertyGroup>
  <ItemGroup>
  <Reference Include="FSharp.Core">
    <HintPath>$(PackageRoot)\tools\fsharp.core.dll</HintPath>
  </Reference>
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

您需要调整本地版本的F#编译器的路径,以及您希望使用的核心库的路径.

然后,修改您的.fsproj文件以使用该文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <Import Project="C:\whereever\fsharp_project.props"/>
...
Run Code Online (Sandbox Code Playgroud)

.fsproj文件的下方,您将看到参考文献FSharp.Core.dll.删除 - 在props文件中,已经有对编译器附带的核心库版本的引用.

重新加载项目并重新构建,它将打印出fsc.exe它正在使用的完整路径.

作为旁注:与.props文件相同的技巧对于引用FSharp.Core.dllF#代码的C#使用者的正确版本也非常有用- 这是运行时错误的常见原因.包含一个只引用FSharp.Core.dll每个文件的props文件,.csproj只需更新`.props'文件,就可以将所有C#项目切换到新版本的核心库.