2007年7月4日,星期三

使用功能部署SharePoint文件时的注意事项-幻影/虚假主机

在之前的一些文章中,我谈到了如何将各种SharePoint工件部署为功能。特别是, '将母版页和页面布局部署为功能讨论了部署这些类型的文件的想法(用于发布网站),但是该概念适用于将出现在某种SharePoint列表中某处的任何文件。除了“母版页库”之外,其他示例还包括将CSS / XSLT文件部署到样式库,将图像部署到图片库以及许多其他类似情况。

有时,使用这种方法的人会发现文件更新可能很难应用。该过程涉及使用文件的新版本更新功能,然后重新安装并重新激活功能(通常,功能版本号会增加)。在某些情况下,文件更新成功,而在其他情况下,文件更新没有成功,但是没有错误。

发生什么了?

答案是,如果该文件已被“删除”,则该文件将不会被更新(因此,例如在浏览器中不会看到更改)空灵的'放入数据库。

<StartUnghosting说明>
[无需过多讨论,对于这个概念的新手来说,这可能是一个令人困惑的术语,Microsoft如今使用的次数越来越少-替换术语是“定制的”,通常更容易理解。根据它们到达SharePoint的方式,许多文件最初只会存在于SharePoint前端Web服务器的文件系统上。但是,如果这样的文件是自定义的,例如它已签出并进行了编辑(通过UI,使用SharePoint Designer等)。SharePoint获取文件的副本(现已进行修改),并将其存储在内容数据库中,而不是将更改保存回文件系统中。这是取消宿主的过程。以后每当请求此文件时,都将返回数据库中的修改版本。此体系结构仅在绝对必要时才存储单独的文件副本,从而使SharePoint可以扩展到企业级。]
<EndUnghosting说明>

当使用功能在SharePoint中配置文件时,SharePoint会将文件复制到您指定的功能所在的位置,并将从该位置引用该文件。在许多情况下,它实际上可能是12 \ Template \ Features目录。因此,例如在母版页/页面布局等的情况下,当请求网页时,将从该位置检索这些资源。至少,如果未自定义文件,那就会发生这种情况。

如果在某个时候对文件进行了自定义,则在更新功能时会发生以下情况:文件系统上的文件已更新并反映了更改,但是SharePoint现在返回数据库中的副本,因此更新不被反映。网站!

因此,如果要使用功能作为SharePoint文档库(又名“ GhostableInLibrary”)文件的持续部署策略,则应确保文件可以 只要 以这种方式进行修改。因此,不应通过SharePoint UI或SharePoint Designer修改文件。通常,在开发环境中不是这种情况,但可以在其他环境中强制实施。这意味着可以避免取消宿主,并且SharePoint将继续引用文件系统上的副本。

其他注意事项:

  • 这种方法的另一个优点是,当收回解决方案时,文件也将被删除。
  • 即使没有实际更改的签入/签入操作也将导致SharePoint将文件视为自定义文件,然后从数据库而不是文件系统中检索文件。
  • 在SharePoint Designer中,可以通过右键单击文件并选择“还原为网站定义”来“取消自定义”文件。但是,这显然会导致您丢失对原始版本中文件所做的任何更改!

因此,下次您使用功能部件时,想知道为什么不更新文件,请考虑文件是否已自定义!

20条评论:

匿名 said...

感谢克里斯的帖子。很有道理。要爱定制页面!

丽莎说过...

我们已经将内容从MCMS迁移到MOSS,这似乎具有将页面布局复制到数据库的效果。页面布局没有“还原到网站定义”功能-是否有其他方法可以“取消组合”页面布局?

克里斯·奥'Brien说过...

丽莎

我没有专门研究CMS 2002迁移方案(尽管希望很快会出现在客户端上)。

我希望页面布局在数据库中。唯一的方法不是使用功能来部署页面布局,但是CMS迁移并非如此。

