Uncategorized

【VSeWSS で作る製品パッケージ(4)】 新機能 WSP View の活用(例 : Workflow feature の追加)

環境:
Microsoft Office SharePoint Server (MOSS) 2007
Visual Studio 2005
Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 (VSeWSS) Version 1.1
SharePoint Server 2007 SDK (または Visual Studio 2008)

VSeWSS で作る製品パッケージ

  1. VSeWSS 進化のポイント
  2. CAML によるサイト/フィーチャーカスタマイズの基本
  3. Provisioning Handler の活用
  4. 新機能 WSP View の活用(例 : Workflow feature の追加)
  5. 新機能 WSP View の活用(例 : Master Page feature の追加)

こんにちは。
今日は福岡でのセミナー「OBA 開発」にご参加された皆様、お疲れ様でした (いま東京に戻りました)

では、いよいよ VSeWSS 1.1 からの新機能である WSP ビュー (WSP View) をみていきましょう。(ここで作成した sample は download できるようにしておきました)

これまでみてきたように、VSeWSS では CAML を 1 から作成する必要がないように多くの作業を自動化しています。例えば、Web パーツやリスト定義などをソリューションパッケージに追加する場合には、手作業ですべておこなうと feature.xml というフィーチャー定義などの見えていないいくつかの CAML を作成し、cab ファイルを作成し、などなど、その他にもさまざまな作業が必要になります。VSeWSS を使うと、これらの作業はすべて配置の際に自動で実施してくれています。
これまで CAML を使った設定 (XML) によるカスタマイズや、Site Provisioning Handler を使ったコード (Programing) によるカスタマイズをみてきましたが、さらに手の込んだカスタマイズでは上記のような VSeWSS が自動化して隠ぺいしてくれている処理までもカスタマイズしたくなるかもしれません。こうしたケースに対応し、VSeWSS 1.1 では WSP ビュー (WSP View) という機能を使用して、この細かなカスタマイズができるようになっています。

例えば、SharePoint の要の機能の 1 つであるワークフローフィーチャーや、他によく使いそうなものとしてカスタムマスターページ (master page) のフィーチャーなど、VSeWSS にその機能が存在していない (VSeWSS が配置方法を知らない) 外部のフィーチャーについても組み込むことができるようになりました。
以下では、 Visual Studio を使って VSeWSS とは別に作成したワークフロー (Workflow) をサイト定義に組み込む例をみながら、その威力を実感して頂きたいと思います。

