使用project.lock.json对dotnet还原问题故障排除

这是关于如何解决使用问题的快速帖子dotnet restore,由于您的错误而无法恢复软件包project.json。前几天我碰到了它,考虑到问题有多简单,它使我感到非常沮丧!

我正在使用ASP.NET Core网站创建dotnet new并手动更新。当我开始研究它时,我dotnet restore尝试从NuGet恢复所有软件包。大多数软件包已正确还原,但是在日志底部附近有以下错误消息:

info : Committing restore...
log  : Writing lock file to disk. Path: /Users/Sock/Documents/Projects/TestWebsite/src/TestWebsite/project.lock.json
log  : /Users/Sock/Documents/Projects/TestWebsite/src/TestWebsite/project.json
log  : Restore failed in 4087ms.

Errors in /Users/Sock/Documents/Projects/TestWebsite/src/TestWebsite/project.json
    Package Microsoft.DotNet.ProjectModel 1.0.0-rc3-002886 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Microsoft.DotNet.ProjectModel 1.0.0-rc3-002886 supports:
      - net451 (.NETFramework,Version=v4.5.1)
      - netstandard1.6 (.NETStandard,Version=v1.6)
    One or more packages are incompatible with .NETCoreApp,Version=v1.0.

我首先想到的是,有一个不正确的引用到Microsoft.DotNet.ProjectModelproject.json。这是一个RC2应用程序,1.0.0-rc3-002886日志中显然存在无法恢复的引用,但是在检查时,project.json任何地方都没有明确引用。这意味着必须将其作为另一个程序包的依赖项引入,我只需要弄清楚它在哪里。这是我正在使用的文件:

{
  "buildOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.0-rc2-final"
  },
  "frameworks": {
    "net451": {},
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.0-rc2-3002702",
          "type": "platform"
        }
      },
      "imports": [
        "dnxcore50"
      ]
    }
  },
  "publishOptions": {
    "include": [
      "web.config"
    ]
  },
  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-*",
      "imports": "portable-net45+wp80+win8+wpa81+dnxcore50"
    }
  },
  "scripts": {
    "postpublish": "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
  }
}

现在,您可能会立即发现问题。现在看它似乎很明显,但是当时我正在撕掉头发,试图弄清正在发生的事情。

我检查了依赖项部分中的所有引用,但它们均指向*-rc2-final正确的引用。然后,我检查了每个框架节点下的所有依赖关系-在这种情况下只有一个,即Microsoft.NETCore.App-但同样,它们看起来都很不错。

尝试使用另一种方法,我在dotnet restore日志中搜索了“ ProjectModel”,但是只有现有的错误消息,没有任何迹象表明父依赖项是什么。

那时我有了一个迷你启示录-project.lock.json文件!任何在ASP.NET Core上工作的人都可能会看到此文件,但是由于幕后的NuGet基础结构仅使用了该文件,因此您甚至可能都没有看过它。该文件有助于管理项目的所有程序包依赖关系以及所有文件的本地位置。

快速搜索中project.lock.json的“ ProjectModel”,罪魁祸首立即显示出其lelf:

{
  ...
  "tools": {
    ".NETCoreApp,Version=v1.0": {
      "Microsoft.AspNetCore.Server.IISIntegration.Tools/1.0.0-preview2-21125": {
        "type": "package",
        "dependencies": {
          "Microsoft.DotNet.ProjectModel": "1.0.0-rc3-002886",
          "Microsoft.Extensions.CommandLineUtils": "1.0.0-rc3-21125",
          "Microsoft.NETCore.App": "1.0.0-rc3-004312",
          "System.Diagnostics.Process": "4.1.0-rc3-24127-00"
        },
        "compile": {
          "lib/netcoreapp1.0/dotnet-publish-iis.dll": {}
        },
        "runtime": {
          "lib/netcoreapp1.0/dotnet-publish-iis.dll": {}
        }
      }
    }
  },
 ...
}

因此,"Microsoft.DotNet.ProjectModel": "1.0.0-rc3-002886"依赖项已由Microsoft.AspNetCore.Server.IISIntegration.Tools引入。回顾project.json,您可以看到我使用的版本号是1.0.0-*。我需要version 1.0.0-preview1-final,但是这将拉出1.0.0它可以在配置的提要中找到的软件包的最高版本。

在RC2发行之前,我一直在使用许多最先进的工具,因此我在NuGet.config文件中配置了两个供稿

这些提要中的第一个是常规的NuGet提要,而第二个是CI MyGet提要,其中包含来自CI流程的最新软件包。当我使用开放式版本号时,NuGet在两个提要中查找了最高1.0.0版本的程序包,并在MyGet上找到1.0.0-preview2-21125Microsoft.AspNetCore.Server.IISIntegration.Tools的版本,并优先将该程序包拉入。那依赖于Microsoft.DotNet.ProjectModel版本1.0.0-rc3-002886,不幸的是,该版本需要netstandard1.6netcoreapp1.0仅支持netstandard1.5,因此会出现错误。

那么如何解决呢?好了,有两个很简单的选择:

  1. 从中删除MyGet提要NuGet.config
  2. 在中指定特定版本 project.json

如果删除MyGet提要,dotnet restore则将仅使用NuGet中的程序包。IISIntegration.Tools的最高版本是1.0.0-preview1-final,这是我需要的版本。

另外,您可以在中指定所需软件包的特定版本project.json,然后(几乎)知道您将获得哪个软件包!除非您确实希望所有东西都使用最新的软件包,否则我建议您应该优先选择此选项(当然,如果不使用它,则可以始终删除另一个feed)。

因此,为了完整起见,这是final project.json,具有在工具部分中列出的显式依赖项版本,该版本现在可以通过调用成功完成dotnet restore

{
  "buildOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.0-rc2-final"
  },
  "frameworks": {
    "net451": {},
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.0-rc2-3002702",
          "type": "platform"
        }
      },
      "imports": [
        "dnxcore50"
      ]
    }
  },
  "publishOptions": {
    "include": [
      "web.config"
    ]
  },
  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+wp80+win8+wpa81+dnxcore50"
    }
  },
  "scripts": {
    "postpublish": "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
  }
}

概括

因此,总而言之,如果您在遇到问题dotnet restore,请记住以下几点:

  1. 使用特定版本的依赖关系,至少在使用CI构建供稿时可能会处于高流量状态,并可能导致我发现这种情况。
  2. 别忘了在所有列出的依赖项中查看project.json依赖项框架/依赖项工具
  3. 检查dotnet restore正在使用的提要-在运行还原后会列出它们,以及用来查找提要的文件。
  4. 如果所有其他方法都失败了,请查看一下project.lock.json并找出正在发生的事情!

原创文章,作者:冰封一夏,如若转载,请注明出处:http://www.nncjzx.com/675.html

关注本站公众号获取更多实时内容

本站微信公众号:二线码农