AppliStation ソフトウェアリスト 1.0 仕様 (草稿第3版)

バージョン1.0 Editor's Draft Rev 3
このバージョンhttp://sourceforge.jp/projects/applistation/wiki/ListFormatSpec%2FAppliStationNativeSoftwareListFormatSpec1Draft1
編者user:ttp

Content is available under a Creative Commons License - Attribution-Share Alike 2.1 Japan (CC BY-SA 2.1).


概要

本書は、AppliStation で使用されるソフトウェアリストの仕様を記したものである。 本仕様に沿ってソフトウェアリストを作成することで、AppliStation のソースコードを解析しなくとも、誰にでもソフトウェアリストを作成し提供できるようにするべく執筆した。

Editor's Draft

本書は、Editor's Draftである。

本書の正式リリース版がAppliStation ソフトウェアリスト 1.0 仕様として公開されている。



はじめに

本書の構成

本書の構成は次のとおり

  • ソフトウェアリストの概説
    • この概説部分では、ソフトウェアリストの概念、AppliStation との関係などを説明する。
  • 適合条件
    • この部分では、ソフトウェアリストの配置の方法や、 ソフトウェアリストを XML で符号化することについて規定する。
  • データ形式, 要素
    • このリファレンス部分では、XML で書かれるソフトウェアリストの要素および属性すべてが定義されている。 各要素ごとに対応する Relax NG の文書型定義の断片も引用している。
  • 文書型定義 (Relax NG Compact Schema)
    • Relax NG Compact Schema による文書型定義。 実際に Relax NG で validation check を行うときに使用する。

本書の編集方針

本仕様は AppliStation のバージョン1.3.*の実装仕様に準じている。 しかし AppliStation で実装されているソフトウェアリストの構造を記したものではなく、そのサブセットである。 AppliStation で実装されるソフトウェアリスト仕様が更新されたとしても、本書で規定される仕様に沿って作成されたソフトウェアリストは取り扱えるよう互換性を保って実装される。 そのため、AppliStation でソフトウェアリストの構造が更新されたとしても、常に本書が更新あるいは本仕様の上位バージョンが作成されるわけではない。

著作権の覚書

本仕様はクリエイティブ・コモンズ 表示-継承 日本の下で利用可能である。

ソフトウェアリストの概説

ソフトウェアリスト

無償なソフトウェアもしくはある組織内で自由に使用可能なソフトウェアをダウンロード・インストールを簡単に行うためには、それらに必要な情報を含んだソフトウェア情報が必要である。 ソフトウェアリストは複数個のソフトウェア情報を含んだリストである。 ソフトウェアリストによって、複数のソフトウェアを簡単にダウンロード・インストールすることができる。

ソフトウェア情報とは具体的には下記のとおりである:

  • ソフトウェア名称
  • ソフトウェアバージョン
  • ソフトウェアのダウンロードリンクおよびこれのメタ情報
  • ソフトウェアに関するメタ情報(説明やタグ情報など)

ソフトウェアのインストーラーファイルは、クライアントのOSやアーキテクチャーの差異によって別々のインストーラーファイルが必要となる場合がある。 このとき、ソフトウェア情報は複数個のダウンロードリンクの情報をもつこととなる。

AppliStation ソフトウェアリスト

ソフトウェアリストは、本書で規定されるようにXMLファイルで記述される。 このXMLの形式を AppliStation ソフトウェアリスト と称し、バージョンを 1.0 とする。

ソフトウェアリストの利用

ソフトウェアリストおよびソフトウェアリストは AppliStation のために作成され使用されるものである。 しかし、AppliStation 係る用途以外への使用を禁止するものではない。 AppliStation のコードを使用する場合そのライセンスに従う必要があるが、本仕様のみを参照し実装する場合はこの限りではなく自由に使用できる。

適合条件

ソフトウェアリストは本書で規定される AppliStation ソフトウェアリスト とよばれる形式の XML で記載される。

リソース

ソフトウェアリストは、インターネットおよびイントラネットを通じての伝送、あるいはローカルのファイルとして提供される。

ソフトウェアリストのリソースは、RFC1738 で規定される URL で指し示されなければならない。 クライアントはその URL にアクセスし常に最新のソフトウェアリストを取得できるようにするべきである。

MIME Type は、一般の XML ファイルと同様に、「application/xml」を使用すべきである。

本仕様で規定する形式では、ソフトウェアリストの伝送に必要な圧縮は提供しない。 HTTPプロトコルで提供される圧縮転送によって実現できるためである。

XML

AppliStation ソフトウェア 1.0 は、妥当な XML 文書として符号化される。

