NuGet/包恢复与F#不兼容

3
我们有一个包含F#和C#项目的解决方案。两个项目都使用相同的NuGet包,使用NuGet包恢复自动下载。令人沮丧的是,我们经常遇到F#项目无法构建的问题,迫使我们卸载然后重新安装所有包。似乎在安装过程中NuGet没有正确地编辑fsproj文件,从而给我们留下重复的引用或者版本不匹配的引用,阻止了构建。是否有人遇到类似的问题/是否知道解决方案?
2个回答

5

你是否遇到了这个bug?F#项目 VS 2012:更新包删除了HintPath

NuGet中还有一些已知的问题会影响F#项目。您可能需要浏览CodePlex上的NuGet问题跟踪器,以查看是否已经报告了您的问题;如果没有,您应该一定要提交一个错误报告,让NuGet开发人员意识到这个问题。

NuGet问题跟踪器


@ChaseMedallion不要忘记在Codeplex上投票支持这个问题,因为NuGet开发人员通常会根据问题收到的投票数量来确定优先处理的功能/修复问题。 - Jack P.
他们花了一些时间才承认这个问题,但现在已经计划在NuGet 2.3中修复 - 所以希望如此。 - Joel Mueller
@ChaseMedallion - 有时候你可以通过在使用NuGet更新包之前执行“生成...清理解决方案”来解决这个bug。不要问我为什么,但是当构建输出文件夹为空时,似乎就不会发生这种情况。 - Joel Mueller

1
我最近写了一篇关于这个问题如何重现的博客文章。

http://mikehadlow.blogspot.co.uk/2013/06/nuget-install-is-broken-with-f.html

如您所请求,我已经复制了它的开头:

当您尝试使用NuGet添加包引用到F#项目时,会出现一个非常严重的错误。如果被安装的程序集在GAC中也有版本或者在输出目录中已经存在不同版本,它就会显露出来。

首先,让我们重现这个问题,当程序集的某个版本已经存在于GAC中时。

创建一个新的解决方案,其中包含一个F#项目。

选择要从NuGet安装的程序集,该程序集也存在于您计算机上的GAC中。出于讽刺的目的,我将在此示例中选择NuGet.Core。

它在我的GAC中:

D:\>gacutil -l | find "NuGet.Core"
NuGet.Core, Version=1.0.11220.104, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL
NuGet.Core, Version=1.6.30117.9648, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL

你可以看到,在GAC中最高的版本是1.6.30117.9648。
现在让我们从官方NuGet源安装NuGet.Core版本2.5.0:
PM> Install-Package NuGet.Core -Version 2.5.0
Installing 'Nuget.Core 2.5.0'.
Successfully installed 'Nuget.Core 2.5.0'.
Adding 'Nuget.Core 2.5.0' to Mike.NuGetExperiments.FsProject.
Successfully added 'Nuget.Core 2.5.0' to Mike.NuGetExperiments.FsProject.

它能正确创建一个packages目录,下载NuGet.Core包并创建一个packages.config文件。
D:\Source\Mike.NuGetExperiments\src>tree /F
D:.
│   Mike.NuGetExperiments.sln
│
├───Mike.NuGetExperiments.FsProject
│   │   Mike.NuGetExperiments.FsProject.fsproj
│   │   packages.config
│   │   Spike.fs
│   │
│   ├───bin
│   │   └───Debug
│   │
│   └───obj
│       └───Debug
│
└───packages
    │   repositories.config
    │
    └───Nuget.Core.2.5.0
        │   Nuget.Core.2.5.0.nupkg
        │   Nuget.Core.2.5.0.nuspec
        │
        └───lib
            └───net40-Client
                    NuGet.Core.dll

但是当我查看我的fsproj文件时,我发现它错误地引用了NuGet.Core版本(1.6.30117.9648)从GAC中,并且没有指向已下载软件包的提示路径。

<Reference Include="NuGet.Core, Version=1.6.30117.9648, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
  <Private>True</Private>
</Reference>

1
如果你的链接失效了,你能在这里提供一个简短的摘要吗? - John Palmer

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