まずソリューションを作成する前に、組み込むワークフローの dll を GAC から確実に削除しておいてください。また、ワークフローのフィーチャーフォルダも SharePoint hive (%Program Files%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES) から確実に削除しておきましょう。(こうしたものが残っていると、ソリューション配置の際などにエラーになると思われるためです)
また Solution Generator でサイト定義を抽出する場合、ワークフローがリストなどに関連付いたままの状態では抽出できないことがありますので (VSeWSS にとっては未知の設定です)、あらかじめワークフローの関連付けなども削除しておきましょう。

  1. いつも通り、Solution Generator を使って、雛型となるサイト定義を作成しておきます (もしくは新規にサイト定義を作成します)。
    また準備として、ワークフローのプロジェクトフォルダ (ソリューションフォルダではありません) を上記のサイト定義のソリューションの中にコピー (もしくは移動) しておきましょう。
  2. ソリューションエクスプローラで [すべてのファイルを表示] アイコンをクリックすると、上記でコピーしたワークフロープロジェクトのフォルダが (白抜きで) 表示されますので、このフォルダの中の workflow.xml を右クリックして、[プロジェクトに含める] を選択してプロジェクトのファイルとして含めておきます (下図)。
  3. さて、このサイト定義のプロジェクト上で、WSP ビュー (WSP View) を表示します。
    [表示] – [その他のウィンドウ] – [WSP ビュー] で表示をおこない、WSP ビューのウィンドウ上部の [更新] アイコンをクリックすると、(内部で pkg フォルダが作成されて、) パッケージのビューが Visual Studio に表示されます。
  4. ここにワークフローを追加していきます。
    まず、Visual Studio などで作成したワークフローの workflow.xml の Elements 要素には Id 属性が付与されていませんが、この属性がないと CAML として組み込まれませんので、先ほどプロジェクトに含めた workflow.xml を開き、この Elements 要素に Id 属性を追加し (Guid を新規に採番し) ファイルを保存します。

    <?xml version="1.0" encoding="utf-8" ?><Elements Id="A967098A-CF21-475a-A91E-567A86BC08FB" xmlns="http://schemas.microsoft.com/sharepoint/">  <Workflow Name="Microsoft On WF Load Demo" Description="Load demo workflow for Microsoft On Seminar" Id="49C30702-616C-4d13-977C-8C57DCF011CB" CodeBesideClass="SharePointWorkflowLibrary1.Workflow1"  CodeBesideAssembly="SharePointWorkflowLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=83f12d2a0b2df6fd" TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160" InstantiationUrl="_layouts/IniWrkflIP.aspx"><Categories/><MetaData>  <!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->  <Instantiation_FormURN>urn:schemas-microsoft-com:office:infopath:Demo1InitForm:-myXSD-2006-10-17T06-59-30</Instantiation_FormURN>  <Task0_FormURN>urn:schemas-microsoft-com:office:infopath:Demo1TaskForm:-myXSD-2006-10-17T07-07-40</Task0_FormURN>  <StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl></MetaData>  </Workflow></Elements>
  5. WSP View で再表示をおこなうと、フィーチャーが自動認識されて「Untitled 1」というフィーチャーが追加されます。
  6. このフィーチャーフォルダの中の追加された feature.xml を開き、ワークフロープロジェクトの中の feature.xml の内容をコピー/ペーストします。
    ただし、Feature の Id 属性と ElementManifest 要素の内容 (下記赤字の部分) は他の定義の箇所と矛盾がしょうじてしまうので、もとの feature.xml と同じにしておいてください。(Feature の Id を勝手に変更してしまうと、また別のフィーチャーフォルダが WSP ビューに作成されてしまいます)

    <?xml version="1.0" encoding="utf-8"?><Feature Id="6c34311f-8d71-4739-a86a-e04c84ff2065" title='' Description="Load demo workflow feature for Microsoft On Seminar" Version="12.0.0.0" Scope="Site" ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver" xmlns="http://schemas.microsoft.com/sharepoint/">  <ElementManifests><ElementManifest Location="Untitled 1workflow.xml" />  </ElementManifests>  <Properties><Property Key="GloballyAvailable" Value="true" /><!-- Value for RegisterForms key indicates the path to the forms relative to feature file location --><!-- if you don't have forms, use *.xsn --><Property Key="RegisterForms" Value="*.xsn" />  </Properties></Feature>
  7. さて、WSP ビュー (WSP View) でフォルダ名「Untitled 1」の名前を適当な名前 (ワークフローのプロジェクト名など) に変更しておきましょう。(WSP ビューで変更をおこなうと、上記の feature.xml の ElementManifest 要素など、関係する箇所も自動で変更されます)
  8. これでフィーチャー設定は終了ですが、つぎにフィーチャーインストールだけでなくワークフローでコンパイルされる dll も GAC にインストールされるように、ワークフロープロジェクトの作成された dll (bin/Debug フォルダの dll) も [プロジェクトに含める] を選択してプロジェクトのファイルとして含めておき、このファイルのプロパティウィンドウで [ビルドアクション] を「コンテンツ」に設定しておきます。

さて、ワークフローフォーム (xsn) が存在しないのであれば、これで “配置までは” 完成!です。
以下に続きとして、ワークフローフォーム (xsn ファイル) も含めていきましょう。

  1. VSeWSS では、プロジェクトに「テンプレート」と呼ばれるものを含めることができます。この仕組みは、SharePoint hive のテンプレートフォルダ (%Program Files%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE) の下に追加でイメージファイルや aspx などを追加する場合に使用できます。上記のサイト定義のプロジェクトに、[追加] – [新しい項目] で [テンプレート] を選択します。(作成される「TemplateFile1.txt」などは今回は使わないので削除しておきましょう)
  2. 上記で作成された Templates フォルダに、FEATURES<ワークフローフィーチャー名> のフォルダを作成します。
    そして、上記のフォルダ内にインストール xsn ファイルを配置します (改めて、ここに xsn を発行しても構いません)。
    ここは注意をしてください。要は、feature.xml の RegisterForms に記載された場所に配置するようにしたいので、例えば feature.xml が下記 (赤字) のように記載されている場合には、FEATURES<ワークフローフィーチャー名>Forms のフォルダになりますので注意をしましょう。

    <?xml version="1.0" encoding="utf-8"?><Feature Id="6c34311f-8d71-4739-a86a-e04c84ff2065" title='' Description="Load demo workflow feature for Microsoft On Seminar" Version="12.0.0.0" Scope="Site" ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver" xmlns="http://schemas.microsoft.com/sharepoint/">  <ElementManifests><ElementManifest Location="SharePointWorkflowLibrary1workflow.xml" />  </ElementManifests>  <Properties><Property Key="GloballyAvailable" Value="true" /><!-- Value for RegisterForms key indicates the path to the forms relative to feature file location --><!-- if you don't have forms, use *.xsn --><Property Key="RegisterForms" Value="Forms/*.xsn" />  </Properties></Feature>

これで完了です。

しかし、さらに完成度を高めていきましょう ! (ここからは前回の復習になります)