XML 宣言は1行目に記載し、DTD 宣言は省略すべきである。 本仕様では、DTD ではなく RelaxNG をスキーマ言語として利用しているため、DTD 宣言を推奨しない。

文字コード

ソフトウェアリストの推奨文字コードはUTF-8である。

データ形式

ここでは、要素の内容や属性の値として使用される基本データ形式について説明する。

テキスト列

text は、人間が読んでわかる普通のテキストを示す。

URL

url         = xsd:anyURI

url は、URL のテキストを示す。

一般には http:// もしくは ftp:// といったインターネット上のリソースの位置を指定するが、ローカルまたは閉じられたネットワーク内でソフトウェアリストを使用する場合、file: を使用してもよい。 例えば \\server\path\to\file.foo という Windows 共有ネットワーク (Samba) 上にあるリソースを file://server/path/to/file.foo と URL で指定して使用してもよい。

ソフトウェア識別名称

idname      = xsd:string {
    pattern = """[^/\\\?\*:|"<>]+"""
}

idname は、人間が読んでわかるソフトウェア名称を示す。

以下の記号を含んではならない:

  • /
  • \
  • ?
  • !*
  • :
  • |
  • "
  • <
  • >
  • 制御文字

ソフトウェア名はソフトウェアリストで一意である必要があり、ソフトウェア情報の識別子としても利用される。

ソフトウェアリストが供される対象がファイル名の大文字小文字を区別しない(Windows)環境を前提とするため、大文字小文字のみが異なる別種のソフトウェアは存在してはならない。

正規表現文字列

regexpText  = text

regexpText は、正規表現文字列を示す。

エントリー名称

entryName   = (
    idname  |
    xsd:string {
        pattern = "/[^/]+/"
    }
)

entryName は、ソフトウェア識別名称、またはそれを指し示す正規表現文字列である。

entryName の形式は 2 つある。 1 つ目は、ソフトウェア識別名称そのものを示す。 2 つ目は、正規表現であり、/ で始め、/ で終える文字列である。 2 つ目の形式では、その正規表現にマッチするソフトウェア識別名称のソフトウェアのいずれか1つを指し示すことを意味する。

要素

ルート要素とソフトウェアリスト名称

PackageList 要素

# Name space.
namespace p = "http://diffshare.tv/xmlns/2007/na-get/PackageList/"

# Root element is PackageList.
start = PackageList

PackageList = element p:PackageList {
    element p:Name {
        text
    },
    Package+
}

名前空間として http://diffshare.tv/xmlns/2007/na-get/PackageList/ を指定する。 もはや http://diffshare.tv/ は AppliStation の所有物ではないが、互換性のため上記のように指定しなければならない。

XML宣言の後のすべての要素は、ルート要素である PackageList の中に含まれる。 したがって、典型的な AppliStation ソフトウェアリスト としては下記のような構造を取る。

<?xml version="1.0" encoding="UTF-8"?>

<PackageList xmlns="http://diffshare.tv/xmlns/2007/na-get/PackageList/">
  <Name>ソフトウェアリスト名称</Name>
  <Package>
    <Name>Foobarbaz</Name>
    <Version>1.0</Version>
    <Summary>This is a short description</Summary>
    <Url Href="http://example.com/foobar"/>
    <Tags>foo bar baz</Tags>
    <Type>archive</Type>
    <Installer>
      <Url Href="http://example.com/foobar/foobar-1.0.zip"/>
      <Platform Arch="X86"/>
    </Installer>
  </Package>
  <!-- 他のソフトウェア情報 (Package 要素) が後に続く -->
</PackageList>

Name 要素 (PackageListの子要素)

PackageList = element p:PackageList {
    element p:Name {
        text
    },
    Package+
}

ソフトウェアリストの名称を示す。 この名称は、ソフトウェアリストの人間が読めるような識別名称として使われる。

AppliStation ソフトウェアリスト は必ずこの要素が記述されてなくてはならない。

なお、歴史的事情によりこの Name 要素は、Package 要素の子要素の Name 要素と若干異なる。

ソフトウェア情報

Package 要素

Package = element p:Package {
    Name                    &
    Version                 &
    Summary?                &
    Description?            &
    Url?                    &
    Type                    &
    ArchivedInstaller?      &
    UninstallerKey?         &
    SilentInstallArguments? &
    System32CopyFiles?      &
    Installer+              &
    Requires*               &
    Tags?                   &
    License?
}

ソフトウェア情報を示す。

Package 要素は、PackageList 要素の中に1個以上この要素が記述されてなくてはならない。

Name 要素 (Packageの子要素)

