Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NETMVC中合并具有构建变体的公共项目_C#_Asp.net Mvc - Fatal编程技术网

C# 在.NETMVC中合并具有构建变体的公共项目

C# 在.NETMVC中合并具有构建变体的公共项目,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个.NETMVC站点,它应该发布给许多不同的客户,因此根据目标客户的不同而略有不同 是否有办法建立核心项目结构,例如(简化): 观点 模型 控制器 资产 垃圾箱 并在构建时使用当前目标可能具有的任何变体进行合并。例如: 核心项目: 观点 view1.cshtml view2.cshtml (为简洁起见,已删除其余文件夹) 客户1目标: 观点 view2.cshtml view3.cshtml 所需的合并结果: 观点 view1.cshtml(来自核心项目) view

我有一个.NETMVC站点,它应该发布给许多不同的客户,因此根据目标客户的不同而略有不同

是否有办法建立核心项目结构,例如(简化):

  • 观点
  • 模型
  • 控制器
  • 资产
  • 垃圾箱
并在构建时使用当前目标可能具有的任何变体进行合并。例如:

核心项目:

  • 观点
    • view1.cshtml
    • view2.cshtml
(为简洁起见,已删除其余文件夹)

客户1目标:

  • 观点
    • 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

这个问题的答案需要一些创新。请看我的解决方案:

为涵盖模型控制器文件的类设置核心项目结构,然后使用名为的技术,该技术可以共享以下内容:

  • 两个应用程序共用的应用程序逻辑,但不可移植
  • 无平台依赖关系的用户控件
不幸的是,razor视图不支持该功能。因此,复制共享视图最简单的方法是在每个web应用程序中包含多个布局文件,如著名的_layout.cshtml文件。您还可以将它们用作参考(作为共享视图)

对于资产,您可以从主web应用程序托管所有样式表(以及一些javascript,如果合适),并从每个web应用程序访问它


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删除之类的内容(带有永久删除提示)

第二个想法是创造