マニフェスト

要約:
  • Curl IDE はマニフェスト ファイルを作成し、IDE プロジェクトの一部として管理します。
  • 必要に応じてユーザーがマニフェストを編集することもできます。
  • マニフェストファイルはアプリケーション リソースを管理そして共有し、アプリケーションを配置する際に役立ちます。

概要

Curl アプリケーションは、1 つのアプレットまたはスクリプトと、複数の関連パッケージ、グラフィック イメージ、オーディオ ファイルまたはその他のリソースで構成することができます。これらのリソースは、多くのソース ファイルで使用され、複数のアプリケーションで共有される場合があります。
アプリケーションが、開発、テスト、ディプロイメントのプロセスを経過するにつれて、このようなリソースの場所が変更されることがあります。マニフェストは、関連する複数の Curl アプリケーションまたはライブラリのリソースを管理するために使用する特殊な Curl ソース ファイルです。マニフェスト ファイルは .mcurl 拡張子を使用します。プロジェクトの作成時に Curl IDE は、プロジェクトの作成時に、マニフェスト ファイルを自動的に作成し、ユーザーがプロジェクトにリソースを追加または削除する毎に、マニフェスト ファイルを管理します。必要に応じて、ユーザーがマニフェストファイルを手動で編集することもできます。
applet 宣言や script 宣言を使用して、マニフェスト ファイルの名前を manifest 引数に設定することで、マニフェストを指定することが出来ます。IDE は、以下のサンプル コードで示すように、自動的にマニフェストの記述を、プロジェクトで作成される全てのアプレット ファイルに追加します。
applet または script 宣言のmanifest キーワードで、マニフェスト ファイル名を指定します。IDE は、次の例のように、マニフェスト指定をプロジェクト内で作成されたアプレット ファイルに自動的に追加します。
{curl 8.0 applet}
{applet 
    manifest = "manifest.mcurl",
    {compiler-directives careful? = true}
}
マニフェストを指定するアプレットやスクリプトは、自動的にマニフェストを使用して、明示的にパッケージの場所が指定されていないパッケージの import ステートメントを処理します。マニフェストに指定された場所を特別にオーバーライドする必要がない限り、ソース コードに直接パッケージの場所を指定しないでください。次に、アプレットとそのマニフェストの例を示します。
アプレット:
{curl 8.0 applet}
{applet 
    manifest = "manifest.mcurl",
    {compiler-directives careful? = true}
}
{import * from DOC.LOGO}

{value
    {show-logo}
} 
マニフェスト:
{curl 8.0 manifest}
{manifest APPLET-PROJECT}

{component file start.curl,
    location = "start.curl"
}

{component package DOC.LOGO,
    location = "load.scurl"
}

{component directory images,
    location = "images"
}
また、マニフェストを使用して、ユーザーコード内に他のリソース ファイルの URL を直接指定せず、 manifest-url プロシージャを介してこれらの場所を定めることもできます。

マニフェスト ファイルの構造

マニフェスト ファイルは、有効な Curl API バージョンを指定しマニフェストとして識別される curl ヘラルドで開始する必要があります。任意の manifest ステートメントを続けて記述することもできます。manifest ステートメントでは、マニフェスト名および付加的なメタデータを提供することができます。マニフェストでは、パッケージと同様の命名規則を使用することをお勧めします。「パッケージの命名」 を参照してください。IDE では、マニフェスト名はプロジェクトのルート ノード名となります。既定のマニフェスト名はプロジェクトとなります。
|| File:  manifest.mcurl
{curl 8.0 manifest}
{manifest PROJECT}
上記のマニフェストの残りの部分に以下の情報を含めることもできます。

マニフェストのコンポーネント

component ステートメントの構文は以下のとおりです。
構文:{component component-type COMPONENT.NAME,
    location = {url "path"} [, ...]
    [, name = value [, ...] ]
}
説明:
component-typeコンポーネントの型を指定します。appletpackagemanifest および scriptなどの標準 Curl コンポーネント型が Curl では提供されています。他のコンポーネント型を表す有効な識別子を使用することもできます。IDE では、ファイル リソースには file を、ディレクトリ リソースには directory を使用します。
COMPONENT.NAMEコンポーネント名を指定します。これはドットで区切られた 1 つ以上の有効な Curl 識別子で構成される複合名(例:DOC.NAME)になる場合があります。
location =
{url "path"}
コンポーネントの場所を指定します。path は、絶対 URL を表す文字列、またはこのコンポーネント ステートメントがあるファイルの URL の相対パスのいずれかになります。最低 1 つはこのような場所を指定する必要があります。複数の場所の指定も可能です。
name = valueコンポーネントの任意のメタデータを追加指定します。name は有効な Curl 識別子で、value は適切な型の有効なメタデータ値です。
component-type および COMPONENT.NAME は、マニフェストに表記されているコンポーネントを位置付けるための主要なキーになります。パッケージのような Curl コンポーネントは、COMPONENT.NAME が、ソースで宣言されているコンポーネント名と同一である必要があります。他のコンポーネント型には任意の名前を与えることもできます。マニフェストに、リソースの全ての属性を表記する必要はありませんが、マニフェストを使用するコンポーネントの位置付けでは、マニフェスト内でリストされた属性のみが使用されます。
パッケージでは、component 宣言で指定されたメタデータ値は パッケージの実際のメタデータ と一致しなければなりません。一致しない場合はパッケージがロードされるときにエラーが発生します。たとえば、次のようにパッケージ MY-PACKAGE がバージョンを 1.2 と宣言した場合、
{curl 8.0 package}
{package MY-PACKAGE, version = "1.2"}
対応する component 宣言では同じバージョン番号を指定するか、または完全にこれを省略します。

