显示带有标签的帖子 特征. 显示所有帖子
显示带有标签的帖子 特征. 显示所有帖子

2010年6月23日,星期三

功能升级(第1部分)- 基本的s

在本系列文章中:

  1. 功能升级(第1部分)– 基本的s (this article)
  2. 功能升级(第2部分)–一个样本玩
  3. 功能升级(第3部分)–引入SPFeatureUpgrade套件
  4. 功能升级(第4部分)– advanced scenarios
  5. 功能升级(第5部分)–使用PowerShell升级功能

在最近的文章中’ve谈到了 版本控制可升级性 的SharePoint 2010中的功能框架。I’我们最近在会议演讲(SharePoint Evolutions)中以及即将出版的Real World 的SharePoint 2010书中的一章中都讨论了此主题。–但是我也想在这里涵盖一定程度,因为我’请注意,并不是每个人都来参加谈判或会买这本书。我也想介绍一个工具’已在Codeplex上发布,如果您决定使用功能升级,这可能会很有用-下一篇文章中会对此进行更多介绍。

什么时候使用功能升级?

功能升级在以下情况下很有用(尽管可能还会更多!):

  • 对现有网站集或网站或其中的某些内容进行更改– for example:
    • 对现有项目进行更改,例如向内容类型/列表添加新列
    • 向现有网站添加新元素,例如新清单
    • 任何涉及使用API​​对网站进行操作的更改,例如使用代码修改许多站点的导航设置
  • 向现有功能中添加新功能,而不是创建新功能–也许是因为 ’最合乎逻辑的分解
  • 在此期间,某些功能将被多次升级的地方’s lifecycle, possibly in a situation where the changes 是 不 rolled out to every site, or 是 rolled out 在 不同 times

如果你’重新修改或扩展使用“功能”开发的功能(跨多个站点或仅一个站点),那么“功能升级”可能是展开更改的好工具。这部分是由于新 QueryFeatures() methods in the API, which provide a convenient collection to iterate over to apply the changes. When the changes themselves 是 also implemented in code, in the past developers may have put their implementation in the 功能激活 事件,然后确保停用/重新激活功能-但这是随身携带的,因为您可能在其中有其他代码,这些代码从不打算重新运行。功能升级旨在解决此类问题。

功能升级是什么样的?

Microsoft向功能框架添加了一些新的XML,以支持功能升级。创建功能的新版本时,这可能涉及:

  • 增加现有功能的版本号(这对于功能升级是必需的)
  • 添加一些新的XML为功能定义新项目
  • 编写一些代码以在新代码中执行 功能升级 功能接收器中的事件
  • 上述所有的

这里’s是一个升级功能的示例,突出了一些可能性:

<?xml version="1.0" encoding="utf-8" ?>
<特征 xmlns="http://schemas.microsoft.com/sharepoint/" ="1.0.0.0">
  <UpgradeActions>
    <版本范围 BeginVersion="0.0.0.0" 最终版本="0.9.9.9">
      <ApplyElementManifests>
        <ElementManifest Location="SomeFunctionality_Iteration2\Elements.xml" />
      </ApplyElementManifests>
      
      <AddContentTypeField ContentTypeId="0x010073f25e2ac37846bb8e884770fb7307c7"
          FieldId="{536DC46C-DC26-4DB0-A97C-7C21E4362A85}" 下推式="TRUE"/>
      <AddContentTypeField ContentTypeId="0x010073f25e2ac37846bb8e884770fb7307c7"
          FieldId="{4E7A6719-011A-47EA-B983-A4941D688CA6}" 下推式="TRUE"/>
 
      <CustomUpgradeAction 名称="UpdateSomething">
        <Parameters>
          <Parameter 名称="PassSomeValue">This 是 a string</Parameter>
        </Parameters>
      </CustomUpgradeAction>
    </版本范围>
</特征>

[边注] 请注意,以上XML实际上是完整feature.xml文件的子集 –使用功能升级时,有必要退出Visual Studio 2010中的功能设计器并直接编辑XML文件(老式的方法!)。这样做时最好的选择是让VS 合并 您使用其管理的XML进行的更改。打包WSP时,由VS管理的XML与您的自定义XML合并– 如果 you could 这个 XML隔离位(您可以 ’t,因为您永远不需要),这可能看起来像这样:

<特征 Title="Some functionality" Id="cae1f65d-0365-42e9-9907-356c7983e902" Scope="Site">
  <ElementManifests>
    <ElementManifest Location="SomeFunctionality\Elements.xml" />
    <ElementManifest Location="SomeMoreFunctionality\Elements.xml" />
  </ElementManifests>
</特征>

