如何在dnx中诊断缺失依赖项(或其他加载器失败)?

134
我正在尝试在使用 Kestrel 的 DNX 上运行经过修改的 ASP.NET vNext 的 HelloWeb 示例。虽然这很不稳定,但我希望 ASP.NET 团队至少能够使最简单的 Web 应用程序正常工作 :)
环境:
- Linux (Ubuntu) - Mono 3.12.1 - DNX 1.0.0-beta4-11257(我也有11249)
“Web应用程序”代码在 Startup.cs 中:
using Microsoft.AspNet.Builder;
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseWelcomePage();
    }
}

project.json中的项目配置:

{
  "dependencies": {
    "Kestrel": "1.0.0-beta4",
    "Microsoft.AspNet.Diagnostics": "1.0.0-beta4",
    "Microsoft.AspNet.Hosting": "1.0.0-beta4",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
    "Microsoft.AspNet.StaticFiles": "1.0.0-beta4",
    "Microsoft.Framework.Runtime": "1.0.0-beta4",
    "Microsoft.Framework.Runtime.Common": "1.0.0-beta4",
    "Microsoft.Framework.Runtime.Loader": "1.0.0-beta4",
    "Microsoft.Framework.Runtime.Interfaces": "1.0.0-beta4",
  },
  "commands": {
    "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
  },
  "frameworks": {
    "dnx451": {}
  }
}

kpm restore 看起来运行正常。

但是,当我尝试运行时,会出现一个异常,提示无法找到 Microsoft.Framework.Runtime.IApplicationEnvironment。命令行和错误信息(稍作格式化):

.../HelloWeb$ dnx . kestrel
System.IO.FileNotFoundException: Could not load file or assembly 
'Microsoft.Framework.Runtime.IApplicationEnvironment,
  Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
or one of its dependencies.
File name: 'Microsoft.Framework.Runtime.IApplicationEnvironment,
  Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke 
    (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke 
    (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder,
     System.Object[] parameters, System.Globalization.CultureInfo culture)
    [0x00000] in <filename unknown>:0
显然,我最紧迫的需求是解决这个问题,但我也希望得到关于如何诊断出问题并自行解决类似问题的建议。(这也有可能让这个问题对其他人更有用。)
我在Microsoft.Framework.Runtime.Interfaces程序集源代码中找到了Microsoft.Framework.Runtime.IApplicationEnvironment,而且它似乎最近没有改变。不清楚为什么异常显示名称好像是整个程序集,而不仅是另一个程序集内的接口。我猜这可能与程序集中立接口有关,但从错误信息中无法确定。[AssemblyNeutral]已经过时,所以不是这个原因...)


只是好奇,您提供的程序集中立接口链接 https://github.com/aspnet/Home/wiki/Assembly-Neutral-Interfaces 是有意为之还是其他地方?因为目前它已经失效了。 - cgijbels
@cgijbels:谢谢 - 我实际上想链接到http://davidfowl.com/assembly-neutral-interfaces/,但你的链接可能更好... - Jon Skeet
我的经验是,像你在问题中展示的汇编加载失败通常是由于您的DNX和/或您的软件包来自不同的构建版本。验证kpm restore下载的包都是相同的版本,并且此版本与您的DNX相匹配,应该是解决这些错误的第一步。当依赖项解析机制找不到1.0.0-beta4软件包版本时,我不确定它会怎么做。因为不存在这样的软件包,所以它应该会失败。听起来有点像一个bug? - AndersNS
@AndersNS:不,这些包确实存在于夜间构建存储库中。https://www.myget.org/gallery/aspnetvnext - Jon Skeet
存在版本为“1.0.0-beta4-_buildnumber_”的软件包。我在上面看不到“1.0.0-beta4”。如果像beta3、beta2和beta1一样,直到beta4被认为是“相对稳定”的并合并到主分支之前,没有构建号的软件包将不会发布。 - AndersNS
@AndersNS:我明白你的意思。正如我在答案中所指出的,我并不完全理解在这种情况下版本号是如何解析的,但它确实被解析了,例如作为1.0.0-beta4-11185。 - Jon Skeet
6个回答

