在 f# 脚本中执行 c# 代码有意外行为

Executing c# code in f# script has unexpected behavior

我有一个 F# 假脚本,它与 Nuge.Core 一起使用来提取包文件。如果我尝试使用 c# 控制台应用程序执行此操作,一切正常。但是,如果我在 f# 假脚本中执行完全相同的脚本,它就不起作用。这里有太多依赖关系,我不知道去哪里寻求帮助:docker.dotnetfakef#nuget.core

要重现此内容,您需要下载 Docker.DotNet.2.124.3.nupkg


对于 c# 示例,您需要控制台应用程序并安装 nuget.core nuget 包。这有效!

class Program
{
    static void Main()
    {
        var zip = new NuGet.ZipPackage(@"Docker.DotNet.2.124.3.nupkg");
        foreach (var file in zip.GetFiles())
        {
            System.Console.WriteLine(file.Path);
        }
    }
}

对于 f# 示例,您需要并排放置这两个文件: https://gist.github.com/mynkow/e6f0e550fcacc268dd1e9b743e17d344

错误:

    ==============================================================================
FsiEvaluationException:

Error: System.InvalidOperationException: 'NETStandard.Library' already has a dependency defined for 'Microsoft.NETCore.Platforms'.
           at NuGet.Manifest.ValidateDependencySets(IPackageMetadata metadata)
           at NuGet.Manifest.Validate(Manifest manifest)
           at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider, Boolean validateSchema)
           at NuGet.LocalPackage.ReadManifest(Stream manifestStream)
           at NuGet.ZipPackage.EnsureManifest(Func`1 manifestStreamFactory)
           at NuGet.ZipPackage..ctor(String filePath, Boolean enableCaching)
           at <StartupCode$FSI_0005>.$FSI_0005_Test$fsx.main@() in C:\Users\mynkow\Desktop\Reproduce\test.fsx:line 12
        Stopped due to error


Output: [Loading C:\Users\mynkow\Desktop\Reproduce\test.fsx]
        ==============================================================================


Input: C:\Users\mynkow\Desktop\Reproduce\test.fsx
\Arguments:
  C:\fsi.exe

Exception: Yaaf.FSharp.Scripting.FsiEvaluationException: Error while compiling or executing fsharp snippet. ---> System.Exception: Operation failed. The error text has been print the error stream. To return the corresponding FSharpErrorInfo use the EvalInteractionNonThrowing, EvalScriptNonThrowing or EvalExpressionNonThrowing
   at Microsoft.FSharp.Compiler.Interactive.Shell.FsiEvaluationSession.commitResult[a,b](FSharpChoice`2 res)
   at Microsoft.FSharp.Compiler.Interactive.Shell.FsiEvaluationSession.EvalScript(String filePath)
   at Yaaf.FSharp.Scripting.Helper.evalScript@1303.Invoke(String arg00) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1303
   at Yaaf.FSharp.Scripting.Helper.save_@1276-2.Invoke(Unit unitVar0) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1277
   at Yaaf.FSharp.Scripting.Helper.consoleCapture[a](TextWriter out, TextWriter err, FSharpFunc`2 f) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1221
   at Yaaf.FSharp.Scripting.Helper.redirectOut@1247[a](Boolean preventStdOut, OutStreamHelper out, OutStreamHelper err, FSharpFunc`2 f) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1254
   at Yaaf.FSharp.Scripting.Helper.save_@1275-1.Invoke(String text) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1276
   --- End of inner exception stack trace ---
   at Yaaf.FSharp.Scripting.Helper.save_@1275-1.Invoke(String text) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1284
   at Yaaf.FSharp.Scripting.Helper.session@1306.Yaaf-FSharp-Scripting-IFsiSession-EvalScriptWithOutput(String ) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1308
   at Fake.FSIHelper.runScriptUncached(Boolean useCache, String scriptPath, IEnumerable`1 fsiOptions, Boolean printDetails, CacheInfo cacheInfo, TextWriter out, TextWriter err) in C:\code\FAKE\src\app\FakeLib\FSIHelper.fs:line 471
System.InvalidOperationException: 'NETStandard.Library' already has a dependency defined for 'Microsoft.NETCore.Platforms'.
   at NuGet.Manifest.ValidateDependencySets(IPackageMetadata metadata)
   at NuGet.Manifest.Validate(Manifest manifest)
   at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider, Boolean validateSchema)
   at NuGet.LocalPackage.ReadManifest(Stream manifestStream)
   at NuGet.ZipPackage.EnsureManifest(Func`1 manifestStreamFactory)
   at NuGet.ZipPackage..ctor(String filePath, Boolean enableCaching)
   at <StartupCode$FSI_0005>.$FSI_0005_Test$fsx.main@() in C:\Users\mynkow\Desktop\Reproduce\test.fsx:line 12