Essentially Visual Studio will still manage our 元件manifests, but 任何 XML around 特征 upgrade needs to be edited by hand. Walking through the box containing the main XML, we 能够 see:

  • 该功能有一个 属性 (to be incremented each time the 特征 是 upgraded)
  • A 版本范围 元件defining the upgrade steps to process for a particular upgrade i.e. when an existing 特征 实例BeginVersion最终版本 使用更新的功能升级 定义
  • 一个 ApplyElementManifests 元件– 这个 是 used to add new elements to an existing 特征. When the 特征 是 upgraded, 任何 items (e.g. 内容类型, modules etc.) will be provisioned according to the 元件manifest(s)
  • AddContentTypeField 元件–对于将字段添加到现有内容类型的常见任务(这是非常常见的升级方案),这是一种便捷的机制。注意 下推式 属性 – 这个 是 hugely useful as it does the work of pushing down the change from the site content type to 所有 list 内容类型 在 site (and therefore, 所有 lists), 所有 没有 任何 code.
  • CustomUpgradeAction 元件–这使开发人员可以指向一些要运行的代码以执行升级操作。鉴于您可能需要在升级中进行大量操作,因此通常需要这种方法。在‘pointing’,实际上代码将永远是 功能升级 方法在接收器中,但在 名称 属性 是 passed to 这个 method to identify which code to run (along with 任何 parameters). Hence your 功能升级 方法可能包含 开关 语句,如果要与上述XML相匹配,它将看起来像这样:
    上市 override 虚空 功能升级(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
    {
        网页 parentWeb = (SPWeb)properties.Feature.Parent;
     
        开关 (upgradeActionName)
        {
            case "UpdateSomething":
                string someValue = parameters["PassSomeValue"];
                // do some stuff.. 
                break;
            default:
                break;
        }
    }

In addition to these possibilities there 是 one further declarative 元件– 地图文件. 地图文件 允许您指向未自定义文件的位置,这将从字面上更新数据库中的指针。您在其中的确切方案’d想使用它(而不是简单地部署原始文件的更新版本)不幸地逃避了我的小小的想法–我能想到的唯一一件事就是,如果它允许以DelegateControl之类的方式在不同的范围(例如Web)上进行重新指向,那将非常有用。一世’我无法验证这一点,因为我无法 地图文件 工作,我认识的其他人(@jthake)也没有尝试过。那好吧。

退一步看看这些工具,它’很容易想到,如果你不这样做’碰巧将字段添加到内容类型,那么实际上’重新看代码。然而 ApplyElementManifests 通常是某些情况下所需的全部一组新字段+一种新的内容类型+一种新的发布页面布局。

笔记

These 是 some ‘fundamental’ things to know – I’在以后的文章中将讨论一些更高级的方面:

  • 功能升级不会自动发生(包括停用/重新激活功能时)! 升级功能的唯一方法是致电 SPFeature.Upgrade(), 通常与 QueryFeatures() 方法。我的工具’接下来要讨论的是一个自定义应用程序页面,可以帮助您完成本部分–请注意,没有STSADM命令,PowerShell cmdlet或用户界面可以立即执行此操作。
  • 版本范围 元件, BeginVersion 具有包容性,但 最终版本 不是。换句话说,如果当前版本号等于或大于,Feature实例将被升级。 BeginVersion ,且少于  最终版本。
  • Upgrade instructions 是 executed in the order they 是 defined in the file.
  • 如果功能没有 属性,版本为0.0.0.0。
  • Enabling logging 能够 help diagnose 任何 是sues. 在ULS设置中,‘SharePoint基础’类别,请将以下子类别设置为“详细”以查看更多信息:
    • 功能基础架构
    • 领域
    • 一般

概要

的SharePoint 2010 introduces additional lifecycle management capabilities with the ability to version 和 upgrade 特征s. There 是 some declarative elements such as ApplyElementManifestsAddContentTypeField, 但是使用 CustomUpgradeAction 元件allows you to shell out to code where necessary. The only way to actually perform upgrade on a 特征 once it 具有 been updated 是 to call SPFeature.Upgrade() 在应该升级的功能的每个实例(例如,每个网站)上– new QueryFeatures() 方法可帮助您找到可以升级的功能实例。一世’已经编写了一个自定义应用程序页面,该页面有助于管理此过程,将在下一次讨论。

张贴者 Chris O'Brien 23:43 27 comments 链接到这篇文章  

标签: ,

2009年4月23日,星期四

修复我的Config Store框架和列表设置提示

最近有一些关于我的问题的报告 配置存储 解决方案,它提供了一个使用SharePoint列表存储配置值的框架。如果您使用的是Config Store,那么您肯定会对本文感兴趣,但是我也从中获得了一些我想传递的关于列表配置的一般提示。我要感谢我以前的公司的Richard Browne(无博客) cScape, as the fix 和 several of the tips have come from him - 一种s well as alerting me to the problem, he also managed to fix it before I did, so many thanks 和 much kudos mate :-)

配置存储问题

在某些情况下,“配置存储”列表中的字段不可编辑,因为它们不再出现在列表编辑表单(EditForm.aspx)中。因此,除了具有4个可编辑字段外,仅“ Config name”字段以以下形式显示:

ConfigStoreMissingFields

我还没有完全弄清楚模式,但是我 认为 仅当您在安装了10月或12月累积更新的服务器上配置列表时,才可能出现此问题-否则这是Windows 2003和Windows 2008环境之间的差异(这将更加奇怪)。无论哪种方式,似乎都改变了在某些地方处理XML的方式。这就是为什么在早期版本中未发现此问题的原因。

I 之前曾见过此问题-但仅在使用Content Deployment(例如,使用 内容部署向导)-原始的“来源”列表总是很好。我们设法通过编写一些代码将这些字段从内容类型“重新添加”到列表中来解决此问题,因为这些字段实际上始终出现在内容类型上,并且数据仍被纠正存储。每次我们部署列表时都必须运行此代码,这很烦人,而不是关键,但是我想深入了解-但是,在发现某些人以“正常”使用方式遇到此问题时,它变得更大了问题。

原因

