モジュール化された SharePoint ワークフロー機能を提供する (パート 2/2)
概要 : アプリケーションに SharePoint のワークフローに対するサポートを追加する処理と、そのサポートを、独自のワークフローを構築するためにクライアントが使用できるコンポーネントに分解する処理について、そのオプション、プロセス、および利点を説明します。この記事は 2 部構成の第 2 部です (印刷ページ数 : 17)。
David Mann (Mann Software, LLC (英語))
2008 年 6 月
対象 : 2007 Microsoft Office system、Microsoft Office SharePoint Server 2007、Microsoft Office SharePoint Designer 2007、Microsoft Visual Studio 2008 開発システム、Visual Studio Tools for Office (3.0)
この記事に付随するコード サンプルを、「Sample Code: Delivering Modular Workflow Functionality in SharePoint Server 2007 (英語)」からダウンロードしてください。
第 1 部「SharePoint のモジュール化されたワークフロー機能の提供 (パート 1/2)」をお読みください。
目次
「SharePoint のモジュール化されたワークフロー機能の提供 (パート 1/2)」では、Visual Studio で有効に機能するアクティビティを作成しましたが、これは Microsoft Office SharePoint Designer 2007 では機能しませんでした。そのため、まだ最後の目標までたどり着いたとは言えません。幸い、SharePoint Designer 用のカスタム アクションを作成する作業は、簡単な構成プロセスです。いくつか XML を記述する必要はありますが、コードの記述は不要です。
最初の作業では、Windows SharePoint Services または Microsoft Office SharePoint Server 2007 においてアクティビティとそのアセンブリの読み込み方法が認識されるように、web.config ファイルにエントリを追加します。これは、カスタム Web パーツ用の SafeControls エントリを追加する作業と非常によく似ています。
メモ : |
---|
ここでは、作成する必要があるエントリについて説明してから、開発環境においてこのエントリを手動で作成する方法の手順を確認します。ただし、展開用にアクティビティまたはアクションをパッケージ化する前に、インストール ルーチンで適切なエントリをクライアントのサーバーに確実に追加する必要があります。「Additional Resources」では、プロセス全体をはるかに簡単に行うためのツールをいくつか紹介します。 |
web.config ファイルを開きます。ファイルの末尾付近に、
というセクションがあります。すぐその下には、
子タグを含む
というセクションがあります。次の例のように、新しいアクション用として新しい
タグを追加します。
PublicKeyToken の値を厳密な名前キーの値に置き換えるのを忘れないでください。そうしないと、このエントリは機能しません。
カスタム Web パーツの作成に慣れた開発者であれば、このエントリが SafeControls エントリとほとんど同じであることに気付きます。SafeControls エントリに馴染みがない方でも、次の部分の意味はすぐに理解できます。
- Assembly: 4 つの部分で構成される、アセンブリの完全な名前。Reflector (英語) などのツールを使用して簡単に取得できます。
- Namespace: アクティビティに固有の名前空間。このサンプル シナリオの場合、これは CaseTrak.Activities です。
- TypeName: 通常、"すべての型" を表すアスタリスクが含まれますが、特定のクラスをリストすることもできます。
- Authorized: True を指定してアクティビティを "安全" にします。一方、false を指定すると、web.config エントリが無駄になります。
これで SharePoint 製品とテクノロジにアクションの内容を伝えて、このアクションを実行する準備が整ったので、次にこれを SharePoint Designer に伝える必要があります。これも簡単で、短い XML をいくつか記述するだけです。パス C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1041\Workflow
に移動すると、このフォルダ内に WSS.ACTIONS というファイルがあります。このファイルには、カスタム SharePoint Designer アクションについての情報が豊富に含まれています。このファイル内で、SharePoint Designer アクションを使用して行うことができる、すべての例を確認できます。
残念ながら、このファイルは単なる XML ではあるものの長さが 700 行を超えるので、アクションのビルドに際して知っておくべきことを確認するためにすべてのオプションに目を通すのは少し困難です。この記事では、カスタム アクションをビルドするための、より一般的なオプションについて説明します。すべてのオプション (スキーマ定義を含む) の詳細については、「Additional Resources」を参照してください。
WSS.Actions ファイルについて最初に知っておくべきことは、他の SharePoint の既定ファイルと同様、ファイルの内容の変更が認められていないという点です。その代わり、同じディレクトリに独自の ACTIONS ファイルを作成する必要があります。Windows SharePoint Services および SharePoint Server は、このファイルを読み取って、カスタム アクションを既定のアクションと共にメモリに読み込みます。このためには、単にファイルを同じディレクトリに作成して、それに意味のある名前を付け、拡張子を .ACTIONS にします。今回の例では、CaseTrak.ACTIONS というファイル名を使用します。
サンプル用として、単純に Visual Studio でテキスト ファイルをソリューションに追加し、それに対して XML を追加します。後ほど、パッケージ化と展開を説明する際にこのファイルを処理するので、適切な場所にコピーします。
次のコード例は、作成した CaseTrak.ACTIONS ファイルの全内容です。内容はほとんど一目瞭然ですが、表 1 でさらに詳細を説明します。
xml version="1.0" encoding="utf-8"?> <WorkflowInfo Language="en-us"> <Actions Sequential="then" Parallel="and"> <RuleDesigner Sentence="Set CaseTrak Status for %1 to %2"> <FieldBind Field="CaseID" Text="this Case" DesignerType="string" Id="1"/> <FieldBind Field="CTStatus" DesignerType="Operator" OperatorTypeFrom="DropDownMenu" Id="2" > <Option Name="Open" Value="1"/> <Option Name="Closed" Value="2"/> <Option Name="Pending" Value="3"/> <Option Name="Deferred" Value="4"/> <Option Name="InProcess" Value="5"/> FieldBind> RuleDesigner> <Parameters> <Parameter Name="CaseID" Type="System.String, mscorlib" Direction="In" /> <Parameter Name="CTStatus" Type="System.Int32, mscorlib" Direction="In" InitialValue="5" />"Parameters> Action> Actions> WorkflowInfo>
表 1. CaseTrak.ACTIONS ファイルの要素
要素 | メモ |
---|---|
Action | ファイル内の各アクションには、独自の Action 要素があり、ここでそのアクションの詳細を説明します。ClassName 属性と Assembly 属性はその名のとおりです。Category はわかりやすく、例に示されているように、独自の値を指定して独自のカテゴリを SharePoint Designer の [アクション] ダイアログ ボックス内に作成できます。最後の属性 AppliesTo は、アクションをどの種類のリストに対して使用できるかを決定します。指定可能な値は、list、doclib、または all です。 |
RuleDesigner | SharePoint Designer のワークフローは、実行するアクションを記述する文という概念に基づいています。たとえば、"ドキュメントの所有者に電子メールを送信する" のような文として表されます。このため、実装可能な他の構成よりもユーザーにわかりやすくなっています。SharePoint Designer では、今回作成したアクティビティの文は "Set CaseTrak Status for case |
FieldBind ここで、iは、コンピュータウイルスの最新のリストを見つけることができます | アクションに使用する文の各パラメータ (%n) は、フィールドに結び付けられています。このフィールドで指定するのは、フィールドの名前、パラメータに値を割り当てるまでの間表示されるテキスト、パラメータの値を設定するときに表示されるデザイナの種類、およびフィールドの ID です。1 つ目の Field では単純な文字列デザイナが使用され、2 つ目ではそれよりも少し複雑なドロップダウン デザイナが使用されています。設定可能な DesignerType 値の詳細については、「Additional Resources」を参照してください。 |
Parameter | 例の各フィールドには、対応する Parameter セクションが必要です。Parameter エントリでは、フィールドのデータの処理方法に関する詳細を指定します。パラメータの Name は、Action アセンブリのパブリック プロパティに一致する必要があります。ここにある他の重要な属性は、Direction 属性です。ここでは、パラメータが値をアセンブリに渡すか (In)、値をアセンブリから受け取るか (Out)、パラメータを省略可能にするか (Optional) (In パラメータのみに適用可能) を指定します。この例では、2 つ目のパラメータのように、InitialValue パラメータを通じて Initial 値を指定することもできます。 |
これらの要素を指定したら、後は IIS をリセットするか SharePoint アプリケーション プールをリサイクルするだけです。図 10. に表示されているように、作成した新しいアクションを SharePoint Designer で使用できるようになります。
図 10. SharePoint Designer のアクションの一覧に表示されたカスタム アクション
ここで、ユーザーがワークフローで使用するためにこのアクションを選択すると、ユーザーに対して、図 11. に表示されているような画面が表示されます。
図 11. カスタム アクションの初期表示
作成した ACTIONS ファイルで見たように、Case パラメータと InProcess パラメータを実際の値と置き換える必要があります。前者は単純な文字列であり、後者は、図 12. に表示されているように、有効な選択肢が含まれたドロップダウン リストです。
図 12. アクションで指定されたパラメータを有効な値に置き換える必要がある
これで、今回のカスタム アクションは完了です。この機能を完全に利用できるようにするための最後の作業は、SharePoint Designer で使用するカスタム条件を作成することです。それについては次に説明します。
条件を作成する
カスタム条件は、カスタム アクションと非常によく似ています。主な違いは、通常、条件はアクティビティまたは他のアセンブリとして開始されない点ですが、これは両者の性質がわずかに異なっているためです。ただし、条件を作成するプロセスは、アクションを作成する場合とほとんど同じです。
- ロジックをカプセル化するカスタム アセンブリをビルドします。
- アセンブリを展開します。
- 条件を登録して構成し、Windows SharePoint Services または SharePoint Server によって認識されるようにします。
そのため、多くの前向きな理由から、条件をサポートするために必要なコードを、作成したアクションと同じアセンブリに含めることをお勧めします。その方が後の処理が簡単になります。ただし、アクションを開発しない場合は、条件をどのアセンブリに含めてもかまいません。後ほど、アセンブリに追加する必要がある内容の詳細について説明します。
引き続きアクション/アクティビティと同じシナリオにおいて、条件を Contoso Software の CaseTrak アプリケーションの一部として使用します。ここでは、特定の症例が管理上または法律上の理由で保留になっていない場合にのみ、症例の評価を処理できる必要があります。したがって、この条件では、CaseTrak を呼び出して、各症例の保留ステータスを確認する必要があります。このプロセスの手順について、これから説明します。
コードでは、条件は 1 つの Boolean 値を返すメソッドです。ここでは、単純化のために、このメソッドを Activity アセンブリに直接追加します。このメソッドに関して重要なのは、これが静的メソッドであり、Boolean 値を 1 つ返す必要があるという点です。これらの 2 つの事項以外では、適切に Boolean の戻り値を計算する限り、任意の方法でメソッドを実装できます。
この記事に含まれているサンプル コードでは、単純にすべての症例において true を返します。実際の運用システムでは、CaseID パラメータを CaseTrak Web サービスに渡して、症例が管理上または法律上の理由で保留になっているかどうかを示す値を取得するような処理を実装できます。いずれの場合でも、その値をワークフローに返すと、それ以後の処理がすべて適切に続行されます。
条件を構成する最後の手順は、条件を登録して Windows SharePoint Services または SharePoint Server、さらには SharePoint Designer に認識されるようにすることです。ここでも、作成した ACTIONS ファイルに簡単な XML をいくつか追加することによって、この処理を行います。追加先は、ルート WorkflowInfo 要素のすぐ下です。
<Conditions And="and" Or="or" Not="not" When="If" Else="Else if"> <Condition Name="Case Not On Hold" FunctionName="CaseNotOnHold" ClassName="CaseTrak.Activities.StatusUpdater" Assembly="CaseTrak.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bf813961d1f833f1" AppliesTo="all" UsesCurrentItem="false"> <RuleDesigner Sentence="Case %1 is not on Hold"> <FieldBind Id="1" Field="_1_" Text="CaseID"/> RuleDesigner> <Parameters> <Parameter Name="_1_" Type="System.String, mscorlib" Direction="In" /> Parameters> Condition> Conditions>
この XML の要素は、前述した内容とほとんど同じなので、ここでは詳細は再度説明しません。既に述べたように、Fields 要素と Parameters 要素には多数のオプションがあります。詳細については、「Additional Resources」を参照してください。
これらの要素を設定したら、IIS をリセットするかアプリケーション プールをリサイクルしてから、SharePoint Designer を開きます。すると、図 13. に表示されているように、新しい条件を使用できるようになっています。
図 13. カスタム条件
メモ : |
---|
変更の内容、サーバーの構成方法など、要因によっては、単に SharePoint アプリケーション プールをリサイクルするだけでは十分でない場合があります。これは、SharePoint Designer によって情報がキャッシュされているためです。特に独自の ACTIONS ファイルなどに変更を加えた場合に SharePoint Designer に変更が反映されないときは、iisreset コマンドを何度か実行した後、SharePoint Designer でサイトを閉じてから再度開きます。これでもうまくいかない場合は、SharePoint Designer のキャッシュを手動で削除する必要があります。キャッシュ ファイルの場所を特定するため、SharePoint Designer を閉じ、パス Documents and Settings\[User_Name]\Local Settings\Application Data\Microsoft\WebsiteCache に移動して、サイトの名前が付いたフォルダを削除します。 |
カスタマイズ オプションの概要
SharePoint のワークフローは、Windows Workflow Foundation (WF) 上で構築されるので、非常に柔軟で拡張性に優れています。既定の機能として、汎用的な人間中心のワークフローを構築できるのは大きな価値です。独立系ソフトウェア ベンダ (ISV) にとってのメリットは、WF の能力を拡張して自社製品と簡単に統合できる点です。自社およびその顧客にとって SharePoint との統合が選択肢の 1 つである場合は、他のソリューションを探したり、自社製品用にワークフロー エンジンをビルドしたりする必要がなくなります。
自社製品とのワークフロー統合をビルドする際に SharePoint Designer と Visual Studio のどちらを使用するかは、ISV が決めることではありません。ISV として重要なのは、両方のツールをサポートすることです。理由は次のとおりです。
IPアドレスから名前を取得する方法
- SharePoint Designer をサポートする一方で Visual Studio をサポートしないのは、明らかに実行可能な選択肢ではありません。なぜなら、SharePoint Designer のアクションを作成するために Visual Studio のアクティビティを作成する必要があるからです。
- 少しの努力で SharePoint Designer サポートを追加できるので、Visual Studio のみをサポートして大きな成果を上げようとする理由はあまり見当たりません。
- 両方のツールをサポートすることによって、顧客の選択肢をできるだけ多く残しておくことになります。いずれか 1 つの枠組みに適合するように顧客に強いることはできません。
ここまで、提供したコンポーネントを顧客がどのように使用するかについての技術的な側面を順に見てきました。これを理解することから始めるのは、技術的にどのようなことが可能なのかについて知るために重要です。しかし、ここからは、作成した独自のソフトウェア製品に注目して話を進めていく必要があります。作成したアプリケーションのプロセスを理解し、コンポーネントとして公開する機能の部分を切り出す際の合理的な場所を識別できるようになる必要があります。作成したアプリケーションによって提供される機能のすべての部分を公開することも多くの場合できますが、そうすることに合理性がない可能性があります。
残念ながら、この記事で紹介する、それぞれのアプリケーション、状況、および ISV は異なったものになります。そのため、プロセスを構築する基になるコンポーネントとしてアプリケーションを公開する処理にどのように取り組むのかについて、確かなルールを示すことが困難になっています。その代わり、一般的なルールをいくつか示し、検討するべき各種の事項について説明します。
何よりもまず重要なのは、作成したアプリケーションをどのように使用できるのかと、その一般的な使用シナリオを理解することです。この理解を得るために、営業やマーケティングの担当者に意見を聞いたり、自社製品の市場調査を参考にしたりすることも必要です。ここでは、手始めとして、尋ねるべき質問の種類に関するアイデアを提供します。
- ユーザーの環境にある別のアプリケーションに対して、自社アプリケーションのどの情報をユーザーは公開したいと考えているか。
- 顧客サイトで使用されている他のアプリケーションのうち、自社アプリケーションを補完する形でサービスを提供しているものがあるか。また、それを統合して複合的なアプリケーションまたはプロセスを作成できるか。
- 顧客の環境にある他のアプリケーションまたはプロセスのうち、自社アプリケーションに情報を提供するか自社アプリケーションから情報の提供を受けることができるものがあるか。
- 自社アプリケーションまたはプロセスの機能のうち、ユーザーが利用していないものがあるか。
この情報の一部は、自社アプリケーションを顧客の環境にインストールしてサポートしている担当者からも入手できる場合があります。
これらの質問に対する回答が得られたら、アプリケーションの技術的な評価を行う必要があります。そして公開の対象として候補となる、アプリケーションの部分を理解する必要があります。アプリケーションのいずれかの部分、たとえば、内容の編集において独自のまたは厳しいセキュリティや監査の要件を適用している場合は、編集用としてその部分を公開するのが難しいことがあります。この場合は、それらの部分に対して単に読み取り専用アクセスを許可する方法をとることができます。
別のシナリオでは、自社アプリケーションの特定の部分で大量のデータを処理しなければならない場合があります。そのため、この内容を公開して抽出した内容を別のアプリケーションに渡すことは現実的に難しいと考えられます。同様に、特定部分の内容が、他の部分の類似内容との関連でのみ有効であることもあります。この場合は、内容を個々の要素として公開することに意味がないと考えられます。
最後のシナリオとして説明するのは、企業秘密のビジネス概念またはアルゴリズムを保護する考え方です。自社アプリケーションの一部をモジュール化されたコンポーネントとして公開することで、その内部のしくみが顧客や競合企業に漏れてしまい、競争上の優位性が低下または消失するのであれば、そのような行為はビジネス上明らかに良い判断ではありません。このような場合は、それらの要素を公開しないことを選択するか、考えられる脅威を最小限にするような方法で分離するようにします。アプリケーション内にある企業秘密の情報を守りながら、入力と出力のみを公開することで、企業秘密の要素をブラック ボックスとして維持できます。
以前は, .NET ベース製品の API を拡張する方法として、主に次の 2 つがあると言うことができました。
- Web サービスを使用する
- .NET リモート処理を使用する
どちらの方法を選ぶかは、いくつかの要因で決まっていました。Web サービスを選んだ場合は、パフォーマンスを犠牲にしてクロス プラットフォーム サポートを実現していました。.NET リモート処理を選んだ場合は、クロス プラットフォーム サポートを犠牲にして高いパフォーマンスを得ていました。どちらの選択肢においても、こちらの処理では、コア ビジネス ロジックと、API にアクセスする外部プロセスを分離した状態を維持することで、サービスに基づくアーキテクチャに従うことができます。
高レベルでは、これらの選択肢は機能的に同じです。どちらの場合でも、1 つのアプリケーション領域で動作しているアプリケーションまたはプロセスが、こちらで定義した API を使ってこちらのアプリケーションに対して呼び出しを行い、異なるアプリケーション領域、場合によってはまったく異なるサーバーで動作します。このことは、こちらのコア API の部分を、こちらのアプリケーションが実行されるサーバー上以外にはインストールする必要がないことを意味します。また、この場合、コントラクトを定義してそれをサポートすることに合意したことも意味します。将来の任意の時点で、こちらのアプリケーションに対して必要な変更を自由に加えることができ、定義したコントラクトに違反しない限り、こちらの API を利用するいずれかのアプリケーションを壊すことを心配する必要はありません。また、既存の機能を変更しない限り、コントラクトに指定されている内容に新しい機能を追加することもできます。
過去数年にわたって、Web サービスのパフォーマンスとセキュリティが向上したことで、シェア争いの軍配は Web サービスに上がりました。現在, .NET リモート処理を使用することはほとんどなくなっています。ただし、API の拡張で .NET リモート処理を採用していても、ここでの説明に従って現在の実装を止める必要はないので安心してください。
こちらの観点からは、これによって物事がかなり単純になります。こちらの処理では、API の周りを Web サービスでラップすることによって API を拡張します。外部環境に公開する必要があるすべての機能には、Web サービス インターフェイスが割り当てられます。コントラクト (入力と出力) を定義すると、Web サービスとやり取りできるすべてのアプリケーションはこちらの製品との統合をすぐに開始できるようになります。
ISV の観点からは、このことはかなり魅力的に響きます。この記事で特に強調したいのは、Web サービスでの呼び出しを行うためにビルドするワークフロー コンポーネントを有効にする際に何か違ったことをする必要がまったくない点です。必要に応じて Web サービスを残りのアプリケーション用に作り上げ、必要なときにそれらがコンポーネントから呼び出されるようにします。
厳密に言えば、今回のコンポーネントを展開用にパッケージ化する作業を、他のほとんどの SharePoint コンポーネントをパッケージ化する作業とは違った方法で行うことも簡単にできます。これまで見てきた内容のほとんどには、Windows SharePoint Services または SharePoint Server に特有のものは含まれていません。しかし、ここでは実際には SharePoint 環境用に開発を行っており、コンポーネントは SharePoint 環境に展開されることになっています。そのため、展開を準備するにあたって SharePoint 製品とテクノロジを念頭に置いて話を進めます。
ここでは、コンポーネントを他のさまざまな SharePoint コンポーネントと共にインストールするので、展開後の外観は他の SharePoint の展開と同じようなものになっている必要があります。このため、フィーチャーとソリューションを検討する必要があります。フィーチャーとソリューションを作成する方法はいくつかありますが、ここでは、最も一般的なものとして広まりつつある 1 つの方法を採用します。
その説明に移る前に、まず、作成したコンポーネントの展開プロセスでどのような作業が必要になるのかを正確に確認してみましょう。今回の展開プロセスでは、次の作業を行います。
- 作成したアセンブリをグローバル アセンブリ キャッシュにインストールします。
- 作成した ACTIONS ファイルをパス
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1041\Workflow
にコピーします。 - web.config ファイルを authorizedType エントリ付きで更新します。
ソリューションとフィーチャーを使用すると、これらのすべての処理を簡単に行うことができます。
- ファイルを物理的に移動する処理はソリューションが得意とするところなので、最初の 2 つのタスクをソリューションを使って行います。
- フィーチャーを使用すると、フィーチャーがアクティブ化または非アクティブ化されるときにコードを実行できるので、ここではフィーチャーを作成して 3 つ目のタスクを処理します。1 つ注意が必要なのは、今回のコンポーネントは、個々の Web またはサイト コレクションよりも高いレベルを対象としている点です。そのため、管理アクセス許可を持つレベルの担当者がこれらのコンポーネントを管理する必要があります。つまり、作成するフィーチャーの範囲として、Web アプリケーション レベルまたはファーム レベルを指定します。実際のシナリオでは、状況に応じてどちらが適切であるかを決定するか、またはアプリケーションをインストールする担当者にインストール先の環境においてどちらが適切であるかを決定することを許可する必要があります。
それでは、フィーチャーを作成していきましょう。
これから作成するフィーチャーは、おそらく、これまでに作成されてきた多くのものとは少し異なります。というのも、フィーチャーのすべての作業をフィーチャー レシーバで処理するからです。これから説明するように、フィーチャーそれ自体は何も行わないので要素ファイルはありません。さらに説明を進める前に、先ほど見た機能の一覧を思い出してください。フィーチャーで処理するのは、web.config ファイルを authorizedType エントリ付きで更新するという最後のタスクです。それでは、フィーチャー レシーバを作成していきましょう。
フィーチャー レシーバを作成する
フィーチャー レシーバは、SPFeatureReceiver クラスを継承するクラスにすぎず、必要なイベント メソッドを実装します。この場合は、次のコードに示されているように、FeatureActivated イベントのイベント レシーバのみが必要です。
どのようなニーズにmp3プレーヤーが満たすか
public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPWebApplication wappCurrent = (SPWebApplication)properties.Feature.Parent; SPWebConfigModification modAuthorizedType = new SPWebConfigModification(); modAuthorizedType.Name = "AuthType"; modAuthorizedType.Owner = "CaseTrak.Actions"; modAuthorizedType.Path = "configuration/System.Workflow.ComponentModel. WorkflowCompiler/authorizedTypes"; modAuthorizedType.Type = SPWebConfigModification.SPWebConfigModificationType. EnsureChildNode; modAuthorizedType.Value = @""; wappCurrent.WebConfigModifications.Add(modAuthorizedType); wappCurrent.WebService.ApplyWebConfigModifications(); }
今回、フィーチャー レシーバは、web.config ファイル内の configuration/System.Workflow.ComponentModel.WorkflowCompiler/authorizedTypes 要素に子ノードを追加するために必要です。このコードでは、SPWebConfigModification クラスを処理することによってこの作業を行っています。ここでは、要素の追加先として必要である web.config ファイル内のパスを指定してから、追加する必要がある子ノードの値を指定しています。
このクラスを Activity アセンブリに追加しない理由はありません。というのも、両方をグローバル アセンブリ キャッシュに展開する必要があるからです。サンプル コードに表示されているように、ここで行ったのはまさにこの処理です。アセンブリをコンパイルしたら、フィーチャー要素の残りの作業に移ることができます。
Feature.XML
Feature.xml は、作成するフィーチャーを記述する SharePoint ファイルです。このファイルのこの構造は、作成する各フィーチャーにおいてほとんど同じです。異なるのは、要素に実際の値が格納される点だけです。空の XML ファイルを作成し (ここではファイルをソリューションのルートに作成し、後ほど移動します)、適切なエントリを追加します。
xml version="1.0" encoding="utf-8" ?>< ElementManifests /> Feature>
いつものように、PublicKeyToken 値を更新する必要があります。
表 2 は、Feature.xml ファイルの要素の説明です。
表 2. Feature.xml ファイルの要素
要素名 | 説明 |
---|---|
Id | このフィーチャーを一意に識別する GUID。 |
Title | ユーザー インターフェイス (UI) に表示されるフィーチャーの名前。 |
Description | フィーチャーの一覧にあるタイトルの下に表示される説明テキスト。 |
ImageUrl | フィーチャー名と共にフィーチャーの一覧に表示される画像のパス。このパスは、フィーチャー ディレクトリに対する相対パスです。作成するコンポーネントをより本格的なものにするために、ここに企業や製品のロゴを配置できます。 |
Scope | このフィーチャーの展開先となる場所。フィーチャーの有効なオプションは、Farm、WebApplication、Site、または Web ですが、今回は、コンポーネントの利用可能状況を管理できるユーザーを制御するため、これを WebApplication に制限していることに注意してください。これを WebApplication または Farm に設定した場合、管理者はそれぞれ Web アプリケーション レベルまたはファーム レベルでアクセス許可を持っている必要があります。これにより、コンポーネントのセキュリティが若干高まります。 |
Hidden | フィーチャーを UI に表示するかどうかを示す Boolean 値。 |
ReceiverAssembly | 4 つの部分で構成される、レシーバを含むアセンブリの名前。これは、作成するコンポーネントと同じアセンブリである必要はありませんが、この例では同じものを使用します。 |
ReceiverClass | 作成するアセンブリ内にある Receiver クラスの名前。 |
Xmlns | スキーマの XML 名前空間。SharePoint Server 2007 の場合、これは常に |
ElementManifest | 要素マニフェスト ファイルの場所を含む要素。この要素は必須ですが、今回は要素マニフェスト ファイルを利用しないので、空白にしておくことができます。 |
これでフィーチャーとフィーチャー レシーバの説明は終了です。次に、これらをすべてソリューションにパッケージ化します。
ソリューション
SharePoint ソリューションのビルドは難しいプロセスではありませんが、非常に厳格な作業を伴います。.wsp (ソリューション) ファイルを正しくビルドするため、すべての部分を正確に設定し、ソリューションの正しい展開を有効にする必要があります。.wsp ファイルのビルド プロセスは、このセクションの最後で順を追って説明します。ここで重要なのは、ソリューション パッケージの目的と機能を理解することと、それを構成する要素であるマニフェスト ファイルとディレクティブ (.ddf) ファイルを確認することです。
ソリューション パッケージは、Windows SharePoint Services または SharePoint Server に新しい機能を展開するための単なるメカニズムです。しかし、これらによって、展開で大きなメリットが得られます。作成したワークフロー コンポーネントの表示と動作をアプリケーションで最適なものにするには、これらを使用する必要があります。プロセスを見ていきましょう。
ソリューションをビルドする場合、手動による方法と、プロセスを自動化するツールを使用する方法の 2 種類があります。ツールを利用すると時間と作業量が大幅に減るので、いつもはツールを愛用しています。しかし、今回はそれよりもこれらのツールが自動的にどのような処理を行っているのかを理解することの方が重要ですので、手動によるプロセスを説明します。「Additional Resources」では、このプロセスの面倒な処理を引き受けてくれるツールのリンクをいくつか紹介しています。
メモ : |
---|
この記事では、コンポーネントのニーズを満たすようにソリューションをビルドする方法に焦点を合わせます。一般的なソリューションのビルド方法に関する役立つ記事については、MSDN マガジン 2007 年 8 月号に掲載されている Ted Pattison の Office Space コラム「SharePoint 2007 を使用したソリューション展開」を参照してください。 |
マニフェスト ファイル
マニフェスト ファイルでは、ソリューションとそのソリューションを構成するすべての要素の一覧が定義されます。Feature.xml や Workflow.xml のように、ソリューションのマニフェスト ファイルは XML ファイルですが、これはソリューション スキーマに従っています。サンプル マニフェスト ファイルは、次のような内容になります。
xml version="1.0" encoding="utf-8" ?> <Solution xmlns="" SolutionId="79deac59-22ab-da1e-9d7a-1732d31cbe07" > <Assemblies> <Assembly DeploymentTarget="GlobalAssemblyCache" Location="CaseTrak.Activities.dll" /> Assemblies> <TemplateFiles> <TemplateFile Location="1033\Workflow\CaseTrak.ACTIONS"/> TemplateFiles> <FeatureManifests> <FeatureManifest Location="CaseTrak_Activities\Feature.xml"/> FeatureManifests> Solution>
表 3 は、Manifest.xml ファイルの要素に関する詳細です。
表 3. Manifest.xml ファイルの要素
要素 | 説明 |
---|---|
SolutionId | ソリューションを一意に識別する GUID。 |
Assemblies | ソリューションの一部であるすべてのアセンブリにノードを 1 つ追加するために指定します。 |
DeploymentTarget | ソリューション インストーラに DLL の配置場所を伝えます。有効なオプションは、WebApplication または GlobalAssemblyCache です。 |
Location | ソリューション インストーラに DLL の検索場所を伝えます。 |
TemplateFile | この例では、ソリューション インストーラに, .wsp ファイル内での、作成した ACTIONS ファイルの検索場所、そしてまたファイル システム上でそれを置き換える必要がある場所を伝えます。このパスは、TEMPLATE フォルダに対する相対パスです。 |
FeatureManifest | ソリューション インストーラに Feature.xml ファイルの検索場所を伝えます。 |
このサンプル マニフェスト ファイルの説明はこれで終了です。この他にも使用可能なオプションが多数あります。興味がある場合は、「ソリューション スキーマ」でスキーマ ファイルを確認できます。
ディレクティブ (.ddf) ファイル
.ddf ファイルは、作成したソリューションのビルドに必要な最後の部分です。このファイルは、作成したソリューション ファイルの構造を定義するために使用されます。.wsp (ソリューション) ファイルのビルド プロセス中に、MakeCAB ユーティリティ (これについては後ほどさらに説明します) によって .ddf ファイルが読み取られ, .ddf に指定されているとおりにすべてのファイルがパッケージ化されます。
メモ : |
---|
ソリューション ファイルには拡張子 .wsp が付いていますが、このファイルは拡張子が異なるただの標準的な .cab ファイルにすぎません。拡張子を .cab に変更すると、Windows エクスプローラでファイルを開いて中を確認できます。 |
サンプル .ddf ファイルは次のような構造になっています。
;************* ; This .ddf file specifies the structure of the .wsp solution cab file. ;************* .OPTION EXPLICIT .Set CabinetNameTemplate=CaseTrak_Activities.wsp .Set DiskDirectoryTemplate=CDROM .Set CompressionType=MSZIP .Set UniqueFiles="ON" .Set Cabinet=on .Set DiskDirectory1=Package manifest.xml manifest.xml bin\debug\CaseTrak.Activities.dll CaseTrak.Activities.dll RootFiles\TEMPLATE\FEATURES\CaseTrak_Activities\feature.xml CaseTrak_Activities\feature.xml RootFiles\TEMPLATE\1033\Workflow\CaseTrak.ACTIONS 1033\Workflow\CaseTrak.ACTIONS
ファイルの上部は, .wsp ファイルの生成方法を構成するいくつかの変数を設定する部分ですが、おおむね見たままの意味になります。表 4 は, .ddf ファイルの要素の説明です。
表 4. .ddf ファイルの要素
要素 | 説明 |
---|---|
CabinetNameTemplate | 結果として生成される .wsp ファイルの名前を指定します。 |
DiskDirectoryTemplate | 生成されるすべての .cab ファイルを単一ディレクトリに配置します。 |
CompressionType | ファイルの圧縮に使用するアルゴリズムを指定します。 |
UniqueFiles | .cab ファイルに含まれるすべてのファイルに一意の名前を使用します。 |
DiskDirectory1 | .cab ファイルを配置するサブディレクトリを指定します。 |
通常, .ddf ファイルの上部は、ビルドするすべてのソリューションで同じです (CabinetNameTemplate パラメータを除く)。
ファイルの残りの部分は、ビルドする個々のソリューションごとに一意です。ここでは, .wsp ファイルにパッケージ化するファイルと、次の情報を指定します。
- 各行の最初の部分は、MakeCAB がファイルを読み取って .cab ファイルに追加できるようにするための、ソースの場所です。
メモ : この場所は、現在のディレクトリに対する相対パスです。通常、現在のディレクトリは .ddf ファイルの場所または MakeCAB ユーティリティの場所になります。
各行の 2 つ目の部分は, .cab ファイル内での各ファイルの保存先を指定します。前の例では、次のようになります。
- Manifest.xml ファイルと DLL は, .cab ファイルのルートに配置されます。
- Feature.xml ファイルは、フィーチャー (
CaseTrak_Activities
) フォルダのルートに配置されます。 - ACTIONS ファイルは、フォルダ パス
1033\Workflow
に配置されます。ソリューションの展開時には、この場所が Manifest.xml の TemplateFile 要素で参照されます。これは、\Template
フォルダに対する相対パスです。
作成する .ddf ファイルのファイル部分では、各行にソースと配置先のペアを指定することが重要です。上の一覧では、便宜上 2 行に分けて表示していますが、これは単に読みやすくするためです。
メモ : |
---|
ベスト プラクティスとしてよく行われるようになっているのは、Visual Studio ソリューション内で、SharePoint 12 フォルダ ("WSS ルート" または "12 ハイブ" とも呼ばれます) の構造と一致するフォルダ構造を作成する方法です。必ずしもこの方法で作業する必要はありませんが、ここではこの方法を採用しました。また、「Additional Resources」で推奨されているさまざまなツールでも同様の方法に従っています。 |
この .ddf ファイルが適切に機能するのに必要なファイル システム構造を理解するため、図 14. を参照してください。ここに表示されているのは、すべてのフォルダとファイルを DDF と同じように配置したプロジェクトのビューです。これらが、MakeCAB ユーティリティによって検索されます。Visual Studio 内でこのファイル構造を再作成し、ファイルを適切な場所にコピーしてください。Utilities フォルダに含まれているのは、ソリューション ファイルのビルドとテストに使用するいくつかのバッチ ファイルと、MakeCab.exe アプリケーションです。Microsoft Cabinet SDK の一部である MakeCAB.exe のコピーをダウンロードする方法については、「Additional Resources」を参照してください。このソリューションの残りの部分は、この記事用のソース コード ダウンロードで入手できます。
図 14. ソリューションに必要なディレクトリ構造
これで .ddf ファイルが完了しました。続いて .wsp ファイルのビルドに移ります。
ソリューション ファイルをビルドする
最後の手順では、実際にソリューション (.wsp) ファイルをビルドします。これまで、ソリューション内のファイルの作成方法と必要なファイル構造について確認してきました。次に、ソリューション ファイルを作成できます。今回は手動でマニフェスト ファイルとディレクティブ ファイルを作成したので、Microsoft Office SharePoint Server 2007 SDK で提供されている PostBuildActions.bat ファイルの機能を活用できません。単に Windows SharePoint Services または SharePoint Server を使用する場合、どちらにせよ、これを使用しないので今回は特に問題ありません。つまり、どの SharePoint バージョンを使用するかにかかわらず、プロセスを 1 つだけサポートする必要があります。
.wsp ファイルのビルドは、MakeCAB.cmd ファイル (ソース コード ダウンロードで入手できます) 内の 2 行で簡単に行うことができます。
cd .. Utilities\MakeCab /F CaseTrak_Activities.ddf
このバッチ ファイルを実行したら, .wsp ファイルがプロジェクト フォルダ内の DeploymentFiles\Package
ディレクトリで使用可能になります。.wsp ファイルの内容を確認する場合は、単にファイルの拡張子を .cab に変更して、ファイルを Windows エクスプローラで開きます。確認が終了したら、拡張子を元に戻すことを忘れないでください。
展開を完成させる
展開の説明で最初に述べたように、ワークフロー コンポーネントの展開プロセスにおいては、外観が本格的であり、かつアプリケーション展開の残りの部分と調和したものであることが重要です。このため、展開に使用する通常のバッチ ファイル (ソリューション パッケージのテストに役立つ、ソース コード ダウンロード内の Deploy.cmd ファイルと UnDeploy.cmd ファイルを含む) では不十分です。代わりに、もう少し洗練されたものを探す必要があります。いくつかのオプションのリンクについては、「Additional Resources」を参照してください。
今回は、何が行われているのかを理解できるように、処理を手動で行う方法を説明しました。ソース コード ダウンロードには 3 つの .cmd ファイルがあるので、それらを開いて、内部で実行されている手順を確認することを強くお勧めします。これにより、どのような処理が行われているのかを理解しやすくなり、ツールの使用を開始したときに、ツールによる自動処理の内容を把握してその真価を認めることができるようになります。
ここまで読み進めてこられたので、カスタム アクティビティ、アクション、および条件を構築する際の作業について、大分理解が深まっているかと思います。そこで、良いお知らせがあります。新たなビルドを行う都度、繰り返し面倒な作業をすべて行う必要はありません。CodePlex では、コミュニティで開発された STSDev というツールが提供されています (「Additional Resources」に直接のリンクがあります)。このツールでは、ウィザード形式のインターフェイスを使用していくつか設定を選ぶオプションがあり、次のような必要なすべてのデータが揃った完全なアクティビティ、アクション、または条件を生成できます。
- スタブ メソッドが配置された、5 つの Activity クラスすべて
- 独自の ACTIONS ファイル
- web.config ファイルに AuthorizedType エントリを追加するためのフィーチャー レシーバ
- すべての展開ファイル (Feature.XML、Manifest.XML, .ddf、および .wsp)
時間を節約して、いら立ちを解消するために、このツールを使用することを強くお勧めします。
ここまで長い道のりでしたが、無事やり遂げました。これですべて終了です。この記事の導入部分では、どのような方向で進んでいくのかについて、漠然としたアイデアが見える程度でしたが、多くの期待があった反面、内容が難しいものになるかもしれないという少しの不安もありました。しかし、ここまで来てみると、結局のところ、内容がそれほど込み入ったものにはならなかったのは幸いでした。
途中、SharePoint Designer と Visual Studio のどちらをサポートするのかという問いに答える形で、実際には両方ともサポートする必要があるということを理解しました。また、Visual Studio のアクティビティ、そして SharePoint Designer のアクションと条件を学習し、3 つすべての作成プロセスを確認すると共に、それらを、並の開発者が作成するような平凡なコンポーネントとは一線を画する、ひときわ優れたものにすることを説明しました。最後に、締めくくりとして、コンポーネントをパッケージ化する方法に触れ、残りのアプリケーションと共に簡単に展開できるように、すべての外観を磨き上げて本格的なインストールにすることを学びました。午後に取り組む作業としては上出来です。
真剣な話、SharePoint のワークフロー拡張能力は、アプリケーション プラットフォームとして SharePoint の最も胸躍る機能の 1 つであり、ISV が本気で検討するに値するものです。SharePoint のワークフローを拡張することによって、エンタープライズ クラスのワークフロー エンジンを足場として、その能力と勢力範囲を自社アプリケーションに簡単に取り込むことができます。SharePoint 製品とテクノロジは、Microsoft プラットフォームの至宝とも言うべき存在であり、そのプラットフォームに乗って、その上で開発できるようになることで、自社アプリケーションの価値はいっそう高まることでしょう。
この記事では、今回目的としたタスクに直接的には関係しない、さまざまなトピックについて言及しました。検索エンジンで有益なリソースを探す手間を省くため、ここでは必要な情報を見つけるのに役立つリンクをいくつか紹介します。
0 コメント:
コメントを投稿