Sitecore在智能发布上更新了很多项目

Ber*_*Net 9 sitecore sitecore8

我正在使用Sitecore 8.0 Update 5.每次我使用英语以外的语言进行"智能"发布时,我都可以看到数千个项目正在更新.

Job started: Publish to 'web'
Items created: 0
Items deleted: 0
Items updated: 56207
Items skipped: 13057
Job ended: Publish to 'web' (units processed: 69258)
Run Code Online (Sandbox Code Playgroud)

我已经启用了跟踪,在日志中我可以看到Sitecore更新了这些项目的共享字段

##Publish Item: Name=sitecore, Uri=sitecore://master/{11111111-1111-1111-1111-111111111111}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=templates, Uri=sitecore://master/{3C1715FE-6A13-4FCF-845F-DE308BA9741D}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=List Manager, Uri=sitecore://master/{D2833213-CB77-431A-9108-55E62E4E47FD}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
Run Code Online (Sandbox Code Playgroud)

对于树中的每个项目,列表都是这样的.有了dotPeek,我能够在发布管道中找到一个负责确定发布操作的方法:

private void HandleSourceVersionNotFound(Item sourceItem, PublishItemContext context)
{
  Assert.ArgumentNotNull((object) sourceItem, "sourceItem");
  Item targetItem = context.PublishHelper.GetTargetItem(sourceItem.ID);
  if (targetItem != null)
  {
    Item[] versions = targetItem.Versions.GetVersions(true);
    if (versions.Length > 0 && versions.Any(v => v.Language != sourceItem.Language)) || Settings.Publishing.PublishEmptyItems)
      context.Action = PublishAction.PublishSharedFields;
    else
      context.Action = PublishAction.DeleteTargetItem;
  }
  else if (Settings.Publishing.PublishEmptyItems)
    context.Action = PublishAction.PublishSharedFields;
  else
    context.AbortPipeline(PublishOperation.Skipped, PublishChildAction.Skip, "No publishable source version exists (and there is no target item).");
}
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到它检查项目版本,如果有除英语以外的语言版本,它将动作设置为PublishAction.PublishSharedFields.在我的情况下,Settings.Publishing.PublishEmptyItems设置为false,因此不应触发共享字段发布.

我认为在我的解决方案中唯一具有非英语版本的"系统"项目是语言,但是当我查看日志中的一个项目时,我发现了一个非常有趣的事情: Sitecore默认语言

这些似乎是Sitecore"默认"语言.

启用"语言回退"模块时,此行为会导致发布时出现性能问题.(https://marketplace.sitecore.net/en/modules/language_fallback.aspx)

我的问题是:

  1. 这是Sitecore每次发布时推送共享字段的预期行为吗?
  2. 这是Sitecore在只有这些默认语言的版本时推送系统项上的共享字段的预期行为吗?
  3. 如何禁用这些默认语言并删除这些语言的版本?(电源外壳?)
  4. 删除这些默认语言有什么含义?
  5. 有什么我做错了会导致这种行为吗?

UPD.在不同的环境中,它超过100k项目阈值并触发完整的索引重建,这是相当昂贵的操作.(有或没有语言后备)

提前致谢!

Iva*_*anL 1

这是 Sitecore 每次发布时推送共享字段的预期行为吗? => 不,但您找到的代码并不适用于所有项目。当未找到源版本(该项目存在于 Web 中但不存在于 master 中)时,会发生该操作。这就是为什么它要么发布共享字段(如果其他版本确实存在),要么从网络中完全删除该项目(因为它不再存在于 master 中)。

当 Sitecore 仅具有这些默认语言的版本时,Sitecore 在系统项目上推送共享字段是否是预期行为? => 如果没有更深入的调查,我无法回答这个问题,目前我没有时间,对此我很抱歉。

如何禁用这些默认语言并删除这些语言的版本?(Powershell?) => 这些语言未注册,它们之所以显示,是因为这些项目确实有这些语言的版本。因此,如果您删除这些语言的所有系统项目的版本,它们将不再显示。您可以通过代码创建任何语言的版本,甚至是不存在的语言。

删除这些默认语言会产生什么影响? => 使用该语言的任何内容编辑者可能会突然看到英语(或剩余语言),而不是他们首选的 Sitecore 编辑语言。除此之外应该没有关系。

我做错了什么会导致这种行为吗? => 从你到目前为止所呈现的内容中我看不出什么。