2015-08-23 49 views
14

我为当前支持MVC 2 - MVC 5的开源库做出了贡献,并且我也想支持MVC 6(及更高版本)。为了支持每个版本的MVC,我们利用MSBuild的Condition功能,在构建时包含正确版本的MVC及其依赖关系(取决于DefineConstants的值)。通过使用相同的项目文件和源代码为每个MVC版本创建单独的DLL,可以为所有支持的MVC版本使用单个项目文件。支持多个版本的编译依赖关系(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> 

我已经看过5 ASP.NET/MVC 6的项目结构和已经辞职,使用project.json文件,而不是一个.csproj文件MVC 6。然而,我读了project.json documentation,有没有按” t似乎是一种支持单个project.json文件的多个版本的MVC的方式。

理想情况下,我希望为每个MVC版本(包括MVC 2 - MVC 5)推出MSBuild并使用Roslyn。但是,有没有办法支持多个MVC版本,而无需为每个MVC版本创建项目文件(并且项目目录,因为所有这些文件都必须命名为project.json)?如果没有,是否有另一种方法不必重复所有的配置5次?

回答

1

我发现了一个(不太好)解决问题的办法。我仍然想知道是否有更好的方法。

我想出的解决方案是使用globbing来包含文件以在项目目录之外进行编译。例如,我的项目结构是这样的:

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

然而,这种解决方案的另一个问题 - 的Visual Studio 2015年不显示任何在MyProject.MVC6的文件,因为它们只包含编译。另外,不可能包含.csproj文件,因为这会导致整个项目不能编译。

因此,我想出了另一个解决方法 - 在实际项目中包含project.json文件和MyProject.DNX.Debug.xproj文件,并将其包含在MVC6解决方案中,而不是.csproj文件中。

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

您可以创建一个项目,它编译成多个运行时即.NET的核心,.NET 4.5.1等

  1. 文件 - >新建项目。
  2. 页面 - >类库(包)
  3. 编辑project.json文件。
  4. frameworks元素下,您可以输入多个框架。在这里我针对.NET的核心和.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

这是不行的(至少不会像有的话)。我们正在编译针对.NET 3.5,.NET 4.0和.NET 4.5的独立DLL,仅用于MVC2。 MVC3和MVC4仅在.NET 4.0和.NET 4.5下编译,而MVC5仅在.NET 4.5下编译。我们有编译符号以逐步利用更新的功能。例如,有一个绕'AllowAnonymous'属性,因为这不是在MVC2或MVC3支持,但需要MVC4和MVC5确保人们AuthorizeAttribute注册全球总能访问控制器。你是说我应该将MVC的一个版本映射到一个框架? – NightOwl888

+0

啊,我明白了。在那种情况下,是的,你做的是正确的,你的回答是正确的。 –