Name = element p:Name {
    idname
}

ソフトウェア名称を示す。ソフトウェア情報の識別名称としても使われる。

Name 要素は、Package 要素の中に1個記述されてなくてはならない。

Version 要素

Version = element p:Version {
    text
}

ソフトウェアのバージョンを示す。 バージョンの形式は各ソフトウェアのバージョニングに従う。 クライアント側のコンピューターにインストールされている同一のソフトウェアとバージョンを比較できるよう、主に英数字とコンマ (.) からなる文字列が技術上好ましい。

Version 要素は、Package 要素の中に1個記述されてなくてはならない。 ソフトウェアバージョンがたとえ提供されていなくとも、本要素が記述されていなければならない。

Summary 要素

Summary = element p:Summary {
    text
}

ソフトウェアの簡素な説明を示す。 どんなソフトウェアなのかがわかるような、1行程度で済む短く明瞭な説明を記載する。

Description 要素

Description = element p:Summary {
    text
}

ソフトウェアの説明を示す。 Summary 要素の説明よりも長い、複数行の説明を記載するのに使用される。

Url 要素 (Package 要素の子要素)

Url = element p:Url {
    attribute Href { url }
}
属性名概要
Hrefurl公式サイトへのURL

Url 要素は、そのソフトウェアの公式サイトの URL を示す。

Type 要素

Type = element p:Type {
    (
        "installer"     |
        "msi"           |
        "archive"       |
        "itself"        |
        "cannotinstall"
    )
}

ソフトウェアインストーラーの種類およびインストール手段を示す。

値は下記のいずれかでなければならない。

installerEXE実行ファイルのインストーラーファイル。ただし自己解凍ファイルは除く
msiMSI (Microsoft Windows Installer) ファイル
archiveアーカイブファイル、もしくは自己解凍書庫
itself単体の実行ファイルとして提供されていて、特にインストール作業は不要
cannotinstallインストール不要。インストールを禁止するために使う

インストーラーファイルがアーカイブファイルで圧縮された形で配布されるされるソフトウェアがある。 この場合、ArchivedInstaller 要素に true を指定した上で、インストーラーファイルの種類は、そのアーカイブファイルを展開して得られるインストーラーファイルを指定する。 例えば、Foobar-1.0.zip を展開すると Foobar-1.0.msi が得られる場合、ArchivedInstaller 要素に trueType 要素に msi を指定する。

Type 要素は、Package 要素の中に1個記述されてなくてはならない。

ArchivedInstaller 要素

ArchivedInstaller = element p:ArchivedInstaller {
    (
        "true" |
        "false"
    )
}

インストーラーファイルがアーカイブファイルの中に格納されている場合、true と指定する。

ArchivedInstaller 要素で true と指定されたソフトウェアは、アーカイブファイルの形でインストーラーファイルが配布される。 このアーカイブファイルを展開してからインストーラーファイルを処理する。 アーカイブファイルの中には、同一拡張子のインストーラーファイルは含んでいないのが好ましい。

ArchivedInstaller 要素は、省略可能であってそのとき false が指定されたとみなす。

UninstallerKey 要素

UninstallerKey = element p:UninstallerKey {
    regexpText
}

インストーラーでソフトウェアをインストールすると、Windows の「アプリケーションの追加と削除」に登録される。 この登録名を示すものであって、正規表現で与える。

一部ソフトでは「アプリケーションの追加と削除」に表示される登録名に、バージョン記述を含む場合がある。 この際にはバージョン名該当部はグループ化のためのカッコ付きで記入する。 例えばバージョン名に入る部分は、通常([0-9.]+)、または([a-z0-9.]+)といったような記述を行う。

通常は、クライアント側では既にインストール済みのソフトウェアのバージョンを取得するのに、「アプリケーションの追加と削除」に登録されたバージョン情報を参照する。 UninstallerKey 要素にバージョン名該当部のグループ(カッコで囲われた部分)があるとき、UninstallerKey 要素の正規表現にマッチした方のバージョン文字列の方を優先して認識する。

UninstallerKey 要素は、ソフトウェアインストーラーの種類がインストーラーまたはMSIファイルのとき Package 要素の中にいれるべきである。 それ以外の場合、UninstallerKey 要素は、無視されるので、Package 要素の中にいれないべきである。

SilentInstallArguments 要素

SilentInstallArguments = element p:SilentInstallArguments {
    text
}

サイレントインストールを行うためにインストーラープログラムに渡すコマンド引数を示す。

サイレントインストールの設定では、ユーザーへのフィードバックを指定できる場合がある。 このとき、サイレントインストールの進捗のみは見えるようにするべきである。