我一直都知道问题将归结于配置XML中的一个错误,但是由于我在以前的场合中一直在寻找它,所以我知道这是我所看到但没有看到的东西。在我的案例中,Richard发现我在ContentType元素下的FieldRef元素中使用了错误的值-我错误地认为'Name'属性需要与为该字段赋予的'StaticName'属性匹配;文档说此属性包含字段的内部名称。所以我的FieldRefs看起来像这样:

<ContentType ID="0x0100E3438B2389F84cc3965600BC16BF32E7" 名称="Config item" 
Group="Config Store 内容类型" Description="Represents an item in the config store." ="0">
<FieldRefs>
<FieldRef ID="{33F5C8B4-A6BB-41a4-AB24-69F2152974C5}" 名称="ConfigCategory" Required="TRUE" />
<FieldRef ID="{BD413479-48AB-41f5-8040-918F32EBBCC5}" 名称="ConfigValue" Required="TRUE" />
<FieldRef ID="{84D42C64-D0BD-4c76-8ED3-0A9E0D261111}" 名称="ConfigItemDescription" />
</FieldRefs>
</ContentType>

..以匹配如下所示的字段:

<Field ID="{33F5C8B4-A6BB-41a4-AB24-69F2152974C5}"
名称="Config category"
DisplayName="Config category"

StaticName="ConfigCategory"
....
....
/>

The CORRECTED version looks like 这个 (note the change in value for the 名称 属性 of FieldRefs):


<ContentType ID="0x0100E3438B2389F84cc3965600BC16BF32E7" 名称="Config item"
Group="Config Store 内容类型" Description="Represents an item in the config store." ="0">
<FieldRefs>
<FieldRef ID="{33F5C8B4-A6BB-41a4-AB24-69F2152974C5}" 名称="Config category" Required="TRUE" />
<FieldRef ID="{BD413479-48AB-41f5-8040-918F32EBBCC5}" 名称="Config value" Required="TRUE" />
<FieldRef ID="{84D42C64-D0BD-4c76-8ED3-0A9E0D261111}" 名称="Config item description" />
</FieldRefs>
</ContentType>

因此,我从中学到的主要知识是要记住 the 'Name' of the FieldRef 属性 needs to match the 'Name' of the Field 属性 -这么简单。为什么以前能奏效?不幸的是不知道。

但是,我还拾起了一些我不知道的东西,一部分来自Richard(这个家伙需要博客!),一部分来自其他阅读/实验。

有关列表配置的一些便利知识

  • 要使列表上的字段为必填字段,“ Required”属性必须为“ TRUE”。不是'True'或'true'-这是预配框架对于该6选择布尔值感到不安的情况之一;-)
  • FieldRefs至少需要一个ID和Name(必须与“ Field”声明中的值匹配),但是您可以在此处覆盖某些其他内容,例如DisplayName-这反映了UI中可能出现的情况。
  • You don't have to include the list .aspx files (DispForm.aspx, EditForm.aspx 和 NewForm.aspx) in your 特征 如果 you use the 'SetupPath' 属性 in the 'Form' 元件in schema.xml (assuming you don't need to associate custom list forms).
  • You 能够 use the 'ContentTypeRef' 元件to associate your content type with the list (specify just content type ID), rather than using the 'ContentType' 元件which needs to redeclare 所有 the FieldRefs.
  • 从schema.xml的“字段”部分删除所有默认的“系统”字段是安全的

除了这些技巧之外,我发现的最好的是Oskar Austegard的 苔藓:可怕的schema.xml 显示了如何剥离 schema.xml中的内容。我还没有尝试过,但是我确信这将是我声明式提供的下一个列表的起点。如果您对列表设置的细节感兴趣,我强烈建议您阅读它。

快乐的XMLing

张贴者 Chris O'Brien 00:42 8 comments 链接到这篇文章  

标签: ,

2007年11月1日,星期四

母版页/页面布局部署为功能未更新

以来 将母版页和页面布局部署为功能 一直是该博客上评论次数最多的文章,而且一些张贴者似乎也遇到了同样的问题,我想写一篇简短的文章,其中提供一些我的经验信息。

因此,这是一个非标准的帖子,如果不影响您,请随时进行调整;-)

无论如何,我决定再做一些测试,看我是不是做错了什么,或者我做的事情是否与遇到问题的人有所不同。我的测试基本上是使用母版页和页面布局(通常与自定义内容类型相关联)建立一个发布站点,然后进行更新过程。这是我发现的:

  • 对文件(12文件夹外部)进行更新,然后XCOPYing这些文件以覆盖12 \ TEMPLATE \ 特征 \ MyFeature \目录中的文件,则成功更新了站点。 无需停用/激活功能。
  • 用一个 解决方案包 部署文件(使用功能时,这通常是我在服务器场环境中所做的事情)- 当我升级解决方案(stsadm -o upgradesolution)时,这再次正确更新了站点。这是可以预料的,因为在下面发生的事情与先前的测试完全相同。 (但是,我还注意到,即使解决方案升级完成后,目录有时也会消失,或者存在,但仍被另一个进程锁定,这意味着即使在Windows资源管理器中也无法访问文件-这有点恼人,但运行解决方案再次升级始终成功。)
  • after causing the file to be customized (e.g. modifying or even just checking out with SPD), 任何 subsequent updates to the files via the 特征/Solution did appear on the site (though further updates in SPD 是 fine).

