如何在版本控制中省略CMS,同时自动将其包括/恢复到项目中?

布赖恩

我相信这个问题通常适用于CMS。

我将CMS(Kentico)用于特定的Web应用程序。CMS安装程序使用10,000多个文件生成自己的样板项目,并且该项目相当于可运行的Web应用程序。CMS提供的文件很少用于修改。然而,标准做法是将自定义代码添加到项目中,并将整个项目检查到源代码管理中。

我不喜欢检查整个CMS的想法。我希望我的存储库仅包含特定于该项目的代码,而供应商文件会自动从其他位置“拉入”。例如,Visual Studio可以将NuGet包还原到项目中的固定位置,并且版本控制可以忽略此位置。

从某种意义上说,使用CMS进行开发要比使用典型的供应商库更脏。通常,您自己的代码取决于库,而该库与您的代码无关。但是,CMS希望成为您的应用程序,并且您自己的代码相互交织。CMS需要自定义其自己提供的文件。您不能只是将CMS文件“拉入”到固定位置,然后忽略该位置。

在这种情况下,我仍然想省略尽可能多的CMS文件。到目前为止,我已经确定了以下策略:

  1. 将CMS提供的文件的原始只读副本保留在标准的本地路径中。
  2. 创建一个新的项目根目录。
  3. 将CMS提供的项目文件复制到项目根目录。
  4. 在复制的项目文件中,更改10,000+个文件路径,以指向那些在项目根目录外部的原始CMS文件。
  5. 仅将具有自定义代码的文件放入项目根目录。如果必须修改CMS提供的文件,请将其复制到项目根目录并使用该副本。

该策略在理论上听起来不错,但在实践中则更为复杂。这有一些并发症:

  • 事实证明,将10,000+个文件路径更改为外部文件中的“链接”不仅是查找替换操作。要保留原始项目的目录结构,必须执行更复杂的映射。

  • Web服务器要求所有文件都位于同一目录中。使用项目文件链接外部文件可以进行编译,但是您已经将Web根分为两部分。

对于后一个问题,似乎最好的解决方法是执行构建后复制操作。从本质上讲,这比一开始看起来要复杂得多。

在撰写本文时,我开始觉得我应该继续并将所有有效的CMS转储到我的存储库中。感觉很脏,但这要简单得多。在此之前,是否有人对我如何实现目标有任何经验或想法?

重申一下我的问题:如何在版本控制库中排除CMS提供的文件,同时仍将它们包括在项目/构建脚本和Web应用程序根目录中?

布赖恩

我想出了一个理想的策略:

  • 将原始CMS文件放置在外部“代码库”位置,并使其处于只读状态,以备不时之需。
  • 制作CMS提供的项目文件的副本。
  • 转换所有项目项以链接到代码库的副本,包括程序集引用。linkMSBuild的必需元素使此操作变得复杂,因此我编写了一个小型控制台应用程序来解析XML并生成必要的元素。我还将路径存储在属性中。

至此,您已经有了一个可编译的项目。这些文件都只是指向CMS提供的只读,基准,文件的链接,但是IDE会显示一个不错的目录结构,就像文件实际上在您的存储库中一样。在自定义时,可以将链接替换为您自己的实际文件。

但是,您的网站文件现在分为两个完全不同的位置。Web服务器需要它们实际上位于同一目录中。这是一些脚本派上用场的地方。

  • 使用您的构建脚本工具,将其插入构建后事件中,以将链接的文件复制到项目目录中。当然,您可以省略编译后的文件。这是我使用MSBuild的方法(感谢此博客文章):

    <Target Name="AfterBuild">
    
        <ItemGroup>
            <LinkedKenticoFiles Include="@(None);@(EmbeddedResource);@(Content)"
                Condition="$([System.String]::new('%(FullPath)').StartsWith('$(MY_LIBRARY_BASE_PATH)'))" />
        </ItemGroup>
    
        <Copy SourceFiles="%(LinkedKenticoFiles.Identity)"
            DestinationFiles="%(LinkedKenticoFiles.Link)"
            SkipUnchangedFiles='true' />
    
    </Target>
    
  • (可选)插入清洁事件以删除那些文件。我使用了类似的MSBuild语法删除文件,并且由于它留下了空目录,因此我也删除了空目录。(感谢这个答案。)

    <Target Name="BeforeClean">
    
        <ItemGroup>
            <LinkedKenticoFiles Include="@(None);@(EmbeddedResource);@(Content)"
                Condition="$([System.String]::new('%(FullPath)').StartsWith('$(MY_LIBRARY_BASE_PATH)'))" />
        </ItemGroup>
    
        <Delete Files="%(LinkedKenticoFiles.Link)" />
    
        <ItemGroup>
            <Directories Include="$([System.IO.Directory]::GetDirectories($(MSBuildProjectDirectory), '*', System.IO.SearchOption.AllDirectories))" />
            <Directories>
                <Files>$([System.IO.Directory]::GetFiles("%(Directories.Identity)", "*", System.IO.SearchOption.AllDirectories).get_Length())</Files>
            </Directories>
        </ItemGroup>
        <RemoveDir Directories="@(Directories)" Condition="%(Files)=='0'" />
    
    </Target>
    
  • (可选)使您的源代码管理忽略site / project文件夹,以避免检入临时复制的站点文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在版本控制中忽略CMS,同时自动将其包括/恢复到项目中?

