【问题标题】:FSharp build fails in MSBuild, but works ok in Visual StudioFSharp 构建在 MSBuild 中失败,但在 Visual Studio 中工作正常
【发布时间】:2014-03-12 10:03:51
【问题描述】:

我的解决方案中有许多项目,其中还有一个 F# 项目。在 Visual Studio 中一切都构建得很好,但是当我尝试在我的 TeamCity 服务器(没有安装 VS)上使用 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 更改为 Version,并且必须将 Clean 目标添加到 FSharp 项目中。非常感谢你们!

标签: visual-studio build msbuild f# teamcity


【解决方案1】:

AutoFixture.AutoFoqZeroToNine 也有同样的问题。

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

首先,你必须添加

<TargetFSharpCoreVersion>4.3.0.0</TargetFSharpCoreVersion>

到第一个&lt;PropertyGroup&gt;

其次,你替换

<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">

如果您想在上下文中查看此内容,可以查看the ZeroToNine commit that does the above

【讨论】:

  • 如果你能看看这个stackoverflow.com/questions/22357735/…我肯定会拥有你几个冷的(类似的问题)
  • 抱歉,我看过了,但我之前没有看到过这个错误(而且它也没有响铃)。
  • 我遇到了不同的问题。如您所示,fsproj 文件已更新,但我在未安装 VS 的构建服务器上收到错误消息。我最终作弊并从另一台机器上复制了 FSharp 文件夹。
【解决方案2】:

您可以在项目中创建目标“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 的回答)。
  • 这里也对此问题进行了跟进:stackoverflow.com/questions/22357735/…。如果你想看看,我真的很感激:)
【解决方案3】:

我今天在构建服务器上遇到了相同症状的问题。为我解决的问题是在构建服务器上启动 VS 并创建一个 F# 项目,该项目安装了 F# 工具。默认情况下它没有完全安装。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2015-10-04
    • 2011-01-13
    • 2016-04-01
    • 1970-01-01
    • 2014-04-16
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多