以下は正しいエントリです。
{curl 8.0 manifest}
|| These entries are ok:
{component package MY-PACKAGE,
    version = "1.2",
    location = {url "my-package.scurl"}
}
{component package MY-PACKAGE,
    location = {url "my-package.scurl"}
}
以下のエントリは実際のパッケージと一致していません。
{curl 8.0 manifest}
|| This one is inconsistent with the actual package:
{component package MY-PACKAGE,
    version = "1.3",
    location = {url "my-package.scurl"}
}
curl-versions のリストをユーザーが明示的に提供しない限り、component の宣言が含まれているマニフェストファイルの curl ヘラルド中のバージョンと同じバージョンだと推定されます。
マニフェストでは component を二重宣言することができます。通常、一致したものが複数ある場合は新しいバージョンのコンポーネント宣言が古いものより優先されます。それ以外の場合はマニフェストの最初のアイテムが優先されます。

マニフェストのデリゲート(委譲)

マニフェストは delegate-to を使用して他のマニフェストに委譲することができます。
{delegate-to MORE-COMPONENTS, location = "more-components.mcurl"}
delegate-to (委譲先)リソースがプロジェクトに追加された際に、IDE は delegate-to ステートメントをプロジェクト マニフェストに追加します。
Curl RTE は、委譲先マニフェストに、必要とされているリソースが見つからない場合、各委譲先マニフェストを順に検索します。委譲先のマニフェストのヘラルドは、委譲元のマニフェストと、少なくとも一つの APIバージョンが共通している必要があります。例えば、以下のヘラルドを持つマニフェスト A

{curl 2.0 manifest}
{manifest A}


次にあるマニフェスト B に委譲することができますが、

{curl 2.0, 2.1 manifest}
{manifest B}


AC に委譲することはできません。

{curl 2.1 manifest}
{manifest C}
さらに、Curl RTE は、現在のアプレットまたはスクリプトを評価するための Curl API バージョンが含まれていないマニフェスト ヘラルドを、エラーを生成せずに無視します。 前記の例では、マニフェスト AB に委譲でき、BC に委譲することが可能でした。しかし、2.0 API を使用している場合は、A または B によるルックアップでは、C の内容は一切使用されません。
これらの規則は、現在アクティブな Curl API のバージョンに基いてコンポーネントを選択するのを容易にするために設けられています。

マニフェストのインクルード

マニフェスト ファイルは、include を使用して、他のファイルの内容をインクルードすることもできます。
{include "more-components.mcurl"}
インクルードされるファイルには、マニフェストファイルで有効な式が含まれている必要があります。付加的な component 宣言または互換性のあるcurl ヘラルドを含む別のマニフェスト ファイルを含むソース ファイルを含めることができます。
デリゲーションに関しては、インクルードされるマニフェストのヘラルドに、それをインクルードするマニフェストと共通する API バージョンを少なくとも 1 つ含める必要があります。たとえば、次のようなヘラルドを持つマニフェスト A の場合、

{curl 2.0 manifest}
{manifest A}


は、次のようなヘラルドを持つマニフェスト B をインクルードできますが、

{curl 2.0, 2.1 manifest}
{manifest B}


次のにあるマニフェスト C をインクルードできません。

{curl 2.1 manifest}
{manifest C}
さらに、Curl RTE は、現在のアプレットまたはスクリプトを評価するための Curl API バージョンが含まれていないマニフェスト ヘラルドを、エラーを生成せずに無視します。前記の例では、マニフェスト AB をインクルードでき、BC をインクルードすることが可能でした。しかし、2.0 API を使用している場合は、C の内容は一切使用されません。
また、component 宣言が明示的に curl-versions を指定していない場合、直接それをインクルードしているマニフェストのヘラルドで宣言されている API バージョンのリストから値を継承します。たとえば、マニフェスト B で宣言されたコンポーネントは、B が直接ロードされたか、あるいは A にインクルードされた結果としてロードされたかにかかわらず curl-versions に 2.0 と 2.1 という値を取得します。

