ฉันจะวินิจฉัยการอ้างอิงที่ขาดหายไป (หรือความล้มเหลวของตัวโหลดอื่น ๆ ) ใน dnx ได้อย่างไร


133

ฉันกำลังพยายามเรียกใช้ตัวอย่าง HelloWebเวอร์ชันแก้ไขสำหรับ ASP.NET vNext บน DNX โดยใช้ Kestrel ฉันเข้าใจว่านี่เป็นเรื่องที่ต้องห้ามพลาด แต่ฉันหวังว่าอย่างน้อยทีม ASP.NET จะทำให้เว็บแอปที่ง่ายที่สุดทำงานได้ :)

สิ่งแวดล้อม:

  • Linux (Ubuntu สวยมาก)
  • โมโน 3.12.1
  • DNX 1.0.0-beta4-11257 (ฉันมี 11249 ด้วย)

รหัส "เว็บแอป" ใน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.IApplicationEnvironmentในMicrosoft.Framework.Runtime.Interfacesแหล่งที่มาของการประกอบและดูเหมือนจะไม่มีการเปลี่ยนแปลงเมื่อเร็ว ๆ นี้ ไม่ชัดเจนว่าเหตุใดข้อยกเว้นจึงแสดงชื่อราวกับว่าเป็นชุดประกอบทั้งหมดในตัวเองแทนที่จะเป็นเพียงอินเทอร์เฟซภายในแอสเซมบลีอื่น ฉันคาดเดาว่านี่อาจเกิดจากการประกอบอินเทอร์เฟซที่เป็นกลางแต่ไม่ชัดเจนจากข้อผิดพลาด ( [AssemblyNeutral]ตายแล้วไม่ใช่เหรอ ... )


ด้วยความอยากรู้คุณต้องการเชื่อมโยงไปยังgithub.com/aspnet/Home/wiki/Assembly-Neutral-Interfacesสำหรับลิงก์อินเทอร์เฟซที่เป็นกลางของแอสเซมบลีหรือที่อื่นหรือไม่? เนื่องจากปัจจุบันเสีย
cgijbels

@cgijbels: ขอบคุณ - จริงๆแล้วฉันตั้งใจจะเชื่อมโยงไปยังdavidfowl.com/assembly-neutral-interfacesแต่ลิงค์ของคุณมันน่าจะดีกว่า ...
Jon Skeet

อินเทอร์เฟซที่เป็นกลางของแอสเซมบลี @JonSkeet หายไป
tugberk

@tugberk: เอ้ยจริงเหรอ? น่าสนใจ - คุณมีลิงค์ที่ฉันสามารถรวมไว้ในการแก้ไขได้หรือไม่?
Jon Skeet

@JonSkeet github.com/aspnet/Configuration/commit/…อาจจะ? :)
tugberk

คำตอบ:


144

คำถามที่ดี. สำหรับปัญหาเฉพาะของคุณดูเหมือนว่าคุณมีการอ้างอิงที่แก้ไขไม่ตรงกัน เมื่อสิ่งนี้เกิดขึ้นอาจเป็นเพราะคุณกำลังเรียกใช้แอปพลิเคชันของคุณบน dnx ที่เข้ากันไม่ได้ เรายังคงทำการเปลี่ยนแปลงที่ยิ่งใหญ่มากดังนั้นหากคุณเคยเห็นวิธีการหายไปของประเภทที่ขาดหายไปโอกาสที่คุณจะเรียกใช้betaXแพ็คเกจและbetaYdnx หรือในทางกลับกัน

โดยเฉพาะอย่างยิ่ง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 แม้ว่าจะมีเวอร์ชันใหม่กว่าก็ตาม การระบุเวอร์ชันว่างเป็นสิ่งที่ไม่ดีเสมอไปและจะไม่ได้รับอนุญาตในการสร้างในภายหลัง

มีคุณลักษณะใหม่ที่เรากำลังแนะนำให้รู้จักกับนักเก็ตที่เรียกว่าเวอร์ชันลอย วันนี้ใช้ได้เฉพาะกับแท็กก่อนเปิดตัว แต่ในเวอร์ชันถัดไปจะใช้งานได้กับส่วนอื่น ๆ ของเวอร์ชัน ซึ่งคล้ายกับไวยากรณ์ของ npm และ gem สำหรับการระบุช่วงเวอร์ชันในไฟล์ข้อมูลจำเพาะแพ็กเกจ