このインストールされるワークフローですが、当然のことながら、特定のリストに関連付けをおこなってインストールをおこないたくなる場合が多いでしょう。こうした場合には前回の技である Site Provisioning Handler の登場になります。(ちなみに、ワークフローマニフェスト (workflow.xml) の AssociateOnActivation を true にすることですべてのリスト (ただし「ドキュメント」) にデフォルトで関連付けされた状態になりますので、製品などでサイト全般で使用するワークフローなどの場合には、このようにしておく方法もあります。)
Site Provisioning Handler についてはもう詳細の説明はしません (前回の投稿を参照してください)。
今回は、

  1. インストールされたワークフローフィーチャーのサイトでの Activate
  2. 特定のリストへの関連付け

が必要なため、以下の Provisioning Handler のコードを追加します。(ここでは Provisioning Handler のデモとしてコードを使用してフィーチャーをアクティブ化していますが、フィーチャーのアクティブ化は、一般に onet.xml を使用しておこなうことができます。)

public void OnActivated(SPFeatureReceiverProperties properties){// 例によって、作成される Site を取得SPWeb web;if (properties.Feature.Parent is SPWeb)web = (SPWeb)properties.Feature.Parent;elseweb = ((SPSite)properties.Feature.Parent).RootWeb;// 関数(以下)を呼び出すSetPriceListWorkflow(web);}private void SetPriceListWorkflow(SPWeb web){web.AllowUnsafeUpdates = true;SPList targetList = web.Lists["Price List"];// ワークフローフィーチャーの Activateweb.Site.Features.Add(new Guid("6c34311f-8d71-4739-a86a-e04c84ff2065"), true);// ワークフローテンプレートの取得SPWorkflowTemplate wfTmpl = web.WorkflowTemplates.GetTemplateByBaseID(new Guid("49C30702-616C-4d13-977C-8C57DCF011CB"));///////// 以下、タスクリストとワークフロー履歴リストを作成します。// このサンプルでは、タスクリストはすでにサイト定義に存在し、// ワークフロー履歴リストだけを作っています ...// (タスクリストがテンプレートに存在しない場合は、作成する必要ありますよ)///////// タスクリストの取得SPList taskList = web.Lists["Tasks"];// ワークフロー履歴リストの取得 (その前に作成)string histListName = "ワークフローの履歴";SPListTemplateType prcListTemplateTypeHistory = SPListTemplateType.WorkflowHistory;web.Lists.Add(histListName, "history list", prcListTemplateTypeHistory);SPList histList = web.Lists[histListName];// ワークフローの関連設定SPWorkflowAssociation wfAssoc = SPWorkflowAssociation.CreateListAssociation(wfTmpl, "AutoWorkflow", taskList, histList);wfAssoc.AllowAsyncManualStart = false;wfAssoc.AllowManual = true;wfAssoc.AutoStartCreate = true;wfAssoc.AutoStartChange = false;targetList.AddWorkflowAssociation(wfAssoc);}

GUID やリスト名などは、無論、みなさんのアプリケーションにあわせ適宜変更しておいてください。
ワークフローは Web アプリケーションごとにインストールされ、サイトコレクション (サイトではありません) ごとに Activate (有効化) されるものであるため、上記のように 「サイト」 (SPWeb) ではなく 「サイトコレクション」 (SPSite) を取得して Activate をおこなう点にも注意しましょう。

試しに配置をすると、dll の GAC 登録やワークフロープロジェクトのインストールがおこなわれ、ワークフローフィーチャーがインストールされます。またこのインストールされたサイトテンプレートからサイトを新規作成すると、上記のリスト (Price List) にワークフローが自動的に関連付けられます。

なお WSP ビューで設定した内容はプロジェクトの pkg フォルダに保存されるため、このカスタマイズでは pkg フォルダは削除しないように注意しましょう。

このように、WSP ビュー (WSP View) を使うと、カスタムのワークフローやマスター等の VSeWSS 以外のフィーチャーも含めることができます。
またこの他にも、今まで内部で自動作成されて見えていなかった webtemp*.xml なども WSP View に見えていますので、例えば、このサイトテンプレートのタイトルや、表示するカテゴリ (デフォルトでは Development)、表示するイメージなどをカスタマイズすることも可能です。
また、上記の「テンプレート」(Template) の技を使うと、第 2 回 で手で配置したテンプレートファイル (%Program Files%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1041\STS\DOCTEMP\WORD に配置した dotx) や、サイトやフィーチャーのイメージアイコン等々も、このソリューションのインストーラに含めて配置をおこなうことができることがわかります。

何度も繰り返しますが、SharePoint に組み込まれた製品開発などを検討されている SI ベンダーの方などにとっては、インストーラパッケージの作成と同等の 「目からウロコ」 のツールであるということがおわかり頂けるでしょう。

尚、Visual Studio 2008 で “ワークフロー単体” のソリューションパッケージを作成したい場合には、小高がブログでご紹介している Microsoft Visual Studio Tools for the Office System Power Tools が使用できます。

 

Categories: Uncategorized

Tagged as:

7 replies»