マニフェストを使用したパッケージの位置付け

マニフェストを指定する applet または script は、マニフェストを使って、明示的な場所を使用しないでインポートするパッケージを位置付けます。マニフェストは、パッケージのエントリを一つ含むか、または、インクルードまたはデリゲーションによって参照する必要があります。
ソースコードに明示的に記述されているパッケージの場所が、マニフェストに記述されている場所をオーバーライドします。そのため、import ステートメントでは location キーワードを使用できません。さらに、import-package と使用される ComponentSelector は、location-hints を指定できません。
import で指定された version 番号や他のメタデータ属性は、マニフェストの component 宣言と一致する必要があります。コンポーネント宣言では、インポートで使用されるメタデータ値のすべてを宣言する必要があります。
RTE は以下のプロシージャを使って、マニフェストのデータからパッケージのインスタンスを検索します。
  1. パッケージの名前、バージョンおよびそのパッケージ特有の他のメタデータ属性が import ステートメントから取得されます。現在のアプレットやスクリプトを実行するのに使用されている Curl API のバージョンも記録されます。
  2. マニフェスト内で、"package" のコンポーネント型を持つエントリを識別し、要求された名前、バージョンおよび他の指定された属性に一致するエントリを検索します。マニフェストで直接マッチするものがない場合、見つかるまでそのデリゲートマニフェストが順に検索されます。複数のマッチが見つかる場合もありますが、それらは常に同じマニフェストに属しています。なぜなら、1つのマニフェストでマッチが見つかると、他のデリゲートマニフェストでの検索が停止されるからです。一致するものがなく、さらに、属性が CURL.LANGUAGE.REGEXP などの組み込み型パッケージの 1つと一致する場合は、そのパッケージが使用されます。それ以外の場合は、インポートはエラーになります。
  3. 複数のマッチがある場合は、最新のバージョン番号の含まれるものが優先されます。
  4. さらに複数の一致がある場合は、マニフェスト ファイルで最初に宣言されたものが使用されます。

委譲先マニフェストを示すルートマニフェストの使用

Curl 7.0では、delegate-to ステートメントで指定された委譲先マニフェストは、delegate-to ステートメント内で明示されている場所を介してではなく ルート マニフェスト 内のエントリを検索することで間接的にその場所を定めます。これにより、全てのマニフェストの委譲先を書き換えるのではなく、アプレットのメイン マニフェストを介して、委譲された全てのパッケージの場所を定義することが出来ます。
root manifest は、通常、applet/script 宣言内で記述されるマニフェストです。しかしながら、import-manifest プロシージャによって、直接または、間接的にロードされたマニフェストにおいて、ルート マニフェストは、そのプロシージャによって返されるマニフェストか、対応するキーワード引数で明示的にルート マニフェストとして指定されたマニフェストのいずれかになります。
マニフェストのロード中にdelegate-to宣言の解決を行っている時、ルート マニフェスト(委譲するマニフェストではなく)は、delegate-to内で記述された情報にマッチする component宣言を探します。delegate-to内で明示的に場所が指定されていない時または、componentエントリに
override? = true
が記述されている時のいずれかで、委譲されたマニフェストをロードする為に、エントリのマッチングからの場所が使われます。
例えば、マニフェストBが宣言を使ってマニフェストCに委譲し、

{delegate-to C, version = "2.3"}


かつルート マニフェストが以下の宣言を含むと

{component C,
    version = "1.0",
    "../C/v1-0/manifest.mcurl"
}

{component
    version = "2.3",
    "../C/v2-3/manifest.mcurl"
}


Cは、パス"../C/v2-3/"からロードされます。

以下を使用してBからCに委譲する時、

{delegate-to C, location = "../C/manifest.mcurl"}


delegate-to宣言に記述された場所が使われます。 ただし、以下のように、ルート マニフェストがオーバーライドするエントリを持っていた場合は除きます。

{component C,
    override? = true,
    location = "../C/v1-0/manifest.mcurl"
}

マニフェストを使用したリソースの位置付け