1.0.0-*- หมายถึงให้ฉันเป็นเวอร์ชันที่สูงที่สุดที่ตรงกับคำนำหน้า (ตามกฎการกำหนดเวอร์ชันเชิงความหมาย ) หรือหากไม่มีเวอร์ชันที่ตรงกับคำนำหน้านั้นให้ใช้พฤติกรรมปกติและรับเวอร์ชันต่ำสุด> = เวอร์ชันที่ระบุให้ฉัน

project.lock.jsonเมื่อคุณเรียกคืนค่าในล่าสุดสร้างก็จะเขียนออกไฟล์ที่เรียกว่า ไฟล์นี้จะมีการปิดการอ้างอิงสำหรับกรอบงานเป้าหมายทั้งหมดที่กำหนดไว้ในรูปแบบproject.json.

เมื่อสิ่งนี้ล้มเหลวคุณสามารถทำสิ่งต่อไปนี้:

ดูการอ้างอิงที่แก้ไขโดยใช้kpm list. สิ่งนี้จะแสดงให้คุณเห็นแพ็คเกจเวอร์ชันแก้ไขที่อ้างถึงโดยโปรเจ็กต์ของคุณและสิ่งที่การอ้างอิงดึงเข้ามาเช่นถ้า A -> 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

* หมายถึงการพึ่งพาโดยตรง

หากคุณมีวิชวลสตูดิโอที่ใช้งานได้ (ซึ่งแตกกับ DNX ในขณะนี้) คุณสามารถดูโหนดอ้างอิงได้ มีข้อมูลเดียวกันกับภาพ:

โหนดอ้างอิง

มาดูกันว่าความล้มเหลวในการพึ่งพามีลักษณะอย่างไร:

นี่คือ project.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 จึงแสดงสิ่งต่อไปนี้:

ป้อนคำอธิบายภาพที่นี่

เมื่อวินิจฉัยว่าการคืนค่าอาจล้มเหลวให้ดูที่คำขอ HTTP ที่สร้างขึ้นพวกเขาจะบอกคุณว่าแหล่งที่มาของแพ็กเกจที่กำหนดค่าไว้ที่ kpm ดูแล้วมีCACHEคำขอใดในภาพด้านบน นี่คือการแคชในตัวตามประเภทของทรัพยากร (nupkg หรือ nuspec) และมี TTL ที่กำหนดค่าได้ (ดูที่kpm restore --help) หากคุณต้องการบังคับkpmให้กดแหล่งที่มา NuGet ระยะไกลให้ใช้--no-cacheแฟล็ก:

KPM เรียกคืน - ไม่มีแคช

ข้อผิดพลาดเหล่านี้ยังแสดงใน Visual Studio ในหน้าต่างเอาต์พุตบันทึกตัวจัดการแพ็คเกจ:

ป้อนคำอธิบายภาพที่นี่

หมายเหตุด้าน!

แหล่งที่มาของแพ็คเกจ

ฉันจะอธิบายวิธีการทำงานของ NuGet.config ในตอนนี้ (ซึ่งอาจมีการเปลี่ยนแปลงในอนาคต) โดยค่าเริ่มต้นคุณมี NuGet.config ที่มีแหล่งที่มา NuGet.org เริ่มต้นที่กำหนดค่าไว้ทั่วโลกในรูปแบบ%appdata%\NuGet\NuGet.Config. คุณสามารถจัดการแหล่งข้อมูลส่วนกลางเหล่านี้ภายในวิชวลสตูดิโอหรือด้วยเครื่องมือบรรทัดคำสั่ง 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:

ไม่มีชุดประกอบบน dnxcore50

สังเกตว่า "ใช้ Package Microsoft.Owin.Host.SystemWeb" แต่ไม่มี "File:" นี่อาจเป็นสาเหตุของการสร้างล้มเหลว

นี่เป็นการทิ้งสมองของฉัน


ฉันกำลังพยายามใช้รายการ dnu ตามที่คุณแนะนำเพื่อหาสาเหตุที่ dnx ไม่สามารถแก้ไขการอ้างอิงได้ แต่ฉันได้รับข้อความ "Unable to locate project.json" สีแดง แอสเซมบลีอยู่ในโฟลเดอร์อาร์ติแฟกต์ซึ่งสร้างขึ้นโดยการทำเครื่องหมายที่ "สร้างเอาต์พุตบนบิลด์" มีข้อเสนอแนะในการดำเนินการอย่างไร?
Mike Scott