143
好问题。针对你的具体问题,看起来你的依赖关系存在不匹配的情况。当出现这种情况时,很可能是因为你在不兼容的dnx上运行应用程序。我们仍然进行了非常大的重大更改,因此如果你看到方法或类型丢失,很有可能是你最终运行的是betaX包和betaY dnx,或者反之亦然。
更具体地说,在beta4中删除了程序集中立接口,但看起来你正在运行的应用程序仍在使用它们。
我们计划使包能够标记它们需要运行的最低dnx,以使错误消息更加清晰。随着时间的推移,重大更改将会减少。
总的来说,我觉得现在是时候写一份指南,介绍如何在使用dnx时诊断此类问题(因为它与现有的.NET非常不同)。
您在 project.json 中添加的依赖项仅限于顶级。版本也始终是最小值(就像 NuGet 包一样)。这意味着当您指定 Foo 1.0.0-beta4 时,实际上指定的是 Foo >= 1.0.0-beta4。这意味着如果您要求 MVC 0.0.1,而您配置的源中的最小版本是 MVC 3.0.0,则会得到该版本。我们也从不浮动您的版本,除非您指定它。如果您请求 1.0.0 并且存在,即使存在更新的版本,您也将获得 1.0.0。指定空版本始终是不好的,并且将在以后的构建中被禁止。
我们正在 nuget 中引入一个名为“floating versions”的新功能。今天它仅适用于预发布标记,但在下一个版本中,它将适用于版本的更多部分。这类似于 npm 和 gem 语法,在软件包规范文件中指定版本范围。

1.0.0-* - 表示给我与前缀匹配的最高版本(根据语义化版本规则),或者如果没有与该前缀匹配的版本,则使用正常行为并获取>=指定版本的最低版本。

当您在最新版本中运行恢复时,它将编写一个名为project.lock.json的文件。此文件将具有在project.json中定义的所有目标框架的依赖项的传递闭包。

当类似于这样的内容失败时,您可以执行以下操作:

使用kpm list查看已解决的依赖项。这将显示您的项目引用的软件包的已解析版本以及引入它的依赖关系。例如,如果A->B,则会显示:

A
  -> B
B
 ->

实际的KPM列表输出:

列出ClassLibrary39(C:\ Users \ davifowl \ Documents \ Visual Studio 14 \ Projects \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)的依赖项

[Target framework DNX,Version=v4.5.1 (dnx451)]

 framework/Microsoft.CSharp 4.0.0.0
    -> ClassLibrary39 1.0.0
 framework/mscorlib 4.0.0.0
    -> ClassLibrary39 1.0.0
 framework/System 4.0.0.0
    -> ClassLibrary39 1.0.0
 framework/System.Core 4.0.0.0
    -> ClassLibrary39 1.0.0
*Newtonsoft.Json 6.0.1
    -> ClassLibrary39 1.0.0

[Target framework DNXCore,Version=v5.0 (dnxcore50)]

*Newtonsoft.Json 6.0.1
    -> ClassLibrary39 1.0.0
 System.Runtime 4.0.20-beta-22709
    -> ClassLibrary39 1.0.0

*代表直接依赖关系。

如果您有一个可用的Visual Studio(目前与DNX不兼容),您可以查看引用节点。它以相同的方式呈现数据:

References node

让我们看一下依赖项失败的情况:
这是项目的json文件。
{
    "version": "1.0.0-*",
    "dependencies": {
        "Newtonsoft.Json": "8.0.0"
    },

    "frameworks" : {
        "dnx451" : { 
            "dependencies": {
            }
        },
        "dnxcore50" : { 
            "dependencies": {
                "System.Runtime": "4.0.20-beta-22709"
            }
        }
    }
}

"

Newtonsoft.Json 8.0.0不存在。因此运行kpm restore会显示以下内容:

"

enter image description here

当诊断还原失败时,请查看所做的HTTP请求,它们告诉您kpm查找了哪些配置的软件包源。请注意上图中有一个CACHE请求。这是基于资源类型(nupkg或nuspec)的内置缓存,并具有可配置的TTL(请参见kpm restore --help)。如果要强制kpm访问远程NuGet源,请使用--no-cache标志:

KPM restore --no-cache

这些错误也会在Visual Studio的软件包管理器日志输出窗口中显示:

enter image description here

小提示!

软件包来源

我将描述 NuGet.config 目前的工作方式(这在将来可能会改变)。默认情况下,你在 %appdata%\NuGet\NuGet.Config 中全局配置了一个默认的 NuGet.org 源。你可以使用 Visual Studio 或 NuGet 命令行工具管理这些全局源。在尝试诊断故障时,你应该始终查看有效的源(列在 kpm 输出中的源)。