如果某文件系统上有相应的版本,则您将只能取消自定义文件。

HTH,

克里斯。

丽莎说过...

但是12个配置单元中有一个对应的文件版本-我们已经通过功能迁移和部署了页面布局。问题是让Sharepoint查看文件版本而不是数据库版本-“取消开销”页面布局?

克里斯·奥'Brien说过...

好的-在这种情况下,应该有可能,前提是该文件的数据库记录具有指向正确物理文件的链接。

我会尝试使用SPD来“还原”文件(右键单击左窗格中的文件,应该有一个选项),或者也可以使用SPFile.RevertContentStream()做到这一点。

HTH,

克里斯。

匿名 said...

克里斯 -

我也在您的专题文章中问过这一点:

您如何知道是否已取消托管特定文件?我的Intranet网站在SharePoint Designer中打开时,未显示任何自定义页面的自定义图标,但是我对功能的部署表现得好像是这样:功能文件夹中的文件已更新,但主文件夹中的文件已更新。该网站上的页面画廊不是。

这是一个内容发布网站,现在有很多页面正在使用我要更新的布局,因此我不想使用以前的蛮力方法,即使用布局删除所有页面,然后删除布局等等。

任何想法,将不胜感激。

克里斯·奥'Brien说过...

科林

希望您现在已经看到了,但是我对此发表了评论 母版页/页面布局部署为功能未更新.

HTH,

克里斯。

泰勒·福尔摩斯说过...

克里斯,

当需要部署与web.config位于同一目录中的配置文件时,我很幸运吗?用于部署未托管文件的所有功能语法似乎都希望将其放在\ TEMPLATE \ FEATURES \ FeatureName目录中。另外,它们可能会提供内容的URL(我不想这样做)。我见过人们设置计时器作业以在资源文件周围进行复制,但是没有更简单的东西吗?

我要复制的文件是企业库中的entlib.config。

我很想听听您的意见。

最好,
泰勒

克里斯·奥'Brien说过...

嗨,泰勒,

是的,不幸的是,功能部件/解决方案框架并不能真正满足Web应用程序目录中的文件。解决方案中,功能中只有“模块”元素(如您所说,已部署到功能文件夹),或者“模板文件”部署到\ 12 \ Template目录)和“ RootFile”(部署到\ 12 \目录)。

一种选择是在该文件的功能接收器中编写代码,或者使用其他脚本方法来访问该位置。我知道这很烦人。

HTH,

克里斯。

死亡卷说过...

克里斯,你好

我对SharePoint Designer和页面自定义有疑问。

我已经为列表创建了自定义页面’■NewForm.aspx,EditForm.aspx和DispForm.aspx。这些是使用SharePoint Designer创建的。现在,我的要求是将我的网站与这些自定义页面一起打包为功能。由于这些页面中包含的数据表单Webpart具有相关列表的硬编码GUID,因此,这些SPD生成的页面在我安装功能的目标计算机中无法正常工作,因为这些ID是在供应站点时动态分配的。请让我知道将这些SPD生成的文件部署为功能后如何使它们工作。

I’已成功将以下SharePoint工件打包为功能;唯一的问题是SPD定制页面。

内容类型
清单定义
列出实例
功能接收器

请帮忙

谢谢,
-阿伦

克里斯·奥'Brien说过...

嗨,阿伦,

这是个好问题。我个人认为解决方案是确保您的列表在所有环境中都具有相同的GUID。这样就无需以某种方式“修复” DataForm / ListView Web部件等中的列表GUID。如果使用了内容部署(从标准功能或 SharePoint内容部署向导)以首先转移列表,它们将具有相同的GUID(需要在我的工具中选中“保留对象ID”复选框)。

就个人而言,这是我首选的传输文件方式, 内容 项,而不是文件系统项。功能虽然很棒,但是IMHO更适合一次性配置,而不是像WCM这样需要可升级性的场景。

HTH,

克里斯。

