支持编译依赖项(vNext)的多个版本
本文关键字:版本 vNext 编译 依赖 支持 | 更新日期: 2023-09-27 18:09:13
我贡献了一个目前支持MVC 2 - MVC 5的开源库,我也想支持MVC 6(以及更高版本)。为了支持每个版本的MVC,我们利用MSBuild的条件特性,在构建时包含正确的MVC版本及其依赖项(取决于DefineConstants
的值)。通过使用相同的项目文件和源代码为每个MVC版本创建单独的DLL,这使得为所有支持的MVC版本使用单个项目文件成为可能。
<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和已经辞职使用project.json
文件,而不是.csproj
文件的MVC 6。然而,我读了这个项目。json文档,似乎没有一种方法来支持多个版本的MVC与单一的project.json
文件。
理想情况下,我想放弃MSBuild
和使用Roslyn
的每个MVC版本(包括MVC 2 - MVC 5)向前。但是是否有一种方法来支持多个MVC版本,而不必创建一个项目文件(和项目目录,因为所有这些都必须被命名为project.json
)为每个MVC版本?如果没有,是否有其他方法可以不重复所有project.json
配置5次?
我找到了一个(不太好的)解决这个问题的方法。我还是想知道是否有更好的方法。
我想出的解决方案是使用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
这离理想还差得很远。
你可以创建一个项目,它可以编译成多个运行时,例如。net Core,。net 4.5.1等。
- File -> New Project.
- Web ->类库(包)
- 编辑项目json文件。
-
在
frameworks
元素下,您可以输入多个框架。这里我的目标是。net Core和。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 } } }
-
在你的代码中,你可以使用预处理器指令来编写特定于特定框架或运行时的代码。
public void Foo() { #if DNX451 // Code specific to .NET 4.5.1 #endif }