了解更多关于 NuGet.config 的信息 在这里

回到现实:

当依赖项未解析时,运行应用程序会给出以下结果:

> dnx . run
System.InvalidOperationException: Failed to resolve the following dependencies for target framework 'DNX,Version=v4.5.1':
   Newtonsoft.Json 8.0.0

Searched Locations:
  C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\{name}\project.json
  C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\test\{name}\project.json
  C:\Users\davifowl\.dnx\packages\{name}\{version}\{name}.nuspec
  C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\{name}.dll
  C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\{name}.dll
  C:\WINDOWS\Microsoft.NET\assembly\GAC_32\{name}\{version}\{name}.dll
  C:\WINDOWS\Microsoft.NET\assembly\GAC_64\{name}\{version}\{name}.dll
  C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\{name}\{version}\{name}.dll

Try running 'kpm restore'.

   at Microsoft.Framework.Runtime.DefaultHost.GetEntryPoint(String applicationName)
   at Microsoft.Framework.ApplicationHost.Program.ExecuteMain(DefaultHost host, String applicationName, String[] args)
   at Microsoft.Framework.ApplicationHost.Program.Main(String[] args)

运行时会尝试在运行之前验证整个依赖关系图是否已解决。如果建议运行 kpm restore,则是因为找不到所列出的依赖项。
另一个可能导致此错误的原因是运行了错误的dnx版本。如果您的应用程序仅指定了dnx451,而您尝试运行CoreCLR dnx,则可能会看到类似的问题。请注意错误消息中的目标框架:
用于运行:
dnx4x - runs on dnx-clr-{etc}
dnxcore50 - runs on dnx-coreclr-{etc}

当你尝试运行时,应该记住在project.json中定义的从clr到目标框架的心理映射。
这也显示在Visual Studio下的引用节点中:Unresolved dependencies 标记为黄色的节点是未解决的。
这些也会出现在错误列表中:

Error list unresolved dependencies

构建

这些错误也会在构建时出现。当从命令行进行构建时,输出非常详细,并且在诊断问题时非常有用:

> kpm build

Building ClassLibrary39 for DNX,Version=v4.5.1
  Using Project dependency ClassLibrary39 1.0.0
    Source: C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\ClassLibrary39\project.json

  Using Assembly dependency framework/mscorlib 4.0.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\mscorlib.dll

  Using Assembly dependency framework/System 4.0.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.dll

  Using Assembly dependency framework/System.Core 4.0.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Core.dll

  Using Assembly dependency framework/Microsoft.CSharp 4.0.0.0
    Source: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Microsoft.CSharp.dll


Building ClassLibrary39 for DNXCore,Version=v5.0
  Using Project dependency ClassLibrary39 1.0.0
    Source: C:\Users\davifowl\Documents\Visual Studio 14\Projects\ClassLibrary39\src\ClassLibrary39\project.json

  Using Package dependency System.Console 4.0.0-beta-22709
    Source: C:\Users\davifowl\.dnx\packages\System.Console\4.0.0-beta-22709
    File: lib\contract\System.Console.dll

  Using Package dependency System.IO 4.0.10-beta-22231
    Source: C:\Users\davifowl\.dnx\packages\System.IO\4.0.10-beta-22231
    File: lib\contract\System.IO.dll

  Using Package dependency System.Runtime 4.0.20-beta-22231
    Source: C:\Users\davifowl\.dnx\packages\System.Runtime\4.0.20-beta-22231
    File: lib\contract\System.Runtime.dll

  Using Package dependency System.Text.Encoding 4.0.10-beta-22231
    Source: C:\Users\davifowl\.dnx\packages\System.Text.Encoding\4.0.10-beta-22231
    File: lib\contract\System.Text.Encoding.dll

  Using Package dependency System.Threading.Tasks 4.0.10-beta-22231
    Source: C:\Users\davifowl\.dnx\packages\System.Threading.Tasks\4.0.10-beta-22231
    File: lib\contract\System.Threading.Tasks.dll

输出显示编译器从包和项目引用中传递的所有程序集。当您开始出现构建故障时,查看此处以确保您正在使用的包实际上适用于该目标平台非常有用。
这是一个在dnxcore50上无法正常工作的包的示例:
{
    "version": "1.0.0-*",
    "dependencies": {
        "Microsoft.Owin.Host.SystemWeb": "3.0.0"
    },

    "frameworks": {
        "dnx451": {
            "dependencies": {
            }
        },
        "dnxcore50": {
            "dependencies": {
                "System.Console": "4.0.0-beta-22709"
            }
        }
    }
}

