C# 在.NETMVC中合并具有构建变体的公共项目
我有一个.NETMVC站点,它应该发布给许多不同的客户,因此根据目标客户的不同而略有不同 是否有办法建立核心项目结构,例如(简化):C# 在.NETMVC中合并具有构建变体的公共项目,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个.NETMVC站点,它应该发布给许多不同的客户,因此根据目标客户的不同而略有不同 是否有办法建立核心项目结构,例如(简化): 观点 模型 控制器 资产 垃圾箱 并在构建时使用当前目标可能具有的任何变体进行合并。例如: 核心项目: 观点 view1.cshtml view2.cshtml (为简洁起见,已删除其余文件夹) 客户1目标: 观点 view2.cshtml view3.cshtml 所需的合并结果: 观点 view1.cshtml(来自核心项目) view
- 观点
- 模型
- 控制器
- 资产
- 垃圾箱
- 观点
- view1.cshtml
- view2.cshtml
- 观点
- view2.cshtml
- view3.cshtml
- 观点
- view1.cshtml(来自核心项目)
- view2.cshtml(来自客户1目标)
- view3.cshtml(来自客户1目标)
同样的规则也应适用于控制器、二进制文件等。您需要的是超级管理部分,根据客户的不同,您可以在其中[取消]激活站点的不同部分。首先想到的是(可能最简单,因为它不需要任何附加工具)创建具有核心功能的核心项目,视图和控制器。并为每个客户创建具有自定义视图和控制器的单独项目。然后,对于特定于客户的项目,只需从核心项目链接所有必需的文件。根据数字链接文件可能有点乏味,但似乎可行 另一种方法是使用诸如或之类的工具,借助这些工具,您可以按照自己的方式编写整个构建过程的脚本,但我自己从未尝试过这样的自定义脚本编写 我也可以使用的第三个选项是根据定义的常量有条件地包含文件,但这需要编辑*.csproj文件。代码可以是这样的:
<Content Include="Views\View1.cshtml" />
<Content Include="Views\View2.cshtml" Condition="$(DefineConstants.Contains('CORE'))" />
<Content Include="Views\View2.cshtml" Condition="$(DefineConstants.Contains('CUSTOMER1'))" />
<Content Include="Views\View3.cshtml" Condition="$(DefineConstants.Contains('CORE'))" />
<Content Include="Views\View3.cshtml" Condition="$(DefineConstants.Contains('CUSTOMER1'))" />
不过,我不知道维护它有多容易
<>我可能会考虑将应用程序拆分为独立的组件/项目,这些组件将包含与组件相关的所有功能。在构建过程中,将根据特定客户端所需的组件使用FAKE组合组件。您的需求是定制Visual Studio项目模板的最佳候选 我正在考虑准备一个大型项目,其中包含您要部署到任何客户的所有功能。此项目也可以是主干,当需要新功能或修复时,您可以对其进行更新。然后。然后继续并进入它,以收集用户对项目创建的输入。根据输入采取适当的操作,并根据需要添加/删除必要的文件或启用/禁用功能
或者,您可以将源文件保留在文件系统中,并动态地将它们组织到模板中—即,作为向导期间用户输入的结果。向导结束时,将部署模板并。。。瞧。这里有一些非常好的代码答案,但是如果您想要为每个客户机提供一个自动构建系统,并且您有负载,那么安装它们也可能会很痛苦。 当您可以为Powershell设置一个可以执行此操作的脚本时 伪代码
For each client site
download base code to code/
download this client's changes to code/ overwriting files
msbuild ....
copy client/ bin to build/client/
Delete code/
End For each
这个问题的答案需要一些创新。请看我的解决方案: 为涵盖模型和控制器文件的类设置核心项目结构,然后使用名为的技术,该技术可以共享以下内容:
- 两个应用程序共用的应用程序逻辑,但不可移植
- 无平台依赖关系的用户控件
bin文件夹包含核心MVC dll文件,以及您添加用于项目的文件和一个
projectName.dll
文件,该文件将在生成后创建。您只需使用添加引用工具右键单击引用即可添加/删除它们。我会使用多个项目、nuget或使用源代码管理。我将在下面讨论这些想法,但没有特别的顺序。最后,我可能会包括对其中一个的偏好
我要讲的第一个想法是使用多个项目。创建基础项目,我们称之为WebBase。创建你所谈论的核心网站。下一步创建Customer1网站,如果将Customer1创建为空网站,则需要在WebBase中重新创建文件夹结构,或者可以像使用WebBase一样创建它并删除所有文件(从Visual Studio中执行此操作);无论哪种方式,最终都会得到没有文件的文件夹结构。我建议将web.config、packages.config、Properties文件夹保存在AssemblyInfo.cs中。然后,您将添加来自WebBase的文件,但不要只是正常地添加它们。为了便于演示,让我们执行主索引视图:展开Customer1中的Views文件夹,右键单击Home,选择add,选择Exising Item,从Customer1中浏览,然后进入WebBase/Views/Home并单击Index.cshtml,现在注意到按钮上的下拉菜单了吗?单击该链接并选择“添加为链接”。现在对WebBase中的所有文件执行此操作!每次选择“添加为链接”似乎都很麻烦,但如果您只单击“添加”,它会复制文件,更新不会从WebBase传播到Customer1!此外,您将看到诸如从项目中删除vs删除之类的内容(带有永久删除提示)
第二个想法是创造