In short, 这个 是 所有 what I expected. Assuming the file 具有 不 been customized, 任何thing which updates the copy on the filesystem will cause an update to the site. If it 具有 been customized, updates on the filesystem will 不 (since the file 具有 now been added to the content database, 和 the filesystem version 是 no longer used). 如果你've 不 come across 这个 before, 使用功能部署SharePoint文件时的注意事项-幻影/虚假主机 可能会有所帮助。

因此,我猜测如果覆盖Feature文件时母版页等没有更新,那是因为文件已经以某种方式进行了自定义。不幸的是,要发布文件并不容易-对于其他文件,SharePoint Designer在资源管理器视图中的文件旁边提供了一个方便的蓝点(如果已自定义文件),但是对于母版页/页面布局,这种情况不会发生。可以在下面的AllItems.aspx文件旁边看到蓝点(单击放大):



不幸的是,这也意味着恢复到文件系统上的文件也不是一件容易的事(我们不能像其他SharePoint文件一样,右键单击SPD中的文件并选择“重置为网站定义”)。因此,如果您确实想保留文件系统中引用的页面布局(例如,因为性能至关重要),但这会很麻烦,但是您最终处于这种状态。不过,可以使用API​​还原文件。我不需要自己执行此操作,但是要检查的属性是 SPFile.CustomizedPageStatus 如果返回 SPCustomizedPageStatus.Customized,然后 SPFile.RevertContentStream() 可以使用方法-这将导致SharePoint从今以后使用文件系统上的版本(尽管 请注意,您可能会丢失一些已进行的更新 after the file was 取消托管(自定义)-还原后,您需要将它们重新应用到文件系统文件。请记住,请勿为此使用SPD,否则您将回到开始的地方!)

到目前为止,(合理地)简单明了。

但是,一个海报(代尔彭特)有一个 关于使用Web部件更新页面布局的有趣问题。据我所知,将所有页面实例更新为具有Web部件 在Web部件区域 by updating the layouts will 不 be possible. This 是 because 如果 web part zones 是 used, the web part 是 associated with the page 实例 而不是页面布局。确实,这可以成为体系结构的力量。它 可能会:

  • 从页面布局创建页面实例时,将默认Web部件添加到区域中。这可以通过使用“功能”部署页面布局并使用 AllUsersWebPart 标签。但是,这不会影响已经创建的页面。
  • 通过将Web部件直接添加到SPD中而不是区域中的页面标记中,将Web部件添加到所有页面中。当然,这意味着Web部件的设置只能由SPD中的页面设计者修改,而不能由站点用户修改。
  • 使用API​​遍历站点中的所有页面,以使用SPFile.GetLimitedWebPartManager()添加/修改Web部件。不用说,这是一种需要在生产中进行大量维护和计划的操作!

如前所述,由于这些问题,Web部件区域体系结构通常不是WCM网站开发等方案的最佳选择,因为在这里我们希望所做的更改能够应用于使用布局的所有页面。

希望这已经有用。与往常一样,如果您与此处详细介绍的经验有所不同,请发表评论,我一定很想听听。