Microsoft.Owin.Host.SystemWeb 3.0.0版本没有任何可以在dnxcore50上运行的程序集(请查看解压包中的lib文件夹)。当我们运行kpm build时:

Missing assemblies on dnxcore50

请注意,它说“使用包Microsoft.Owin.Host.SystemWeb”,但没有“文件:”。这可能是构建失败的原因。
这就是我的头脑倾泻的全部内容。

我正在尝试按照您的建议使用" dnu list",以确定为什么"dnx"无法解析依赖项。但是我收到了一个红色的“无法找到project.json”的错误提示。该程序集位于artifacts文件夹中,通过勾选“生成输出”选项来生成。有关如何继续操作的任何建议? - Mike Scott
构件文件夹与任何东西有关系吗?您在project.json中引用了依赖项吗?您引用的包是否在配置的源中可用? - davidfowl

17

我仍然不完全知道出了什么问题,但现在我至少有一系列步骤,使得尝试事情变得更容易:

  • 当你不确定时,重新安装dnx
    • 清除包缓存可能会有帮助
  • 检查~/.config/NuGet.config以确保您正在使用正确的NuGet源

最终,我使用以下命令行以相对清洁的方式测试了各种选项:

rm -rf ~/.dnx/packages && rm -rf ~/.dnx/runtimes && dnvm upgrade && kpm restore && dnx . kestrel
似乎我的问题实际上是由于安装了错误版本的依赖项导致的。版本号"1.0.0-beta4""1.0.0-beta4-*"明显有很大不同。例如,Kestrel 依赖项在只指定为1.0.0-beta4时安装了版本1.0.0-beta4-11185,但带有-*的版本为1.0.0-beta4-11262。我想明确指定beta4以避免意外使用beta3构建。下面的项目配置正常运行:
{
  "dependencies": {
    "Kestrel": "1.0.0-beta4-*",
    "Microsoft.AspNet.Diagnostics": "1.0.0-beta4-*",
    "Microsoft.AspNet.Hosting": "1.0.0-beta4-*",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta4-*",
  },
  "commands": {
    "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
  },
  "frameworks": {
    "dnx451": {}
  }
}

6
这是因为使用 -* 会始终返回最新的预发布版本,而不使用则会返回满足所有依赖项的最低版本(这是 NuGet 中通常的做法)。这个测试 中有一些例子。 - Alexander Köplinger
2
@AlexanderKöplinger:谢谢,很有道理。所以...beta4是最早的beta4,而...beta4-*是最新的beta4,对吗? - Jon Skeet
4
“frameworks”: {“dnx451”:{}}已经为我修复,不需要使用“dnxcore50”。 - vicentedealencar
你的第一条命令帮助我解决了在beta5版本上卡住的问题。我尝试运行dnvm upgrade-self,但它无法升级到最新版本。以管理员身份运行VS命令提示符时,dnvm版本显示为“rc1...”,但非管理员身份时则为“beta5...”。在运行了你的命令后,无论是管理员还是非管理员命令提示符都显示为最新的“rc2...”版本。 - JabberwockyDecompiler
对于使用 Mono 的人们,不知道应该选择 dnx451 还是 dnxcore50。这篇回答帮助了我更好地理解这个问题:https://dev59.com/qovda4cB1Zd3GeqPgvom#30846048 简单来说:dnx451 适用于 Mono。 - Nate Cook

8

您可以设置名为DNX_TRACE的环境变量为1,以查看更多的诊断信息。但请注意,这将提供大量的信息!


@JonSkeet 顺便说一下,其他答案(包括你自己的答案)都包含了关于诊断和修复你遇到的具体问题的重要信息。我把这个答案保持得非常简短,因为它只是另一个不同的答案,可能会引出更多关于问题最初发生原因的线索。 - Eilon
当然 - 我很感激 :) - Jon Skeet

3
为了让它能正常工作,我修改了我的 project.json 文件,现在它看起来像这样:
{
"dependencies": {
    "Kestrel": "1.0.0-*",
    "Microsoft.AspNet.Diagnostics": "1.0.0-*",
    "Microsoft.AspNet.Hosting": "1.0.0-*",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-*",
    "Microsoft.AspNet.StaticFiles": "1.0.0-*"
},
"commands": {
    "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001",
    "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
},
"frameworks": {
    }
}