マニフェストは、パッケージ以外のリソース型の検索にも使用できます。これは、必要なリソースのエントリをマニフェストで作成し、場所の情報を取得する manifest-url 関数を使用することによって簡単に達成できます。
構文:{manifest-url "component-type", "COMPONENT.NAME"
    [, manifest = alternate-manifest ]
    [, comparison-proc = proc ]
    [, name = value [, ...] ]
}
説明:
component-typeマニフェストで与えられたものと同じコンポーネント型です。
COMPONENT.NAMEマニフェストで与えられたものと同じコンポーネント名です。
alternate-manifest検索されるマニフェストを指定します。既定では、get-default-manifest から返されるマニフェストですが、別のマニフェストも使用できます。別のマニフェストは、import-manifest への呼び出しで取得した ComponentManifest オブジェクトであることが必要です。
proc指定された属性と一致する複数のリソースの中から選択するための別の選択基準を指定します。既定では、一致するリソースで最新のバージョン番号を持つものか、またはマニフェスト ファイルで先に宣言されたものが選択されます。
name = valueターゲット リソースのメタデータ属性を追加指定します。
たとえば、アプレットが画像を表示する際に、その画像ファイルの場所を書き換え可能にする場合を仮定します。アプレットの作者はイメージに任意の名前を割り当て、一致するエントリをマニフェストに入力します。
{curl 8.0 manifest}
|| Old version of product diagram
{component image PRODUCT-DIAGRAM,
    mime-type = "image/gif",
    content-size = 28000,
    version = "1.0",
    location = "old-product-diagram.gif"
}
|| New versions
{component image PRODUCT-DIAGRAM,
    mime-type = "image/gif",
    content-size = 28000,
    version = "3.0",
    location = "product-diagram.gif"
}
{component image PRODUCT-DIAGRAM,
    mime-type = "image/jpeg",
    content-size = 48000,
    version = "3.0",
    location = "product-diagram.jpeg"
}
アプレットは直接その場所を参照しなくてもイメージを表示することができます。
{image source = {manifest-url "image", "PRODUCT-DIAGRAM"}}
上記のマニフェストでは、3.0 GIF バージョンのダイアグラムが最新バージョン番号であり、3.0 JPEG イメージより前に宣言されているので、これが選択されることになります。manifest-url 呼び出しで古いバージョンのイメージを指定するだけで、アプレットは古いバージョンのイメージも使用できるようになります。
{image
    source =
        {manifest-url "image", "PRODUCT-DIAGRAM",
            version = "1.0"
        }
}
また、MIME 型を指定すれば JPEG バージョンも使用できるようになります。
{image
    source =
        {manifest-url "image", "PRODUCT-DIAGRAM",
            mime-type = "image/jpeg"
        }
}
アプレットは、ユーザー設定や使用可能なネットワーク帯域幅などの実行環境の属性を考慮して選択基準をカスタマイズすることもできます。たとえば、アプレットは帯域幅が広いときは大きなイメージを優先し、 狭いときは小さいイメージを優先するようにできます。これは、カスタム セレクション関数を記述し、それを manifest-url に与えれば実現できます。
{let use-big-images?:bool = false}
|| Return true if first component is preferred over the second:
{define-proc {pick-image
                 s1:ComponentSelector, s2:ComponentSelector
             }:bool
    let constant diff:int = s1.content-size - s2.content-size
    {if s1.component-type == "image" then
        {if diff > 0 then
            {return use-big-images?}
         elseif diff < 0 then
            {return not use-big-images?}
        }
    }
    || Use default criterion:
    {return {ComponentSelector.prefer-first? s1, s2}}
}
...
{image
    source =
        {manifest-url "image", "PRODUCT-DIAGRAM",
            comparison-proc = pick-image
        }
}
           
IDEドキュメンテーションに、IDEでマニフェストを使ってアプリケーションを構成そしてディプロイする詳細情報が含まれています。

マニフェストを使用した翻訳ファイルの位置付け

マニフェストを使用して翻訳ファイルを配置することは、他のリソースを配置することに似ています。パッケージ、ロケールとそれらに対応した翻訳ファイルを記述した項目を追加してください。例えば、COM.EXAMPLE.DOCという名前のパッケージに対する英語と日本語の翻訳ファイルを記述する為には、以下の項目をプロジェクトのマニフェストに追加してください。
{component translations  COM.EXAMPLE.DOC,
    locale="en",
    location="resources/en/messages.xml"
}
{component translations COM.EXAMPLE.DOC,
    locale="ja",
    location="resources/ja/messages.xml"
}
以下の項目は、デフォルトの翻訳ファイルが英語であることを示しています。
{component translations COM.EXAMPLE.DOC,
    locale="default",
    location="resources/en/messages.xml"
}

関連項目へのリンク

次のリファレンスをクリックして、マニフェストの使用に関するその他の説明を参照してください。
構文基本 API拡張 API
curlappletComponentManifest
manifestscriptComponentSelector
componentimportget-default-manifest
delegate-tomanifest-urlget-empty-manifest
includefind-resourceimport-manifest
import-package