我相信这个问题通常适用于CMS。
我将CMS(Kentico)用于特定的Web应用程序。CMS安装程序使用10,000多个文件生成自己的样板项目,并且该项目相当于可运行的Web应用程序。CMS提供的文件很少用于修改。然而,标准做法是将自定义代码添加到项目中,并将整个项目检查到源代码管理中。
我不喜欢检查整个CMS的想法。我希望我的存储库仅包含特定于该项目的代码,而供应商文件会自动从其他位置“拉入”。例如,Visual Studio可以将NuGet包还原到项目中的固定位置,并且版本控制可以忽略此位置。
从某种意义上说,使用CMS进行开发要比使用典型的供应商库更脏。通常,您自己的代码取决于库,而该库与您的代码无关。但是,CMS希望成为您的应用程序,并且您自己的代码相互交织。CMS需要自定义其自己提供的文件。您不能只是将CMS文件“拉入”到固定位置,然后忽略该位置。
在这种情况下,我仍然想省略尽可能多的CMS文件。到目前为止,我已经确定了以下策略:
该策略在理论上听起来不错,但在实践中则更为复杂。这有一些并发症:
事实证明,将10,000+个文件路径更改为外部文件中的“链接”不仅是查找替换操作。要保留原始项目的目录结构,必须执行更复杂的映射。
Web服务器要求所有文件都位于同一目录中。使用项目文件链接外部文件可以进行编译,但是您已经将Web根分为两部分。
对于后一个问题,似乎最好的解决方法是执行构建后复制操作。从本质上讲,这比一开始看起来要复杂得多。
在撰写本文时,我开始觉得我应该继续并将所有有效的CMS转储到我的存储库中。感觉很脏,但这要简单得多。在此之前,是否有人对我如何实现目标有任何经验或想法?
重申一下我的问题:如何在版本控制库中排除CMS提供的文件,同时仍将它们包括在项目/构建脚本和Web应用程序根目录中?
我想出了一个理想的策略:
link
MSBuild的必需元素使此操作变得复杂,因此我编写了一个小型控制台应用程序来解析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] 删除。
我来说两句