Sitecore 7.2:如何防止发布操作删除Web库中生成的文件夹及项目
解决Sitecore 7.2中Web库生成文件夹被发布删除的问题
这问题我在Sitecore 7.x项目里踩过好几次坑,核心原因是Sitecore的默认发布逻辑会同步Master和Web数据库的内容——当你发布上级节点时,Sitecore会对比Master与Web中该节点下的所有项,把Web里存在但Master里没有的内容(也就是你直接在Web库生成的文件夹)判定为冗余项,进而删除。下面给你几个可行的解决思路:
1. 配置发布排除规则
直接在Sitecore配置里把目标文件夹加入发布排除列表,让发布流程跳过对它的处理:
- 打开
Sitecore.config(或者你自定义的发布配置文件),找到<publishExclude>节点 - 添加对应文件夹的路径规则,示例:
<exclude path="/sitecore/content/你的上级节点/生成的文件夹名称" /> - 注意:如果生成的文件夹路径是动态变化的,可能需要结合自定义代码动态添加排除规则,或者用通配符匹配(比如
/sitecore/content/你的上级节点/*Generated*)
2. 编写自定义发布处理器
通过自定义处理器拦截发布的删除操作,跳过对目标文件夹的删除:
- 创建一个继承自
PublishItemProcessor的类,示例代码:using Sitecore.Publishing.Pipelines.PublishItem; namespace YourProject.Namespace { public class SkipGeneratedFolderDeletion : PublishItemProcessor { public override void Process(PublishItemContext context) { var targetItemPath = context.Item.Paths.FullPath; // 替换成你生成文件夹的具体路径或识别标识 if (targetItemPath.Equals("/sitecore/content/你的上级节点/生成的文件夹名称", StringComparison.OrdinalIgnoreCase)) { // 取消当前删除操作 context.Cancel = true; } } } } - 在
Sitecore.config里注册这个处理器,放在发布删除阶段的前面:<sitecore> <pipelines> <publishItem> <processor type="YourProject.Namespace.SkipGeneratedFolderDeletion, YourProjectAssembly" /> </publishItem> </pipelines> </sitecore>
3. 把生成内容移到非发布同步区域
如果业务允许,将直接在Web库生成的文件夹放到Sitecore内容树里不参与发布的分支下,比如:
/sitecore/system下的自定义节点(默认发布流程不会同步这个区域)- 专门创建一个不关联发布目标的内容分支
这样发布上级节点时,完全不会触及这些非发布区域的内容,从根源避免被删除。
4. 改用增量发布(辅助方案)
如果你之前用的是完整发布,可以尝试切换为增量发布:
- 增量发布只会同步Master里有变更的项,默认不会删除Web里额外存在的内容
- 局限性:如果上级节点在Master里有内容变更,增量发布仍会处理该节点下的内容,可能还是会触发删除,建议配合前面的排除规则或处理器一起使用
注意事项
- 修改配置文件后需要重启Sitecore实例才能生效
- 自定义处理器要做好测试,避免影响其他正常的发布操作
- 如果生成的文件夹有子项,记得把排除规则或拦截逻辑覆盖到子项
内容的提问来源于stack exchange,提问作者SpaceJump
相关产品推荐
相关产品推荐