来自分类Dev

如何在CMake项目中包括相同依赖项的两个不同版本?

来自分类Dev

如何在bash脚本中省略某些输入变量(例如$ 1和$ 2)的同时使用$ *?

来自分类Dev

如何在Kotlin中省略lambda参数?

来自分类Dev

如何在gcloud中省略用户交互

来自分类Dev

如何在Apache Solr中省略词频

来自分类Dev

如何在Maven项目中实现自动递增的内部版本号?

来自分类Dev

如何在大型Lotus Notes项目中合并版本控制(Git)

来自分类Dev

如何在团队项目中为 C# 类中的组设置版本控制权限?

来自分类Dev

Swift项目中的版本控制

来自分类Dev

如何从XCode 5项目中删除GIT版本控制

来自分类Dev

如何在我的Maven项目中包括JPA 2.1功能?

来自分类Dev

如何在ASP.NET项目中包括jquery插件

来自分类Dev

如何在TikZ / er图片中省略关系的“菱形”符号并控制沿关系路径的文本放置?

来自分类Dev

为什么Visual Studio从我发布的ASP.net项目中省略“ .compiled”文件?

来自分类Dev

如何在python中省略字典中频率较低的单词?

来自分类Dev

如何在Stargazer的结果表中省略回归截距

来自分类Dev

如何在聚合中省略na以计算R中的SD

来自分类Dev

如何在调试模块中省略默认消息

来自分类Dev

如何在调试模块中省略默认消息

来自分类Dev

我如何在sqlite中省略结果中的数字/ 0?

来自分类Dev

如何在Python中省略换行符?

来自分类Dev

如何在informatica生成的xml中省略显示模式

来自分类Dev

如何在Windows Phone项目中更改.net版本?

来自分类Dev

如何在Eclipse项目中更改JRE版本?

来自分类Dev

如何在项目中更改新版本的RAC(ReactiveCocoa)?

来自分类Dev

开源项目中的版本控制礼节?

来自分类Dev

WPF项目中的语义版本控制

来自分类Dev

如何在PCL项目中禁用自动选择框架?

Related 相关文章

  1. 1

    如何在版本控制中忽略CMS,同时自动将其包括/恢复到项目中?

  2. 2

    如何在CMake项目中包括相同依赖项的两个不同版本?

  3. 3

    如何在bash脚本中省略某些输入变量(例如$ 1和$ 2)的同时使用$ *?

  4. 4

    如何在Kotlin中省略lambda参数?

  5. 5

    如何在gcloud中省略用户交互

  6. 6

    如何在Apache Solr中省略词频

  7. 7

    如何在Maven项目中实现自动递增的内部版本号?

  8. 8

    如何在大型Lotus Notes项目中合并版本控制(Git)

  9. 9

    如何在团队项目中为 C# 类中的组设置版本控制权限?

  10. 10

    Swift项目中的版本控制

  11. 11

    如何从XCode 5项目中删除GIT版本控制

  12. 12

    如何在我的Maven项目中包括JPA 2.1功能?

  13. 13

    如何在ASP.NET项目中包括jquery插件

  14. 14

    如何在TikZ / er图片中省略关系的“菱形”符号并控制沿关系路径的文本放置?

  15. 15

    为什么Visual Studio从我发布的ASP.net项目中省略“ .compiled”文件?

  16. 16

    如何在python中省略字典中频率较低的单词?

  17. 17

    如何在Stargazer的结果表中省略回归截距

  18. 18

    如何在聚合中省略na以计算R中的SD

  19. 19

    如何在调试模块中省略默认消息

  20. 20

    如何在调试模块中省略默认消息

  21. 21

    我如何在sqlite中省略结果中的数字/ 0?

  22. 22

    如何在Python中省略换行符?

  23. 23

    如何在informatica生成的xml中省略显示模式

  24. 24

    如何在Windows Phone项目中更改.net版本?

  25. 25

    如何在Eclipse项目中更改JRE版本?

  26. 26

    如何在项目中更改新版本的RAC(ReactiveCocoa)?

  27. 27

    开源项目中的版本控制礼节?

  28. 28

    WPF项目中的语义版本控制

  29. 29

    如何在PCL项目中禁用自动选择框架?

热门标签

归档