좋은 질문. 특정 문제의 경우 해결 된 종속성이 일치하지 않는 것 같습니다. 이와 같은 일이 발생하면 호환되지 않는 dnx에서 응용 프로그램을 실행하고 있기 때문일 수 있습니다. 우리는 여전히 큰 변화를 계속하고 있기 때문에 누락 된 유형의 메소드 누락이 발견되면 betaX
패키지 를 실행 하고 betaY
dnx를 또는 그 반대로 실행할 가능성이 있습니다 .
더 구체적으로, Assembly Neutral Interfaces 는 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에 새로운 기능이 도입되었습니다. 현재는 시험판 태그에서만 작동하지만 다음 버전에서는 더 많은 부분에서 작동합니다. 이것은 패키지 사양 파일에서 버전 범위를 지정하는 npm 및 gem 구문과 비슷합니다.
1.0.0-*
-의미는 접두사와 일치하는 가장 높은 버전을 제공합니다 ( 시맨틱 버전 규칙 에 따름 ). 접두어와 일치하는 버전이 없으면 정상적인 동작을 사용하고 지정된 버전보다 낮거나 낮은 버전을 찾으십시오.
최신 빌드에서 복원을 실행하면이라는 파일이 작성됩니다 project.lock.json
. 이 파일은에 정의 된 모든 대상 프레임 워크에 대한 의존성을 전 이적으로 닫습니다 project.json
.
이와 같은 것이 실패하면 다음을 수행 할 수 있습니다.
를 사용하여 해결 된 종속성을 살펴보십시오 kpm list
. 그러면 프로젝트에서 참조한 패키지의 해결 된 버전과 패키지를 가져온 종속성이 표시됩니다. 예를 들어 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로 깨짐) 참조 노드를 볼 수 있습니다. 시각적으로 동일한 데이터가 표시됩니다.
의존성 실패가 어떻게 생겼는지 살펴 보자.
프로젝트는 다음과 같습니다.
{
"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를 실행하면 다음이 표시됩니다.
복원이 실패했을 때 진단 할 때 작성된 HTTP 요청을보고 kpm이 구성된 패키지 소스를 알려줍니다. 위 이미지에서 CACHE
요청이 있습니다. 리소스 유형 (nupkg 또는 nuspec)을 기반으로하는 기본 제공 캐싱이며 구성 가능한 TTL이 있습니다 (참조 kpm restore --help
). kpm
원격 NuGet 소스 에 강제 로 충돌하려면 다음 --no-cache
플래그를 사용하십시오 .
이러한 오류는 Visual Studio의 패키지 관리자 로그 출력 창에도 나타납니다.
사이드 노트!
패키지 소스
NuGet.config가 현재 작동하는 방식을 설명하겠습니다 (향후 변경 될 수 있음). 기본적으로 기본 NuGet.org 소스가있는 NuGet.config가 전역으로 구성되어 %appdata%\NuGet\NuGet.Config
있습니다. 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}
실행하려고 할 때 clr에서 대상 프레임 워크에 정의 된 정신 매핑을 기억해야합니다 project.json
.
이것은 Visual Studio에서 참조 노드 아래에 나타납니다.
노란색으로 표시된 노드는 확인되지 않습니다.
이들은 또한 오류 목록에 나타납니다.
건물
이 오류는 또한 빌드 할 때 나타납니다. 명령 행에서 빌드 할 때 출력은 매우 장황하며 문제점을 진단 할 때 매우 유용 할 수 있습니다.
> 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
:
"Package Microsoft.Owin.Host.SystemWeb 사용 중"이라고 표시되어 있지만 "파일 :"은 없습니다. 이것이 빌드 실패의 원인 일 수 있습니다.
여기 내 뇌 덤프가 끝났어