关键似乎是框架部分。

另外,重命名更改了k web的工作方式,现在是dnx . webdnx . kestrel

更新-更多信息

奇怪的是,当我没有定义任何框架时,运行kpm restore时会获取一堆额外的东西:

...
Installing Microsoft.Framework.Logging 1.0.0-beta4-11001
Installing Microsoft.Framework.Logging.Interfaces 1.0.0-beta4-11001
Installing Microsoft.Framework.DependencyInjection.Interfaces 1.0.0-beta4-11010
Installing Microsoft.Framework.DependencyInjection 1.0.0-beta4-11010
Installing Microsoft.Framework.ConfigurationModel 1.0.0-beta4-10976
Installing Microsoft.Framework.ConfigurationModel.Interfaces 1.0.0-beta4-10976
Installing Microsoft.AspNet.Hosting.Interfaces 1.0.0-beta4-11328
Installing Microsoft.AspNet.FeatureModel 1.0.0-beta4-11104
Installing Microsoft.AspNet.Http 1.0.0-beta4-11104
Installing Microsoft.AspNet.FileProviders.Interfaces 1.0.0-beta4-11006
Installing Microsoft.Framework.Caching.Interfaces 1.0.0-beta4-10981
Installing Microsoft.AspNet.FileProviders 1.0.0-beta4-11006
Installing Microsoft.AspNet.Http.Core 1.0.0-beta4-11104
Installing Microsoft.AspNet.WebUtilities 1.0.0-beta4-11104
Installing Microsoft.Net.Http.Headers 1.0.0-beta4-11104
Installing Microsoft.AspNet.Http.Interfaces 1.0.0-beta4-11104
Installing Microsoft.Framework.Runtime.Interfaces 1.0.0-beta4-11257
Installing Microsoft.AspNet.Server.Kestrel 1.0.0-beta4-11262
Installing Microsoft.Net.Http.Server 1.0.0-beta4-11698
Installing Microsoft.Net.WebSockets 1.0.0-beta4-11698
Installing Microsoft.Net.WebSocketAbstractions 1.0.0-beta4-10915
Installing Microsoft.Framework.WebEncoders 1.0.0-beta4-11104
Installing Microsoft.Framework.OptionsModel 1.0.0-beta4-10984
Installing Microsoft.AspNet.Http.Extensions 1.0.0-beta4-11104
Installing Microsoft.AspNet.Diagnostics.Interfaces 1.0.0-beta4-12451
Installing Microsoft.AspNet.RequestContainer 1.0.0-beta4-11328

然后它正常运行了。然后我切换回框架部分。

"frameworks": {
    "dnx451": {}
}

之前它会抛出一个错误,但现在它还能正常工作!

非常奇怪!

(我正在运行 1.0.0-beta4-11257 版本)

进一步更新

我启动了一个新的 Ubuntu 实例,并且得到了与你相同的错误。我的想法是问题可能是由于它只试图从 nuget.org 获取软件包而不是 myget.org (后者有更新的东西),所以我将 NuGet.Config 放入项目的根目录中。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="AspNetVNext" value="https://www.myget.org/F/aspnetvnext/" />
    <add key="NuGet" value="https://nuget.org/api/v2/" />
  </packageSources>
</configuration>

..这似乎已经通过获取正确版本(在另一个kpm restore之后)为我解决了问题。