ソフトウェアインストーラーの種類が MSI のとき、コマンド引数は msiexec の引数であって、既知であるので、SilentInstallArguments 要素は無視されるので、Package 要素の中にいれないべきである。

ソフトウェアインストーラーの種類が アーカイブファイルもしくはそれ自体が単体のファイル のとき、マニュアル操作する手段がそもそも提供されないため、常にサイレントインストール相当となる。したがってこのとき、SilentInstallArguments 要素は無視されるので、Package 要素の中にいれないべきである。

System32CopyFiles 要素

System32CopyFiles = element p:System32CopyFiles {
    text
}

ソフトウェアインストーラーの種類が アーカイブファイルのとき、他のソフトウェアからも使用されるのを意図する実行ファイルや動的リンクライブラリ(DLL)をワイルドカードで示す。

Requires 要素

Requires = element p:Requires {
    Entry+
}

Requires 要素は、ソフトウェアの動作に必要とされるソフトウェアを示す。

動作に必要なソフトウェアの名称を Requires の子要素 Entry で列挙する。 クライアントに対して、このソフトウェアをインストールする前にこれらの依存関係のソフトウェアをインストールするよう指定できる。 例えば、FooBar という名称の両方のソフトウェアが動作に必要な場合下記のように記述する。

<Requires>
  <Entry Name="Foo" />
  <Entry Name="Boo" />
</Requires>

Tags 要素

Tags = element p:Tags {
    text
}

ソフトウェアの分類やキーワードをスペース区切りで示す。

個々のキーワードの仕様は定めない。

検索のために使うメタデータとしての利用を想定するため、分類のほかに検索キーワードとして適切なもの(別名など)を指定する。

License 要素

License = element p:License {
    text
}

ソフトウェアのライセンスについて示す。

ソフトウェアのライセンスが GPL など有名で汎用なものである場合は、それがわかる文字列を示すべきである。 例えば、GPL, GPLv2, GPLv3, LGPL, LGPLv2, LGPLv3, AGPLv3, MIT, BSD, ASLv2, WTFPL などである。

一方、そのソフトウェア専用のライセンスなどの場合、ライセンスについてオンラインで確認できる方がよい。 その場合、ライセンス名称 <ライセンス文書のURL>といった形式でライセンスを示すことを推奨する。

インストーラーファイル情報

Installer 要素

Installer = element p:Installer {
    Url         &
    Platform    &
    Hash*
}

Installer 要素は、あるソフトウェアのインストーラーファイルの場所とそのメタ情報を示す。

Installer 要素は、Package 要素の中に1個以上記述されてなくてはならない。 クライアントの環境に適合した Platform 要素を子要素に持つ Installer 要素のインストーラーファイルを選択してインストールが行われる。 一方、クライアントの環境に適合した Platform 要素を子要素に持つ Installer 要素がまったくない場合、そのソフトウェアはクライアントの環境上では対応していないものとみなされる。 例えば、以下のように与えられた場合、そのソフトウェアは Windows XP〜7 で 64ビット環境を含めてサポートしているが、Windows 2000 以前では動作しないことを示す。

<Installer>
  <Url Href="http://example.com/path/to/installer.x86.exe"/>
  <Platform Os="winxp,vista,win2003,win7" Arch="X86"/>
</Installer>
<Installer>
  <Url Href="http://example.com/path/to/installer.x64.exe"/>
  <Platform Os="winxp,vista,win2003,win7" Arch="Amd64"/>
</Installer>

Url 要素 (Installer 要素の子要素)

