2015-08-23 10 views
14

मैं ओपन सोर्स लाइब्रेरी में योगदान देता हूं जो वर्तमान में एमवीसी 2 - एमवीसी 5 का समर्थन करता है, और मैं एमवीसी 6 (और उससे परे) का भी समर्थन करना चाहता हूं। एमवीसी के प्रत्येक संस्करण का समर्थन करने के लिए, हम एमएसवी के सही संस्करण को शामिल करने के लिए एमएसवील्ड के Condition फीचर का लाभ उठाते हैं और निर्माण करते समय इसकी निर्भरता (DefineConstants के मूल्य के आधार पर) शामिल करते हैं। यह एक ही प्रोजेक्ट फ़ाइल और स्रोत कोड का उपयोग कर प्रत्येक एमवीसी संस्करण के लिए एक व्यक्तिगत DLL बनाकर, एमवीसी के सभी समर्थित संस्करणों के लिए एक एकल प्रोजेक्ट फ़ाइल का उपयोग करना संभव बनाता है।एक संकलन निर्भरता (vNext) के एकाधिक संस्करणों का समर्थन करना

<ItemGroup Condition=" $(DefineConstants.Contains('MVC2')) "> 
    <Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
</ItemGroup> 
<ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) "> 
    <!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't --> 
    <Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    <Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath> 
    </Reference> 
</ItemGroup> 
<ItemGroup Condition=" $(DefineConstants.Contains('MVC4')) "> 
    <Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath> 
    </Reference> 
</ItemGroup> 
<ItemGroup Condition=" $(DefineConstants.Contains('MVC5')) "> 
    <Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath> 
    </Reference> 
</ItemGroup> 

मैं ASP.NET 5/MVC 6 की परियोजना संरचना पर ध्यान दिया है और पहले से ही MVC 6. के लिए एक .csproj फ़ाइल के बजाय एक project.json फ़ाइल का उपयोग करने हालांकि इस्तीफा दे दिया है, मैं project.json documentation पढ़ सकते हैं और वहाँ नहीं करता ' टी एक एकल project.json फ़ाइल के साथ एमवीसी के कई संस्करणों का समर्थन करने का एक तरीका प्रतीत होता है।

आदर्श रूप में, मैं MSBuild को कुचलना चाहता हूं और प्रत्येक एमवीसी संस्करण (एमवीसी 2 - एमवीसी 5 सहित) के लिए Roslyn का उपयोग करना चाहता हूं। लेकिन क्या एक परियोजना फ़ाइल (और प्रोजेक्ट निर्देशिका बनाने के बिना कई एमवीसी संस्करणों का समर्थन करने का कोई तरीका है क्योंकि उनमें से सभी को एमवीसी संस्करण के लिए project.json नामित करना होगा)? यदि नहीं, तो क्या project.json कॉन्फ़िगरेशन 5 बार डुप्लिकेट करने का कोई और तरीका नहीं है?

उत्तर

1

मुझे इस मुद्दे पर एक (इतना अच्छा नहीं) कामकाज मिला। मैं अभी भी जानना चाहता हूं कि कोई बेहतर तरीका है या नहीं।

जिस समाधान के साथ मैं आया था वह परियोजना निर्देशिका के बाहर संकलित करने के लिए फ़ाइलों को शामिल करने के लिए ग्लोबिंग का उपयोग करना है। उदाहरण के लिए, अपने प्रोजेक्ट संरचना इस तरह दिखता है:

MyProject.sln 
// This is where the legacy MVC2-5 support goes 
MyProject/ 
    MyProject.csproj 
// This is where the MVC6 support is compiled from 
MyProject.MVC6/ 
    MyProject.MVC6.xproj 
    project.json 

.cs फ़ाइलों के सभी MyProject में शामिल हैं। और फिर मेरी project.json फ़ाइल इस तरह दिखता है:

{ 
    "version": "1.0.0-*", 
    "description": "MyProject Description", 

    "dependencies": { 
    "Microsoft.AspNet.Mvc": "6.0.0-beta7", 
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta7", 
    "Microsoft.AspNet.Routing": "1.0.0-beta7" 
    }, 

    "compile": "../MyProject/**/*.cs", 

    "compilationOptions": { 
    "define": ["MVC6", "NET46"] 
    }, 

    "frameworks": { 
    "dnxcore50": { 
     "dependencies": { 
     "Microsoft.CSharp": "4.0.1-beta-23225", 
     "System.Collections": "4.0.11-beta-23225", 
     "System.Linq": "4.0.1-beta-23225", 
     "System.Runtime": "4.0.21-beta-23225", 
     "System.Threading": "4.0.11-beta-23225" 
     } 
    } 
    } 
} 