โฟลเดอร์ Artifacts เกี่ยวข้องกับอะไรบ้าง? คุณอ้างอิงการอ้างอิงใน 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-11185 เมื่อระบุเพียง1.0.0-beta4แต่เป็นเวอร์ชัน 1.0.0-beta4-11262 ที่มี-*ส่วนท้าย ฉันต้องการระบุbeta4อย่างชัดเจนเพื่อหลีกเลี่ยงการใช้บิวด์เบต้า 3 กับไฟล์

การกำหนดค่าโครงการต่อไปนี้ใช้งานได้ดี:

{
  "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

สำหรับผู้ที่ใช้โมโนและสงสัยว่าควรเลือกdnx451หรือdnxcore50คำตอบนี้ช่วยให้ฉันเข้าใจหัวข้อนี้มากขึ้น: stackoverflow.com/a/30846048/89590คำตอบสั้น ๆ : dnx451เหมาะสำหรับโมโน
Nate Cook

8

คุณสามารถตั้งค่า var env ชื่อDNX_TRACEเพื่อ1ที่จะเห็น TON ข้อมูลการวินิจฉัยเพิ่มเติม ขอเตือนข้อมูลเยอะกว่านี้!


@JonSkeet BTW คำตอบอื่น ๆ (รวมถึงคำตอบของคุณเอง) มีข้อมูลที่ดีเกี่ยวกับการวินิจฉัยและการแก้ไขปัญหาเฉพาะที่คุณพบ ฉันเก็บคำตอบนี้ไว้สั้น ๆ เพราะเป็นเพียงคำตอบอื่นที่อาจนำไปสู่เบาะแสเพิ่มเติมว่าทำไมปัญหาจึงเกิดขึ้นตั้งแต่แรก
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 . webหรือdnx . 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)

อัปเดตเพิ่มเติม

ผมปั่นขึ้นอินสแตนซ์อูบุนตูใหม่และมีข้อผิดพลาดเช่นเดียวกับคุณ .. ความคิดของฉันถูกว่าปัญหาอาจจะเกิดจากเพียงการพยายามที่จะได้รับแพคเกจจาก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: ไม่สามารถโหลดประเภท 'Microsoft.Framework.DependencyInjection.LoggingServiceCollectionExtensions' จากแอสเซมบลี 'Microsoft Framework.Logging เวอร์ชัน = 1.0.0.0 วัฒนธรรม = เป็นกลาง PublicKeyToken = null ' คุณใช้ DNX เวอร์ชันใด
Jon Skeet

1
เมื่อฉันทำ "dnx. web" ครั้งแรกฉันได้รับ: `System.InvalidOperationException: ล้มเหลวในการแก้ไขการอ้างอิงต่อไปนี้สำหรับเฟรมเวิร์กเป้าหมาย 'DNX, Version = v4.5.1' และแนะนำรายการสิ่งที่ขาดหายไป
Stephen Pope

น่าสนใจ. แพลตฟอร์มนี้คืออะไร btw?
Jon Skeet

คุณทำ 'source ~ / .bashrc' เพื่อโหลดตัวแปรสภาพแวดล้อมใหม่หลังจากที่คุณอัพเกรด DNX หรือไม่? ฉันต้องทำ "dnvm upgrade" + "dnvm use default"
Stephen Pope

DNX ไม่ได้อัปเดตโดย. bashrc ... อาจเป็นเพราะฉันสร้างด้วยตนเองเมื่อวานนี้ จะลองใช้คำแนะนำที่อัปเดตแทน ...
Jon Skeet

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 2 รายการนี้:

"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 แต่ฉันยังคงได้รับการโหวตเนื่องจากรายการให้การอ้างอิงที่เป็นประโยชน์ซึ่งฉันไม่เคยรู้มาก่อน
Ron C

1

ฉันมีปัญหาในการพึ่งพาที่ขาดหายไปเช่นกันกับการพยายามดึงดูดการอ้างอิง dnxcore50 และ dnx451

ถ้าฉันเข้าใจ "การอ้างอิง" ที่ถูกต้องนี้: {} จะใช้ร่วมกันระหว่างกรอบงาน

จากนั้น "การอ้างอิง": {} ภายใน "เฟรมเวิร์ก": เฉพาะสำหรับเฟรมเวิร์กนั้น

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"
  ]
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.