1
关于“dnx . kestrel”部分 - 的确,这就是我展示的命令 :) 使用该配置后,我得到了不同的错误:System.TypeLoadException: Could not load type 'Microsoft.Framework.DependencyInjection.LoggingServiceCollectionExtensions' from assembly 'Microsoft.Framework.Logging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'。您使用的DNX版本是哪个? - Jon Skeet
1
当我第一次执行 "dnx . web" 命令时,出现了以下错误:`System.InvalidOperationException: Failed to resolve the following dependencies for target framework 'DNX,Version=v4.5.1',并且它列出了缺失的依赖项列表。 - Stephen Pope
有趣。顺便问一下,这是在哪个平台上? - Jon Skeet
嗯...重新安装并稍作配置后,我肯定取得了更多的进展 - 现在我只剩下“常规”的libuv问题了。看起来有许多事情可以相互作用。 - Jon Skeet
我目前正在进行清理/测试/微调循环 - 我相信将beta4从您的版本号中删除实际上会产生巨大的影响。不过仍在测试中。 - Jon Skeet
显示剩余3条评论

2
这些天,我所有的package.json版本都以"-rc2-*"结尾。(目前唯一的例外是Microsoft.Framework.Configuration包,需要是"1.0.0-rc1-*""1.0.0-*")关于@davidfowl提到的“版本列车”,在beta8和rc2之间似乎消失了很多问题。
dnvm upgrade -u -arch x64 -r coreclr

我在 coreclr 上运气最好的是这两个 NuGet 源:

"https://www.myget.org/F/aspnetvnext/"
"https://nuget.org/api/v2/"

当我遇到缺失软件包的问题时,90%的情况下都是这些罪魁祸首:

Newtonsoft.Json
Ix-Async
Remotion.Linq

大多数情况下,我可以通过强制使用主要的NuGet.org源来解决这些问题:
dnu restore;
dnu restore -s https://nuget.org/api/v2

这是我的工作配置文件config.json:

{
"dependencies": {
    "Microsoft.AspNet.Diagnostics": "1.0.0-rc2-*",
    "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc2-*",
    "Microsoft.AspNet.Hosting": "1.0.0-rc2-*",
    "Microsoft.AspNet.Http": "1.0.0-rc2-*",
    "Microsoft.AspNet.Http.Abstractions": "1.0.0-rc2-*",
    "Microsoft.AspNet.Mvc.Core": "6.0.0-rc2-*",
    "Microsoft.AspNet.Mvc.Razor": "6.0.0-rc2-*",
    "Microsoft.AspNet.Owin": "1.0.0-rc2-*",
    "Microsoft.AspNet.Routing": "1.0.0-rc2-*",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc2-*",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-rc2-*",
    "Microsoft.AspNet.Session": "1.0.0-rc2-*",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc2-*",
    "EntityFramework.Commands": "7.0.0-rc2-*",
    "EntityFramework.Core": "7.0.0-rc2-*",
    "EntityFramework.InMemory": "7.0.0-rc2-*",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc2-*",
    "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc2-*",
    "EntityFramework.Relational": "7.0.0-rc2-*",
    "EntityFramework7.Npgsql": "3.1.0-beta8-2",
    "Microsoft.Extensions.Logging.Abstractions": "1.0.0-rc2-*",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-*",
    "Microsoft.Extensions.DependencyInjection": "1.0.0-rc2-*",
    "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-rc2-*",
    "Microsoft.Framework.Configuration.CommandLine": "1.0.0-*",
    "Microsoft.Framework.Configuration.EnvironmentVariables": "1.0.0-*",
    "Microsoft.Framework.Configuration.Json": "1.0.0-*"
},
"commands": {
    "ef": "EntityFramework.Commands",
    "dev": "Microsoft.AspNet.Hosting --ASPNET_ENV Development --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5004"
},
"frameworks": {
    "dnxcore50": {}
}
}

以上列表不是来自config.json,而是project.json,但我仍然点赞,因为该列表为我提供了一些有用的依赖项,这些依赖项我之前并不知道。 - RonC

1
我也遇到了依赖缺失的问题,因为我试图满足dnxcore50和dnx451的引用。
如果我理解正确,“dependencies”:{}在框架之间共享。
然后,在“frameworks”中的“dependencies”:{}是特定于该框架的。
dnxcore50是一个模块化的运行时(自包含),因此它基本上包含了运行程序所需的所有核心运行时,而不像经典的.net framework那样,你需要在其他地方分散核心依赖项。
因此,考虑到以后可能会在mac或linux上托管,我想坚持最小化的方法。
更新 使用cshtml视图时遇到了奇怪的依赖关系问题,现在只使用dnx451。
这是我的project.json。
{
"webroot": "wwwroot",
"version": "1.0.0-*",

"dependencies": {
    "System.Runtime": "4.0.10",
    "Microsoft.AspNet.Hosting": "1.0.0-beta4",
    "Microsoft.AspNet.Mvc": "6.0.0-beta4",
    "Microsoft.AspNet.Server.IIS": "1.0.0-beta6-12075",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta6-12457",
    "Microsoft.Framework.DependencyInjection": "1.0.0-beta4",
    "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-beta5"
 },

"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://admin.heartlegacylocal.com"  },

"frameworks": {
"dnx451": { }
 }
},

"publishExclude": [
"node_modules",
"bower_components",
"**.xproj",
"**.user",
"**.vspscc"
],
"exclude": [
  "wwwroot",
  "node_modules",
  "bower_components"
  ]
}

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