हालांकि, इस समाधान के साथ एक और मुद्दा है - विजुअल स्टूडियो 2015 MyProject.MVC6 में फ़ाइलों के किसी भी प्रदर्शित नहीं करता है, क्योंकि वे केवल संकलन के लिए शामिल किए गए हैं। साथ ही, .csproj फ़ाइल को शामिल करना संभव नहीं है क्योंकि इससे पूरे प्रोजेक्ट को संकलित नहीं किया जाता है।

तो, मैं एक और वैकल्पिक हल के साथ आया था - एक project.json फ़ाइल और वास्तविक परियोजना के अंदर MyProject.DNX.Debug.xproj फ़ाइल शामिल करने के लिए और मैं .csproj फ़ाइल के बजाय MVC6 समाधान में यह एक शामिल हैं।

MyProject.sln 
// This is where the legacy MVC2-5 support goes 
MyProject/ 
    MyProject.csproj 
    MyProject.DNX.Debug.xproj 
    project.json 
// This is where the MVC6 support is compiled from 
MyProject.MVC6/ 
    MyProject.MVC6.xproj 
    project.json 

ये फ़ाइलें केवल सेवा करते हैं उन्हें MVC6 में डिबग करने के लिए एक तरीका प्रदान करने, नहीं माना जाता क्योंकि जो डिबग करने के लिए संस्करण के लिए आवश्यक है कि जब MVC7 बाहर आता है मैं एक अन्य परियोजना फ़ोल्डर बनाने और उसके बाद इस विन्यास स्वैप करने के लिए सक्षम हो जाएगा ।

MyProject.sln 
// This is where the legacy MVC2-5 support goes 
MyProject/ 
    MyProject.csproj 
    MyProject.DNX.Debug.xproj 
    project.json // This project will be swapped between MVC6 and MVC7 based on compilationOptions 
// This is where the MVC6 support is compiled from 
MyProject.MVC6/ 
    MyProject.MVC6.xproj 
    project.json 
// This is where the MVC7 support is compiled from 
MyProject.MVC7/ 
    MyProject.MVC7.xproj 
    project.json 

यह अभी भी आदर्श से बहुत दूर है। यदि कोई है तो कृपया एक बेहतर उत्तर दें। > नई परियोजना -

0

आप एक ही परियोजना है जो कई runtimes अर्थात नेट कोर करने के लिए संकलित, .NET 4.5.1 आदि

  1. फ़ाइल बना सकते हैं।
  2. वेब -> कक्षा पुस्तकालय (पैकेज)
  3. project.json फ़ाइल संपादित करें।
  4. frameworks तत्व के तहत, आप कई ढांचे को दर्ज कर सकते हैं। यहाँ मैं नेट कोर और .NET 4.5.1 लक्षित कर रहा हूं:

    "frameworks": { 
        "dnx451": { 
         "frameworkAssemblies": { 
          "System.Net.Http": "4.0.0.0",   // Example reference 
         } 
        }, 
        "dnxcore50": { 
         "dependencies": { 
          "System.Net.Http": "4.0.1-beta-23225" // Example reference 
         } 
        } 
    } 
    
  5. फिर अपने कोड में आप एक विशेष ढांचे या क्रम के लिए विशिष्ट कोड लिखने के लिए पूर्व प्रोसेसर निर्देशों का उपयोग कर सकते हैं।

    public void Foo() 
    { 
        #if DNX451 
        // Code specific to .NET 4.5.1 
        #endif 
    } 
    
+0

यह काम नहीं करेगा (कम से कम तुम्हारे पास है पसंद नहीं)। हम सिर्फ एमवीसी 2 के लिए .NET 3.5, .NET 4.0, और .NET 4.5 के लिए एक अलग DLL संकलित कर रहे हैं। एमवीसी 3 और एमवीसी 4 को .NET 4.0 और .NET 4.5, और एमवीसी 5 के तहत केवल .NET 4.5 के तहत संकलित किया गया है। हमारे पास नई सुविधाओं का लाभ उठाने के लिए संकलन प्रतीक हैं। उदाहरण के लिए, 'AllowAnonymous' विशेषता के आस-पास एक है क्योंकि यह एमवीसी 2 या एमवीसी 3 में समर्थित नहीं था, लेकिन एमवीसी 4 और एमवीसी 5 के लिए यह आवश्यक है कि यह सुनिश्चित करने के लिए वैश्विक स्तर पर पंजीकृत प्राधिकृत एट्रिब्यूट वाले लोग हमेशा नियंत्रक तक पहुंच सकें। क्या आप कह रहे हैं कि मुझे एक ही ढांचे में एमवीसी का एक संस्करण मैप करना चाहिए? – NightOwl888

+0

आह, मैं देखता हूं। उस स्थिति में, हाँ आप सही काम कर रहे हैं और आपका जवाब सही है। –

संबंधित मुद्दे