Url = element p:Url {
    attribute Href { url }
属性名概要
HrefurlインストーラーファイルのURL

Url 要素は、インストーラーファイルのダウンロードリンクの URL を示す。

インストーラーファイルはダイレクトリンクの形式である。 HTTPの場合、この URL に Referrer ヘッダや特定の Cookie がなくとも、インストーラーファイルが取得できなければならない。 また、バージョンやアーキテクチャに対して一意な URL が好ましい(URLにバージョン番号やアーキテクチャが含まれていればよい)。

Platform 要素

Platform = element p:Platform {
    attribute Arch {
        "X86"   |
        "Amd64" |
        "IA64"  |
        "None"
    }?,
    attribute Os {
        xsd:string {
            pattern = "[a-zA-Z0-9]+(,[a-zA-Z0-9]+)*"
        }
    }?
}
属性名概要
ArchX86|Amd64|IA64|Noneインストーラーファイルの対応アーキテクチャ
Osstringインストーラファイルがの対応OSバージョン

Platform 要素は、インストーラーファイルの対応環境を示す。

属性 Arch は対応アーキテクチャを示しており、下記のいずれかを取る。

X86従来の32ビットアプリケーション。
Amd64x64環境向けの64ビットアプリケーション
IA64Itaniumの64ビット対応アプリケーション
Noneアーキテクチャ依存なし(リソース、純粋な Java、.NET、スクリプト言語など)

省略されたとき、X86とみなす。 なおクライアントがx64環境の場合で、Arch 属性が Amd64 となっているインストーラーファイルが登録されていないソフトウェアのとき、Arch 属性が X86 となっているインストーラーファイルをダウンロードしインストールする。 このとき、WOW64 と呼ばれる機構によって 32ビットアプリケーションがインストール・動作することとなる。

属性 Os は対応OSバージョンを示しており、OSのバージョン文字列をカンマ区切りでつなげたものである。

win2kWindows 2000
winxpWindows XP
win2003Windows 2003 Server
vistaWindows Vista
win7Windows 7

属性 Os が省略されたとき OS のバージョン確認はしないことを示す。 すなわち 属性 Os が省略されたとき任意の OS のバージョンでインストールできることを示す。

Hash 要素

Hash = element p:Hash {
    attribute Type {
        "size"      |
        "md5"       |
        "sha1"      |
        "sha256"    |
        "sha512"
    },
    (xsd:decimal | xsd:hexBinary)
}
属性名概要
Typesize|md5|sha1|sha256|sha512ハッシュの種類

Hash 要素は、インストーラーファイルのハッシュ値およびファイルサイズを示す。

ハッシュの種類は Type 属性で示し、テキストにハッシュ値およびファイルサイズを示す。 属性 Type は、以下から選択できる。

sizeファイルサイズを示す。10進数の数字文字で表す。
md5MD5SUMハッシュ値を示す。16進数のテキストで表す。
sha1SHA1SUMハッシュ値を示す。16進数のテキストで表す。
sha256SHA256SUMハッシュ値を示す。16進数のテキストで表す。
sha512SHA512SUMハッシュ値を示す。16進数のテキストで表す。

Hash 要素は Installer 要素に複数個定義してよいが、それぞれの Hash 要素の属性 Type が相違でなければならない。

文書型定義 (Relax NG Compact Schema)

datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"

# Name space.
namespace p = "http://diffshare.tv/xmlns/2007/na-get/PackageList/"

# Root element is PackageList.
start = PackageList

# Type definition.

url         = xsd:anyURI
idname      = xsd:string {
    pattern = """[^/\\\?\*:|"<>]+"""
}
regexpText  = text

entryName   = (
    idname  |
    xsd:string {
        pattern = "/[^/]+/"
    }
)

# Basic Element Types.

Url = element p:Url {
    attribute Href { url }
}

Entry = element p:Entry {
    attribute Name { entryName }
}

# Elements of package-list.

PackageList = element p:PackageList {
    element p:Name {
        text
    },
    Package+
}

Package = element p:Package {
    Name                    &
    Version                 &
    Summary?                &
    Description?            &
    Url?                    &
    Type                    &
    ArchivedInstaller?      &
    UninstallerKey?         &
    SilentInstallArguments? &
    System32CopyFiles?      &
    Installer+              &
    Requires*               &
    Tags?                   &
    License?
}

Name = element p:Name {
    idname
}

Version = element p:Version {
    text
}

Summary = element p:Summary {
    text
}

Description = element p:Description {
    text
}

Type = element p:Type {
    (
        "installer"     |
        "msi"           |
        "archive"       |
        "itself"        |
        "cannotinstall"
    )
}

ArchivedInstaller = element p:ArchivedInstaller {
    (
        "true" |
        "false"
    )
}

UninstallerKey = element p:UninstallerKey {
    regexpText
}

SilentInstallArguments = element p:SilentInstallArguments {
    text
}

System32CopyFiles = element p:System32CopyFiles {
    text
}

Installer = element p:Installer {
    Url         &
    Platform    &
    Hash*
}

Platform = element p:Platform {
    attribute Arch {
        "X86"   |
        "Amd64" |
        "IA64"  |
        "None"
    }?,
    attribute Os {
        xsd:string {
            pattern = "[a-zA-Z0-9]+(,[a-zA-Z0-9]+)*"
        }
    }?
}

Requires = element p:Requires {
    Entry+
}

Hash = element p:Hash {
    attribute Type {
        "size"      |
        "md5"       |
        "sha1"      |
        "sha256"    |
        "sha512"
    },
    (xsd:decimal | xsd:hexBinary)
}

Tags = element p:Tags {
    text
}

License = element p:License {
    text
}