杰森·阿佩吉斯(Jason Apergis)说过...

克里斯,

我正在通过功能发布一些发布页面。我遇到的问题是母版库中的属性未更新。因此,我更改了aspx并推出了功能,我看到了所有更改。

但是,在属性中,我尝试更改诸如“标题”或“版本”之类的内容,并且该更改未反映在主库列表中。

有什么想法吗?当我推出新的更新发布页面.aspx时,我希望能够支持版本控制。

谢谢,
杰森

克里斯·奥'Brien说过...

@杰森

猜测您正在更新功能中的Module / File元素-我不建议您尝试以这种方式对事物进行版本控制,因为该框架并非旨在支持该功能。我认为您可以以这种方式更新元数据的唯一方法是,如果在重新激活功能之前删除了文件,但是显然这在现实生活中是不可能的。

我的建议是改为在主源代码控制系统中对aspx文件进行版本控制。

HTH,

克里斯。

尼克·哈德利说过...

克里斯,你好
首先要为内容部署工具欢呼-始终使用它,它对于工具箱来说是不小的财富!

I'我希望您可能能够阐明'quirk'通过功能部署的文件数量。

通过功能部件部署页面时,我发现该页面引用的页面布局更新不会级联到这些功能页面。通过UI或其他API创建的页面将反映更改,但是功能部件部署的页面被锁定到用于部署它们的原始物理文件中。更新此文件也没有任何区别...

例如
<File Url="default.aspx" Name="summary.aspx" Type="GhostableInLibrary"IgnoreIfAlreadyExists ="True">
<Property Name="PublishingPageLayout" Value="〜SiteCollection / _catalogs / masterpage / somelayout.aspx,布局说明" />
...其他属性...
</File>

但是,将页面分离并重新附加到布局似乎'fix'页面布局连接。这不是'如果部署了很多这样的页面,那么是否有很多解决方法,所以我希望您能够提出这种现象背后的原因或更好的部署方法?

克里斯·奥'Brien说过...

嗨尼克,

对您在此处报告的内容感兴趣-是指您使用功能来部署页面布局还是页面 实例,并且在执行解决方法之前,布局更新不会反映在页面实例中?

不确定我对此有什么解释,但是我很感兴趣!根据您的解决方法,如何将页面“分离并重新附加”到布局?您是说做“还原到网站定义”吗?

干杯,

克里斯。

尼克·哈德利说过...

克里斯,你好

是的,对第一段的问题。正在使用两种功能,一个网站范围的网站用于页面布局,一个网站范围的网站用于页面实例。

实际上,我使用SharePoint Designer进行了测试“修复”,以将页面从布局中分离/重新附着。如果您通过一个RevertContentStream()也可以使用 reghost命令 像加里的。比较SPFile属性以查看哪些更改不是非常有成果...

克里斯·奥'Brien说过...

缺口,

感谢您的跟进-这很有趣。我想不出发生这种情况的任何原因,但显然是这样。

我的建议是问Waldek在执行此操作时是否遇到了它-请参阅 http://blog.mastykarz.nl/provisioning-publishing-pages-features-declarative-markup/.

我将尝试并在那里进行调查!

干杯,

克里斯。

匿名 said...

你好

我想你混了鬼和无鬼。自定义文件意味着对文件进行重影。取消部署后未更改的文件。

另一个选择是,在部署WSP软件包之前,编写一个littel命令行工具来取消托管所有幻影文件。那就是我们正在做的...

科尔,彼得。

尼克·哈德利说过...

干杯克里斯。我没有看过那个帖子,但这正是导致这种行为的确切情况。我已经向Waldek发布了一个问题,所以我们将看看他是否遇到了这个问题。

Neamat said...

I'我只是在几分钟后发送了一个问题。.我只是想补充一点,说我'm也使用匿名访问网站,以防您的回复有所不同。

I'd非常感谢您的回复。。预先感谢您