停用/重新激活SharePoint功能是否会增加版本?

停用/重新激活SharePoint功能是否会增加版本?,sharepoint,sharepoint-2010,Sharepoint,Sharepoint 2010,我们有一个复杂的场景,需要在内容部署到SP 2010网站集后运行计时器作业。计时器作业会自动停用/重新激活一个品牌功能,该功能负责设置网站集的母版页等 在此过程中,我们进行了几次功能升级,但忽略了对特定网站集中的功能调用.Update()。因此,所有更新的CSS、母版页、页面布局等在该SC上都已过时 奇怪的是,当我在这个SC中检查该功能的版本号时,它显示为最新版本。自定义升级操作显然没有运行和更新文件,因为没有人调用.upgrade() 我的一位同事建议,计时器作业完成的停用/重新激活过程将更新

我们有一个复杂的场景,需要在内容部署到SP 2010网站集后运行计时器作业。计时器作业会自动停用/重新激活一个品牌功能,该功能负责设置网站集的母版页等

在此过程中,我们进行了几次功能升级,但忽略了对特定网站集中的功能调用.Update()。因此,所有更新的CSS、母版页、页面布局等在该SC上都已过时

奇怪的是,当我在这个SC中检查该功能的版本号时,它显示为最新版本。自定义升级操作显然没有运行和更新文件,因为没有人调用.upgrade()

我的一位同事建议,计时器作业完成的停用/重新激活过程将更新版本号,这意味着我不能再调用Upgrade()

  • 这是真的吗?功能的停用/重新激活周期是否会自动更新功能版本号

  • 有没有一个简单的方法来解决这个问题?以编程方式减少版本号的某种方法,然后调用Upgrade()


  • On 1:否。功能停用/激活不会触发更新。请参阅Chris O’Brian的这篇文章:

    功能升级不会自动进行(包括 功能已停用/重新激活)!升级功能的唯一方法 是调用SPFeature.Upgrade(),通常与 QueryFeatures()方法。我接下来要谈的工具是 一个自定义应用程序页面,可帮助您完成此部分–请注意 没有执行此操作的STSADM命令、PowerShell cmdlet或用户界面 开箱即用

    计时器作业是否使用
    Force
    循环激活功能?然后,是的,它将触发功能升级/功能更新。请参见
    SPFeature.Activate中的以下屏幕截图(请参见我的黄色标记):

    为什么功能版本会增加,我不确定。当您拥有一个功能时,安装一个新的功能版本并激活/停用,除非您运行升级,否则功能版本将保持不变,另请参见此相关问题,说明相同的内容:
    我猜你的计时器工作是使用
    强制
    ?否则我不太确定发生了什么


    第2条:不知道是否可以减少版本号,但最安全的方法是创建一个新版本,包括一个大的“清理”功能接收器,该接收器设置所有内容都正确,即检查功能升级的哪些步骤已经发生(例如,创建了新列表,添加了新内容类型),哪些没有发生。根据这一点,只需再次执行尚未执行的相同步骤。对于后一部分,您可以幸运地使用现有代码,因此您只需要“清理”或检查代码。

    经过一些测试后,我发现简单地停用和重新激活该功能将增加版本号,并完全破坏您的升级!我甚至在内容数据库中看到了更新。一旦您停用/重新激活更新的功能,新版本号就会弹出到内容数据库中。当然,升级实际上并不运行,它只是增加版本号

    这意味着,如果您随后调用.Upgrade(),它将无法工作,因为SharePoint认为它已被升级


    为了解决这个问题,我更新了内容数据库中的行,将该特定web的功能版本设置回0.0.0.0,然后我可以运行.Upgrade(),但这并不是一个完全受支持的解决方案。如果其他人有更好的想法,请给出答复。

    我知道升级不会自动进行,这不是问题所在。问题是它是否会自动更新版本号(不运行Upgrade()函数),我认为答案是不查看您发布的反编译源代码。计时器作业没有传递force参数,所以不是这样。我无法解释为什么更新了版本号,但似乎没有调用Upgrade()函数。至于#2,我想我将手动更新所有文件并称之为修复。我更担心的是确保这种情况不会再次发生。我只是做了一些测试,似乎这段代码并不是全部。我创建了一个带有自定义升级操作的测试升级解决方案,并使用PS更新了该解决方案。然后,我检查了其中一个已激活的网站的功能版本,它显示了正确的0.0.0.0版本号。然后我停用/重新激活了该网站上的功能,并在PS中再次检查了该版本,该版本为1.2.0.0!!因此,尽管升级代码尚未运行,但停用/重新激活过程会以某种方式更新版本号。这真让人扫兴。我和一位同事讨论过。在激活/停用功能时,假定使用最新的功能版本。功能没有版本控制,因此SharePoint不知道“在哪个级别激活哪个版本”。只有一个功能定义,说明了正确的版本。功能升级事件接收器操作仅在使用
    .upgrade()
    方法时运行。在激活/停用AFAIK时,将应用取消权限的更新方式(
    VersionRange
    和例如
    ApplyElementManifest
    )。