[I also wanted to say sincere apologies to the commenters on the original post (and 任何 others I've been slow in replying to) that it took a couple of weeks for me to come back. Something to do with my project going live 和 moving house 在 the same time, hopefully normal service now resumed ;-) ]

2007年10月29日,星期一

STSADM导出,内容部署,内容迁移API,功能/解决方案-比较部署选项

早在5月,我写了一篇标题为 的SharePoint部署选项:功能还是内容部署?,其中讨论了有关在SharePoint网站开发过程中将资产从开发转移到生产(或介于两者之间的环境)的“正确”方法的一些想法。现在,我从事其他项目并在每个项目上有意识地使用了不同的部署方法,我很快得出结论,部署的“正确”方法会因情况而异。因此,我认为可能有用的是对整个部署选项范围进行分析,并提供有助于您更轻松地决定如何完成此过程的关键步骤的信息。

因此,让我们看一下这些选项及其特征。顺便说一句,所有选项都不使用“破坏性同步”,其中 所有 导入之前先删除内容。

使用STSADM导出/导入

描述:

使用STSADM命令生成文件(导出),然后可以将其传输到目标以进行导入。将内容从一个地方移动到另一个地方的最简单方法之一,尽管不太可能适合作为连续部署机制。例子:

stsadm.exe -o导出-url http:// localhost-文件名C:\ Export.cab -includeusersecurity-版本4-覆盖

stsadm.exe -o导入-url http:// localhost / sites / newsite -文件名C:\ Export.cab -includeusersecurity

适用于:

  • 将整个站点/网站作为一个整体移动
  • 快速部署测试
  • 父网站(可以进入不同的网站集)

注意事项:

  • 目标上的内容将被覆盖(如果已存在)
  • 粒度仅限于网络
  • Object GUIDs 是 不 preserved (so some things will need to be 'fixed up' e.g. 任何thing that references a list by GUID - ListViewWebPart, using lists with InfoPath forms)
  • Not a backup/restore tool - 一种lthough it's the option which 是 most like backup/restore, things like alerts, audit trail, recycle bin items, security state, workflow tasks/state 是 不 exported
  • 不交易

通过管理中心使用内容部署 *

描述:

通过Central Admin('/_admin/deployment.aspx')中的“内容部署路径和作业”进行配置。路径定义了源/目标和身份验证详细信息,特定的作业确切地定义了应部署的内容以及频率。快速部署功能允许具有权限的用户指定重要内容,这些内容应比管理员配置的现有作业计划更定期地部署(每15分钟部署一次快速部署项目)。

适用于:

  • 定期移动整个网站集/网站,例如在创作/制作或创作/登台/制作拓扑中
  • 仅部署增量更改,通过电子邮件通知成功/失败
  • 允许网站所有者通过“快速部署”对内容部署进行一些控制
  • 自动部署选择要部署的内容的依存关系,即使在不同的站点中(例如页面布局/内容类型/站点列/引用的图像等)
  • Automatically transferring 部署 package to the target environment (via HTTP[S])
  • 不交易

注意事项:

  • 目标上的内容将被覆盖(如果已存在)
  • 粒度仅限于网络
  • 网站内容(例如页面/图像)和网站“基础结构”(例如母版页,页面布局)之间没有区别
  • Object GUIDs 是 preserved
  • 空白网站模板应用于 来源和 目标网站集(请参阅 http://support.microsoft.com/kb/923592)
  • 也不是备份/还原工具(请参见上文)

使用内容迁移API *

涉及编写使用内容迁移API(称为PRIME)导出然后导入内容的代码-该API易于使用。

适用于:

  • 完全灵活的部署选项
  • 对部署内容进行细粒度控制(直至项目级别)
  • 保留对象GUID的能力(因此列表GUID不需要修复)
  • 能够选择安全性,版本控制和用户角色的选项

注意事项:

  • 空白网站模板应用于 来源和 目标网站集(请参阅 http://support.microsoft.com/kb/923592)
  • 不交易
  • 也不是备份/还原工具(请参见上文)
  • 需要开发技能才能编写代码

使用功能/解决方案

此博客的重点 几篇文章。涉及定义XML配置文件,SharePoint用来以正确的方式在目标上添加工件。这可能比仅在SharePoint Designer中进行开发要复杂得多,但可以在解决方案的整个生命周期中进行更好的管理。

适用于:

  • 迭代开发/部署
  • 部署程序集和文件系统文件(其他方法都不能解决此问题)
  • 能够使用解决方案包将程序集/文件系统文件部署到服务器场中的所有服务器
  • 持续整合的可能性

注意事项:

  • 开发人员负责评估和部署依赖项(例如基础内容类型)。
  • 通过功能部署的内容类型,列表定义,站点列等的更新必须使用API​​完成-修改原始功能文件,然后不支持重新配置
  • 由于缺乏当前工具的帮助,可能会非常耗时

* 有关使用Content Deployment或Content Migration API的一些其他说明:

- 一种ppropriate 特征s will 自动ally be 活性 在目标上,但必须存在(即已安装)它们才能进行内容部署(目标首次启用时,不应在目标上启用N.B.发布功能)

-不应将带有RetainObjectIdentity选项的Content Deployment或内容迁移API与STSADM -export / import结合使用,因为后者将分配新的ID!

因此很明显,在选择如何进行项目部署时可以考虑几个方面。在很多情况下,功能/解决方案不是最合适的选择,我倾向于使用内容迁移API,这主要是因为其他任何选项都没有提供灵活性。当然,这的确意味着编写代码,但是正如我上次提到的那样,我将很快分享我编写的微型应用程序,因此您不必这样做!

一些有用的参考:

2007年10月14日,星期日

使用STSADM导出或内容迁移API进行部署

有 focused on 部署使用 特征s 对于几篇文章, 早在五月,我写了一篇标题为 的SharePoint部署选项:功能还是内容部署?,它探讨了围绕 SharePoint项目的部署策略。可以使用多种方法 将SharePoint工件和内容从一个地方移动到另一个地方,我认为可以说部署方面仍然存在一定的混乱  适用于许多SharePoint开发人员。我当然不会声称获得所有答案,但是上周交付了另一个项目之后,似乎是回顾一些经验和交流的好时机。 reflect 在不同的方法上。

不用说,就总体部署策略而言,最好的主意是 拥有一个!我看到许多来自 人们接近 在开发阶段结束时,询问他们应该如何将工作转移到 实时服务器。我发现离开部署直到 end of the project, is that none of the approaches are 完全地 直接(尤其取决于您的解决方案组成),等等 if your project 是 准时交货很重要 to 知道您可能需要执行哪些步骤。

附带说明一下,让我们在这里阐明一些可能引起混淆的术语:

  • 内容部署-可用于移动内容的“路径和作业”功能, surfaced by 管理中心中的屏幕
  • 内容迁移API-基础API(有时称为PRIME),实际上用于两个STSADM导出 除了“管理内容和结构”工具以及从CMS2002迁移而来的内容部署(以略有不同的方式)

这次,我决定使用内容迁移API来部署我们的解决方案,并且它可以正常工作 适合我们的情况。这与我过去完成的功能开发形成了对比,选择这种方法的主要原因是: 

  • 无需迭代部署 - 尽管我们的整体项目是分阶段进行的, 对于这个组件,我们能够 开发解决方案,然后部署我们开发环境中的所有内容。 (这种方法将 not work 对于后续部署,因为我们的客户在实时网站上生成的内容将在每次部署中被覆盖-有关更多内容,请参见下一篇文章。)
  • 保留对象GUID的能力 - 因为我们的项目大大简化了部署,因为 如果我们的列表在部署时被分配了新的GUID(与STSADM导出/导入一样),则引用这些列表的组件(ListViewWebPart,InfoPath表单等)将无法正确连接 the 部署 target. This would add a lot of "fix-up" steps to 部署 process 如果 we were to use STSADM export.
  • 没有从源Central Admin到目标Central Admin的直接HTTP访问 -这是在Central Admin中使用Content Deployment功能(路径和作业)的先决条件,但是我们需要的是可以复制到实时服务器中的文件。内容迁移API提供了此功能,还为大量数据提供了压缩选项。
  • 自动 包含数据库 dependencies - 与STSADM导出(但不包括功能)一样,SharePoint将分析并收集所有依赖项,例如字段,内容类型,母版页等。 us.

该API使用起来相当简单,您可能已经看到 斯特凡的系列精彩文章 就此主题而言 - these serve as 一个很好的伴侣 MSDN文档.

重要的是要记住,任何非数据库资产 (例如用户控件,程序集等)需要手动部署到目标环境-使用STSADM导出或 内容迁移API。就我们而言, 现场环境是一个单一的 server (and 版本控制将由我们的主要源代码控制系统处理),这些由XCOPY部署,因为 deployment using 解决方案包 did 不 offer 任何 compelling advantages here. 

在讨论文件系统文件时,请务必注意,在执行(例如)STSADM之后,如果在目标计算机上看到404错误, 导入,很可能您忘记了部署用户控件之类的东西。 404实际上来自引用的文件而不是实际的页面,因此请不要假定导入有问题 - a 检查“查看所有网站内容”,导入日志可能会确认所有网站页面均存在!

希望这为您可能没有考虑的方法提供了一些思考的方法。我想我的主要意思是,尽管STSADM导出非常简单,但由于GUID更改,它可能无法完全解决所有部署难题。在接下来的文章中,我将提供更直接的部署策略比较(扩展“功能或内容部署”文章),并分享我的微型应用程序,该应用程序为内容迁移API提供了前端。

[P.S. 以来re apologies to people who left 评论 whilst I was on holiday which 是 still 不 published - I'll publish these 和 respond over the next few days.

C。]

2007年8月12日,星期日

网站定义-网站创建过程中的自定义代码

这是三篇文章系列中的第二篇,我的目的是展示如何使用您自己的API代码自定义网站创建过程(称为网站配置)。完整的介绍和系列内容可以在以下位置找到: http://sharepointnutsandbolts.blogspot.com/2007/07/article-series-custom-permissions-with.html。我正在使用的示例自定义如下: any 使用定义创建的网站 应该使用一组特定的权限,而不是简单地遵循继承父网站权限的默认行为。由于无法使用标准的网站定义来完成此操作(就像您可能要执行的许多其他操作一样),因此需要使用API​​。

但是,今天 重点不是我的示例的权限细节,而是更多 how generally to 添加您自己的代码,该代码将在网站配置过程中运行。最好的是,如果您了解SharePoint功能,则实际上非常简单。

There 是 many reasons why you might have cause to use the API in the site provisioning process. Essentially, 如果 you can't find a way to do what you want using CAML schema in the onet.xml file, chances 是 you'll have to write code. Hence, 想想你几乎容易 能够 在onet.xml文件中执行 and reverse the list in order to work out scenarios which require code, but some examples which spring to mind 任何how 是:

  • 更改网站的自定义母版页
  • 创建一个站点列以从列表中获取数据(请参阅我的功能接收器上的文章,该文章位于 在Codeplex上创建查找字段的功能)
  • 向网站添加定制的唯一权限(本系列文章中的示例)
  • 设置网站属性 from 任何 kind of dynamic lookup

In short, there 是 many scenarios.


使用VSeWSS创建网站定义

如果你've ever created a site 定义 with Windows 的SharePoint Services的Visual Studio扩展,您会注意到它给您的VS项目包含一个名为SiteProvisioning.cs的文件。内部是一个事件处理程序方法,您可以在其中添加自定义代码,该代码将在根据定义创建站点时执行。该类如下所示:

命名空间 COB.Demos.SiteDefinition

{

    上市 部分的 ProjectXSiteDefinition

    {

        /// <summary>

        /// 在此处定义您自己的功能激活操作代码

        /// </summary>

        上市 虚空 激活(SPFeatureReceiverProperties 属性)

        {

            //我的代码在这里。

        }

    }

}

 

所有这些背后的管道都很有趣。乍一看,方法签名看起来像功能接收者,但实际上不是。但是,检查VS项目(您至少需要用F5生成一个项目才能生成文件)表明,VSeWSS实际上已经在后台创建了一些功能。这些文件可以在VS项目的bin \ Debug \ solution文件夹下找到(默认情况下是隐藏的-您需要在Visual Studio Solution Explorer中执行“显示所​​有文件”)。如果您进一步研究以确切了解VSeWSS的功能,则会发现以下内容:

  • 2 已创建功能-1部署了'default.aspx'文件,另一个没有'elements'文件,但已连接到功能接收器-这是 与VS项目相同的程序集中的类。如果您检查GAC,您的确会在此找到该程序集。
  • 在“ Web功能”元素下的onet.xml文件中添加了类似于以下内容的行:

    <特征 ID="67b2507c-8822-41dc-b939-3d8f34b5ad13" />


    值得注意的是,这是连接到功能接收者的功能的ID。
  • 在包含功能接收器的程序集上使用Reflector显示,主事件处理程序方法执行了一些处理,然后调用 激活 上面显示的方法,即VSeWSS为您提供的位置,以添加您自己的代码以在创建网站时执行。该代码实际上包含在VS项目中的SiteProvisioning.Internal.cs文件中。 (如果您对这里的所有代码到底在做什么感到好奇,就我所知,答案是,当使用VSeWSS项目模板创建网站定义时,没有任何答案。但是,在Solution Generator中也可以找到此代码用于提取网站定义-在这种情况下,需要完成一些修正,这就是所使用的代码。)

因此,总而言之,VSeWSS将创建一个隐藏的功能添加到onet.xml的“ Web功能”部分,以便在 定义用于创建网站*。 Feature连接到Feature接收器,该接收器调用您的自定义代码所在的OnActivated方法。

*(注意 如果该定义用于创建网站定义, 根网站也被创建 自动执行,因此功能也会 然后被激活。另请注意,该功能必须已经 已安装 在服务器场中以这种方式激活它)。

我们可以从中得出的结论是,在站点供应过程中没有“特殊位置”可注入自定义代码,但这可以通过使用功能接收器来完成。因此,如果您不想使用VSeWSS创建网站定义,则可以使用这种技术将自定义代码添加到网站创建过程中。

就该代码的外观而言,“ Hello World”示例可能是:

上市 虚空 激活(SPFeatureReceiverProperties 属性)

{

     网页 currentWeb = 空值;

     网站 currentSite = 空值;

     目的 oParent = properties.Feature.Parent;

 

     如果 (properties.Feature.Parent 网页)

     {

         currentWeb = (网页家长

        currentSite = currentWeb.Site;

     }

     其他

     {

         currentSite = (网站家长

        currentWeb = currentSite.RootWeb;

     }

 

     currentWeb.Title = “在以下位置设置供应代码” +  DateTime.Now.ToString();

    currentWeb.Update();

}


希望这可以说明编写在定义中创建的站点上设置属性的代码非常简单。一般而言 网页 目的 是 the entry point, 和 任何 property which 能够 be modified 能够 be modified using the API. So, 这个 是 a pretty powerful technique which 能够 be used in many scenarios.

如果您有这种要求,我绝对建议您使用VSeWSS简化流程。当然,可以手动将所有内容连接起来并打包到解决方案中,但是该工具确实节省了大量麻烦。但是,与VSeWSS一样, 这个价格是有一定灵活性的。作为我的示例代码 the final 文章将显示,有时将数据传递到 Features by using 功能属性,很遗憾,VSeWSS不支持此功能。因此,在有用的情况下,以下链接提供了一个zip文件,其中包含使用上述技术的解决方案/功能, 没有 使用VSeWSS:

http://sharepointchris.googlepages.com/customcodewithsitedefinitions

在下一篇也是最后一篇文章中,我将介绍在创建网站时使用API​​修改网站权限的细节。希望明确的是,这是 结合此处详细介绍的技术,最终结果是,根据“功能”自动激活了“自动”设置特定权限 创建网站时。

2007年8月5日,星期日

创建,部署和更新自定义网站定义

这是三篇系列文章中的第一篇,我们将讨论自定义网站定义,尤其是如何在网站创建过程中运行自己的自定义代码。如果您需要使用API​​进行任何自定义(超出站点定义通常可以完成的范围),则此技术很有用。在我的系列文章中(有关完整系列文章的内容,请参见 http://sharepointnutsandbolts.blogspot.com/2007/07/article-series-custom-permissions-with.html), I use the example of creating a site 定义 with specific security permissions 'attached' - so that when 任何 sites 是 created using the 定义, specific permissions 是 applied which 是 不同 到父站点的权限(这与默认值不同,默认值是默认值,新站点将继承父站点的权限)。在与前面链接的介绍性文章中可以找到更多背景信息。

在本文中,我们将从网站定义基础知识开始- I'll also supply the set of files used in 这个 article in a link 在 the 结束. Fundamentally, a custom site 定义 是 a template from which new 的SharePoint sites 能够 be created. Customizations 能够 be packaged into the 定义, so that they 是 present 自动ally in sites created from the template. Consider the following about 网站定义:

  • they 是 created by copying an existing (e.g. out-of-the-box) site 定义 和 加 customizations
  • XML文件(尤其是onet.xml文件)指定网站定义的内容(即.aspx页,图像,Web部件,功能[以SharePoint功能的形式])
  • 它们提供了与网站模板(.stp文件)类似的功能-有关网站定义和网站模板之间差异的讨论,请参见 http://msdn2.microsoft.com/en-us/library/aa979683.aspx
  • 可以使用SharePoint解决方案包(.wsp文件)部署网站定义,因此不需要将文件手动复制到SharePoint场中的每个Web服务器。

WSS 3.0 SDK中详细记录了创建站点定义的过程,网址为 http://msdn2.microsoft.com/en-us/library/ms454677.aspx, so I actually won't cover it here but would encourage you to follow the link. However I will quickly run through some of the key elements in the onet.xml file to go over what 能够 be done with 网站定义. For an example, let's take an extract of the onet.xml file for a publishing (note for clarity 这个 是 an extract only - 一种 full version 是 available 在 the link 在 the 结束 of the article):

<组态 ID="0" 名称="空白互联网">

  <网站功能>

    <特征 ID="A392DA98-270B-4e85-9769-04C0FDE267AA">

      <!-- 发布先决条件 -->

    </特征>

    <特征 ID="7C637B23-06C4-472d-9A9A-7C175762C5C4">

      <!-- ViewFormPagesLockDown -->

    </特征>

    <特征 ID="F6924D36-2FA8-4f0b-B16D-06B7250180FA">

      <!-- Office 的SharePoint Server发布 -->

    </特征>

  </网站功能>

  <Web功能>

    <特征 ID="00BFEA71-4EA5-48D4-A4AD-305CF7030140" > </特征>

    <特征 ID="22A9EF51-737B-4ff2-9346-694633FE4416">

      <!-- 出版 -->

      <物产 xmlns="http://schemas.microsoft.com/sharepoint/">

        <属性 ="ChromeMasterUrl" ="〜SiteCollection / _catalogs / masterpage / BlueBand.master"/>

        <属性 ="WelcomePageUrl" ="$ Resources:cmscore,List_Pages_UrlName; /default.aspx"/>

        <属性 ="PagesListUrl" =/>

        <属性 ="AvailableWebTemplates" ="* -ProjectX#0"/>

        <属性 ="AvailablePageLayouts" ="ThreeColumnLayout.aspx"/>

        <属性 ="AlternateCssUrl" = />

        <属性 ="简易出版" ="" />

      </物产>

    </特征>

  </Web功能>

  <模组>

    <模组 名称="登录页面" />

    <模组 名称="图片" />

    <模组 名称="首页" />

  </模组>

</组态>


  • The 组态 元件represents settings to be used with the selected 定义, 所有owing groups of settings to be reused across 定义s for flexibility
  • 网站功能 / Web功能-指定当定义分别用于创建网站集或子网站时应自动激活哪些功能。 这是我们创建网站定义系列的总体目标的关键,该网站定义将自定义的唯一权限应用于由此创建的网站。
  • 发布功能的AvailableWebTemplates属性-可用于限制可用于从该定义创建的网站内创建子网站的网站定义。例如,这有助于防止内容创建者将团队网站添加到面向公众的.com网站上。在这里,我指定只能将配置为'0'的'ProjectX'定义用于子站点。
  • 发布功能的AvailablePageLayouts属性-可用于限制可以在根据此定义创建的网站中使用哪些页面布局。同样,这对于控制网站的外观很有用。
  • 模组 - 一种 module 是 a set of files to be 自动ally added when sites 是 created. Note it's also possible to specify which 网页部分 should be added by default to a web part page by using the AllUsersWebPart 元件。


部署网站定义


但是,我真正要关注的是如何将网站定义打包到解决方案中以简化部署。当部署到多个环境(例如,测试,分段,生产)和/或部署到包含多个SharePoint Web服务器的服务器场时,这通常最有用。如果您没有此要求,则可能需要考虑更简单的手动复制XML文件的过程,如WSS SDK中所述。

在开始之前,让我强调一下 (VSeWSS) 是用于创建和部署自定义网站定义的有用工具,如果您尚未满足此要求,我建议您对其进行研究。但是,我在这里说明“手动”方式以期希望对螺母和螺栓有所了解。

因此,要手动将这些文件打包为解决方案,我们按照SDK的说明获取自定义的onet.xml和webtemp * .xml文件,然后将这些文件放置在与第12章中找到的现有站点定义文件类似的文件夹结构中夹。我建议创建一个Visual Studio项目作为对这些文件进行分组的最佳方法(VSeWSS也遵循这种方法)。这意味着您应该以如下形式结束:



请注意,我们还有一个.ddf文件,该文件与makecab.exe一起用于构建解决方案包-请参阅有关 构建和部署解决方案包 有关完整过程的详细信息,请点击此处。有效地,我们需要通过将.ddf文件作为参数传递给makecab.exe来构建解决方案,然后运行STSADM -o addsolution和STSADM -o deploysolution命令以部署到目标SharePoint网站。

完成此操作后,在“创建站点”屏幕上,我们应该看到新模板出现:



用户现在可以使用此定义来创建站点,这些站点将自动具有我们预先指定的所有功能和外观。如果随后需要将定义部署到其他环境,则是在其中复制.wsp文件并运行STSADM命令的简单情况。现在,我们可以很好地创建具有与之关联的自定义权限的网站定义。

The set of files used in 这个 article 是 在 http://sharepointchris.googlepages.com/creatinganddeployingcustomsitedefinition

更新现有的网站定义


Finally, a quick 不e on updating 定义s. Care needs to be taken here as often you will want to update files which 是 in use by sites already created with the 定义 - 这个 能够 break things! 一般ly 定义是可以的,但是修改/删除内容可能会导致问题。

因此,一种好的技术是复制现有定义,添加更新并部署以供新站点使用,而且 隐藏早期版本 因此无法继续使用。这是通过从TEMPLATE \删除webtemp * .xml文件来完成的\ XML目录。由于已经在TEMPLATE \ SiteTemplates中保留了实际的定义(onet.xml等),因此从早期版本的定义中提供的所有站点都将继续正常运行。

Remember also that new 特征s 能够 be stapled to existing 网站定义 (affecting only new sites which 是 created, 不 existing ones), 和 这个 能够 be useful in avoiding having to update the site 定义 itself. See my article on 特征装订 更多细节。

So that's site 定义 basics. Next in the series - how to go beyond simple 网站定义 : add custom code which will execute when sites 是 created!