Contribuisco a una libreria open source che attualmente supporta MVC 2 - MVC 5 e desidero supportare anche MVC 6 (e oltre). Per supportare ciascuna versione di MVC, sfruttiamo la funzionalità Condition di MSBuild per includere la versione corretta di MVC e le sue dipendenze durante la creazione di una build (in base al valore di DefineConstants
). Ciò rende possibile l'utilizzo di un singolo file di progetto per tutte le versioni supportate di MVC, creando una singola DLL per ciascuna versione MVC utilizzando lo stesso file di progetto e il codice sorgente.Supporto di più versioni di una dipendenza di compilazione (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>
ho guardato la struttura del progetto di ASP.NET 5/6 MVC e hanno già rassegnato a utilizzare un file project.json
anziché un file .csproj
per MVC 6. Tuttavia, ho letto il project.json documentation e ci doesn' t sembra essere un modo per supportare più versioni di MVC con un singolo file project.json
.
Idealmente, mi piacerebbe abbandonare MSBuild
e utilizzare Roslyn
per ogni versione MVC (incluso MVC 2 - MVC 5) andando avanti. Ma esiste un modo per supportare più versioni MVC senza dover creare un file di progetto (e la directory del progetto poiché tutti dovrebbero essere denominati project.json
) per ogni versione MVC? In caso contrario, esiste un altro modo per non dover duplicare tutta la configurazione project.json
per 5 volte?
Questo non funziona (almeno non come lo avete). Stiamo compilando una DLL separata per .NET 3.5, .NET 4.0 e .NET 4.5 solo per MVC2. MVC3 e MVC4 sono compilati in .NET 4.0 e .NET 4.5 e MVC5 solo in .NET 4.5. Abbiamo simboli di compilazione per sfruttare progressivamente le nuove funzionalità. Ad esempio, ce n'è uno attorno all'attributo 'AllowAnonymous' perché non era supportato in MVC2 o MVC3 ma è richiesto per MVC4 e MVC5 per garantire che le persone con AuthorizeAttribute registrate globalmente possano sempre accedere al controller. Stai dicendo che dovrei mappare una versione di MVC su un singolo framework? – NightOwl888
Ah, capisco. In tal caso, sì, stai facendo la cosa giusta e la tua risposta è corretta. –