【问题标题】:Deploy project with same code base but different content to multiple sites将具有相同代码库但内容不同的项目部署到多个站点
【发布时间】:2014-08-27 15:07:20
【问题描述】:

我有一个通过 Visual Studio 的 Web 部署部署的 ASP.NET MVC 项目 - 到目前为止一切正常。

我现在需要部署同一项目的另一个版本(例如,为不同的客户)——具有相同的代码库/功能,但具有不同的布局,即其他 CSS 和图像(甚至可能具有不同的视图/Razor 代码)。理想情况下,其他配置的内容根本不会发布。

我知道我可以为持久层使用不同的连接字符串 - 但有没有办法配置其他内容元素?

我想避免使用需要分支/合并的两个版本(或更高版本)——而是想简单地部署具有不同“主题”的最新版本...

【问题讨论】:

  • 您要求部署具有不同内容的相同代码库,但也要求部署不同的剃须刀页面。我相信 Razor 是一个代码库,而不是一个内容。
  • @Tengiz:你说得对,当然视图甚至 CSS 都是代码库的一部分,而不是真正的“内容”。内容本身存储在数据库中,可以轻松地与另一个连接字符串交换(使用 web.config 转换)。问题是:代码库的布局部分也可以交换吗...
  • @PeterAlbert:这似乎是一个设计问题。如果您预见到将来可能会发生这样的变化,并且您已经通过 DB 交换了内容,那么您应该考虑从数据库加载 css。当然还有很多其他方法可以做到这一点,但我更喜欢简单高效。

标签: asp.net deployment


【解决方案1】:

我有一个包含 4 个类库的 MVC 项目。我将它部署到其他 3 个域中。

我只为每个客户端复制了没有控制器或代码类的 MVC 项目,并将它们添加到我的解决方案中。我只将它们用于视觉变化或主题。不适用于服务器端功能。因此不应部署复制的项目的程序集。只应部署 UI 文件。程序集从原始 MVC 项目的输出文件夹部署。

我构建解决方案并将 dll 发布到 3 个域中,并且只将每个客户端的 UI 文件发布到它的服务器中。

这使我能够仅在一个 MVC 项目中开发服务器端功能。将 UI 文件与服务器端功能分开。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    那么你在使用 MVC 吗?

    您可以做的是覆盖默认剃须刀引擎并创建自己的。 razor 引擎所做的主要是将您的请求映射到特定文件夹中的视图,您可以告诉 razor 引擎何时将这些请求映射到一个或另一个文件夹中的视图。

    MVC4 Razor Custom View Locator

    这里有完整的解释:

    http://nickberardi.com/creating-your-first-mvc-viewengine/

    对于视图而言,如果您只是希望 CSS 或 JS 有所不同,您只需将您的请求映射到剃刀捆绑包,然后根据变量或存在的变量改变捆绑包的内容配置文件,或通过使用数据库中的值填充变量。 如您所见,捆绑非常简单:

    http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

    假设您的 html 指向: /assets/mycssbundle.css ,但是该文件实际包含的内容可以通过您告诉捆绑函数文件所在的位置来更改。

    【讨论】:

    • 有趣的方法,我会研究一下!
    • 我很高兴你这么认为,实际上我自己做了很多研究,结果就是这样:)。
    【解决方案3】:

    这似乎是一个设计问题。如果您预见到将来可能会发生这样的变化,并且您已经通过 DB 交换了内容,那么您应该考虑从数据库加载 css file。当然还有很多其他方法可以做到这一点,但简单高效更可取。

    这意味着正确构建您的 html 以确保所有布局都通过 CSS 正确处理,并且可以通过 ViewData 或 ViewBag 实现。见case example

    编辑: 不是 css 数据,而是相关的 css 文件。

    【讨论】:

      【解决方案4】:

      你有两个选择:

      A) 开发一个自定义视图引擎,根据配置在不同页面集之间切换。这将允许您通过更改 web.config 设置在页面集之间切换,这非常适合 Visual Studio 的内置部署模型(不同的 web.config 转换为不同的部署环境启动)。想到的一种实现 - 在不同部署环境的视图引擎之间切换(在不同的 web.config 转换中)。

      与从数据库加载页面的其他建议不同,我建议从文件夹或物理位置加载它们(例如,针对项目的不同子文件夹的不同视图引擎)。在开发和修复数据库中的页面及其标记时,数据库方法对开发人员不友好。

      B) 在同一个项目下开发所有页面集(所有变体),然后编写自定义部署脚本,根据部署环境部署特定页面集。这种方法的缺点是很难注意到页面集相交或链接跨越页面集边界等问题。

      虽然 B 计划在开发方面听起来有点简单,但在维护和部署方面可能会成为一场噩梦。

      所以,我推荐A计划。

      【讨论】:

        【解决方案5】:

        你的问题太宽泛了。

        不过,我们也有类似的用例。我们将所有与主题相关的东西(css、图像等)作为嵌入式资源放在单独的程序集中。我们有 Customer1.Theme.dll 和 Customer2.Theme.dll 等。

        应用程序动态加载 Theme.dll 并从那里引用资源。

        【讨论】:

          【解决方案6】:

          在其他解决方案中,

          • 假设您使用的是 asp.net mvc。
          • 假设您在同一个存储库中有 content1 和 content2 文件夹,或者在同一个存储库中可用,这不是问题。
          • 并假设您正在捆绑您的内容。
          • 并假设您的图像仅使用 css 引用。

          你可以有一个应用配置键,它会告诉你是想要 content1 还是 content2。

          类似的,

          <add key="sitecontent" value="content1"/>

          现在在您的应用程序中以全局 asax 启动,读取应用配置键并根据值调用

          BundleConfig.RegisterContent1Bundles(BundleTable.Bundles); BundleConfig.RegisterContent2Bundles(BundleTable.Bundles);

          【讨论】:

            【解决方案7】:

            我认为这是一个设计问题。正如您在下面看到的,您可以在不同的层中组织您的 .net 应用程序:

            来源:Microsoft

            有一些关键原则(Separation of concernsDRY 等)是 Microsoft 通过 .net 平台大力鼓励的,我相信它们会在您的项目中得到很好的应用。

            根据您的描述,一种简单的方法是在一个项目中保留所有客户相同的业务层(包括服务或数据层,即使每个项目使用不同的连接字符串)并为表示层。

            您可以在from ScottCodeProjectmore traditional methods 找到更多信息(顺便说一句,这是一本很棒的书)。

            【讨论】:

              猜你喜欢
              • 2014-05-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-19
              相关资源
              最近更新 更多