FSharp在MSBuild中构建失败,但在Visual Studio中正常工作

8

我在我的解决方案中有许多项目,其中包括一个F#项目。在Visual Studio中一切都能正常构建,但是当我尝试在没有安装VS的TeamCity服务器上使用MSBuild构建时,它会抛出以下构建错误:

C:\TeamCity\buildAgent\work\42c74d8b9d19a844\FSharpEngine\MY_FSHARP_PROJECT.fsproj : error MSB4057: The target "Clean" does not exist in the project.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\Folder0\MY_FSHARP_PROJECT.fsproj" (Clean target(s)) -- FAILED.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\Folder1\REFERENCING_FSHARP_PROJECT.csproj" (Clean target(s)) -- FAILED.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\Folder2\UPPER_REFERENCING_FSHARP_PROJECT.csproj" (Rebuild target(s)) -- FAILED.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\Folder4\UPPER_UPPER_REFERENCING_FSHARP_PROJECT.csproj.metaproj" (Rebuild target(s)) -- FAILED.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\MY_SOLUTION.sln" (Rebuild target(s)) -- FAILED.
[16:27:58]Done Building Project "C:\TeamCity\buildAgent\work\42c74d8b9d19a844\MY_SOLUTION.sln.teamcity" (TeamCity_Generated_Build target(s)) -- FAILED.

我已经在我的TeamCity服务器上安装了MSBuild工具和F#框架,但我仍然不知道为什么会出现这个错误。

有人遇到过这个错误吗?可以给我一些提示如何解决吗?(我已经浪费了一天时间,但仍然没有运气)。


实际上,下面两个答案都有所帮助:因为我不得不将FSharpVersion从4.3.0.0更改为版本,并且我不得不向FSharp项目添加Clean目标。非常感谢你们两个! - Tamas Ionut
3个回答

12

我们在使用 AutoFixture.AutoFoqZeroToNine 时遇到了同样的问题。

我们所做的是修改 .fsproj 文件。

首先,您需要添加

<TargetFSharpCoreVersion>4.3.0.0</TargetFSharpCoreVersion>

到第一个<PropertyGroup>

其次,你替换

<Import Project="$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets" Condition=" Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')" />

使用这个:

<Choose>
  <When Condition="'$(VisualStudioVersion)' == '11.0'">
    <PropertyGroup>
      <FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath>
    </PropertyGroup>
  </When>
  <Otherwise>
    <PropertyGroup>
      <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
    </PropertyGroup>
  </Otherwise>
</Choose>
<Import Project="$(FSharpTargetsPath)" Condition="Exists('$(FSharpTargetsPath)')" />

最后,替换

<Reference Include="FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

<Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

如果你想要在上下文中查看此内容,可以查看执行以上操作的 ZeroToNine 提交


如果您能查看这个链接 https://dev59.com/D33aa4cB1Zd3GeqPeYZG 我一定会请您喝几杯冷饮(类似的问题)。 - Tamas Ionut
抱歉,我查了一下,但是我之前没有见过这个错误(而且也不太熟悉)。 - Mark Seemann
我遇到了不同的问题。fsproj文件已经更新,但是在我的构建服务器上出现了错误,因为没有安装VS。最终我采取了欺骗性的做法,从另一台机器上复制了FSharp文件夹。 - Benjol

3
您可以在项目中创建目标“Clean”:
<Target Name="Clean">
    <MSBuild
    Targets="Clean"
    Projects=".\MySolutionDir\MySol.sln"
    Properties="Configuration=$(Configuration)"  />
</Target>

您可以将命令行修改为以下内容:
MSBuild MyProj.proj /p:Configuration=Release;Targets=Clean

这确实是必要的,但是 FSharp.Core 也存在一些问题(请参见 @Mark 的答案)。 - Tamas Ionut
还在这个问题上做了后续:https://dev59.com/D33aa4cB1Zd3GeqPeYZG。如果你想看看,我会非常感激:) - Tamas Ionut

0

今天我在构建服务器上遇到了一个与之前相同的问题。对我有用的解决方法是在构建服务器上启动VS并创建一个F#项目,这将安装F#工具。默认情况下它没有完全安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接