Stopped due to error

我尝试了所有可能依赖项的 5 个最新版本,结果完全相同 => c# 可以工作,f# 不行。您有任何线索或任何可以建议我尝试解决此问题的方法吗?


肮脏的解决方案:
这就是 Docker.DotNet.2.124.3.nupkg 的样子 inside
例如,如果我删除 netstandard1.6 一切正常。这意味着问题出在nuget.core,对吧?但为什么它在 c# 控制台应用程序中工作?不知道!


更新:我能够从 F# 控制台应用程序正确执行代码

我已经用 paket 下载了软件包,并这样更改了脚本:

#r @"./packages/FAKE/tools/FakeLib.dll"
#r @"./packages/NuGet.Core/lib/net40-Client/NuGet.Core.dll"

open System
open System.Collections.Generic
open System.IO
open Fake

Target "Test" (fun _ -> 
    printfn "=============================================================================="
    global.NuGet.ZipPackage(@"Docker.DotNet.2.124.3.nupkg").GetFiles() |> Seq.iter(fun x -> printfn "%s" x.Path )
)

RunParameterTargetOrDefault "target" "test"

它给出了这个

Microsoft (R) F# Interactive version 14.0.23413.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> 

--> Referenced 'C:\tmp\visualfsharp.issue.nuget\./packages/FAKE/tools/FakeLib.dll'


--> Referenced 'C:\tmp\visualfsharp.issue.nuget\./packages/NuGet.Core/lib/net40-Client/NuGet.Core.dll'

Building project with version: LocalBuild
Shortened DependencyGraph for Target Test:
<== Test

The resulting target order is:
 - Test
Starting Target: Test 
==============================================================================
Running build failed.
Error:
System.InvalidOperationException: The schema version of 'Docker.DotNet' is incompatible with version 1.6.30117.9648 of NuGet. Please upgrade NuGet to the latest version from http://go.microsoft.com/fwlink/?LinkId=213942.
   at NuGet.Manifest.CheckSchemaVersion(XDocument document)
   at NuGet.Manifest.ValidateManifestSchema(XDocument document, String schemaNamespace)
   at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider)
   at NuGet.ZipPackage.EnsureManifest()
   at FSI_0002.clo@9.Invoke(Unit _arg1) in C:\tmp\visualfsharp.issue.nuget\test.fsx:line 11
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\FAKE\src\app\FakeLib\TargetHelper.fs:line 493

---------------------------------------------------------------------
Build Time Report
No target was successfully completed
---------------------------------------------------------------------
---------------------------------------------------------------------

val it : unit = ()

> 

NuGet.Core 的版本是 2.12,我看到它正在引用未加载的 Microsoft.Web.Xdt。

也许你可以通过简单地使用 paket 并添加 Docker.DotNet 作为依赖来实现你想要的,它会为你提取它。

如果您描述了可重现的错误,请制作一个 zip 文件并将 post 提交到 visualfsharp 存储库。