おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

r3 と stickleback を試してみる - プロジェクトの事前設定

デモのチュートリアルを引き続き試してみます。
ここの部分は事前設定ということで、intlとproductを作り、継承関係を設定するというものです。

プロジェクトの事前設定

始めに、products と intl を作成する必要があります。
products と intl は、r3の用語で "dimensions" と呼ばれるものです。r3のバージョン0.9では、もう1つのdimensionとして、"page"があります。将来的には、自分でその他の dimensionを定義することができるようになります。
products と intl は、同じ方法で作ることができます。コマンドラインで以下のように叩きます。

$ r3 dimension product create generic_product
product generic_product created

これで、"generic_product" という名前のプロダクトができます。r3のもう1つの重要な特徴として、プロダクト(及び他のdimension)は、他を継承することができるという点があります。
"generic_product"を作った理由は、この後出てくる実際のプロダクト(cookery, wine, cars)の共通の祖先として役割を持たせるためです。この共通の祖先では、共通のテンプレート、ターゲットの詳細、そしてtranslation(翻訳)の場所にさえ用いることができ、あなたはそれを必要としなければなりません。
OK。じゃ、generic_productも作ったので、次は、本物のプロダクトを、その子孫として作ろう。

$ r3 dimension product create cookery -p generic_product
product cookery created with parent generic_product for page, template and translation domains.

-pオプションは、"parent" (親)を意味する。
続けて残りのプロダクトと、intlも同じように作成。

$ r3 dimension product create wine -p cookery
product wine created with parent cookery for page, template and translation domains.
$ r3 dimension product create cars -p generic_product
product cars created with parent generic_product for page, template and translation domains.
$ r3 dimension intl create generic_intl
intl generic_intl created
$ r3 dimension intl create us -p generic_intl
intl us created with parent generic_intl for page, template and translation domains.
$ r3 dimension intl create ca -p us
...
$ r3 dimension intl create fr -p generic_intl
$ r3 dimension intl create jp -p generic_intl

ここまでで、プロダクトはこんな階層構造になります。

generic_product--+--cookery--+--wine
                 |
                 +--cars

そして、intlはこう。

generic_intl--+--us--+--ca
              |
              +--fr
              |
              +--jp

ここで、問題。ca はフランス語を話すカナダ圏を想定しているのに、translationsはフランスを継承しないとあれじゃない?ということで、、
r3は、継承操作において3つのドメインを認識します。

r3は、各ドメインで各dimesionは分離した継承ツリーを管理することができる。(page dimensionを除く、それは特別で一連の継承データの中で1つだけ持つことができる?) プロダクトもしくはintlを作り、親を指定したとき、3つすべてのドメインに同じ親の関係が設定されます。これは、一般的には希望通りの動作だと思います。しかしながら、caは、翻訳(translation)ドメインは、frを継承するといった特別なケースのときは、翻訳(translation)ドメインのみで ca と fr の継承関係を変更するということを望みます。
これは簡単で、

$ r3 dimension intl parent ca set fr -d translation
parent of intl ca changed to fr in the translation domain

とすることで可能です。"-d"で、ドメインを指定しています。
ついでに、翻訳ドメインで、generic_intlの継承って必要ないよね (基底となる言語ってないので)ということで、翻訳ドメインでのgeneric_intlの継承関係を削除します。

$ r3 dimension intl parent fr unset -f -d translation
intl fr set with no parent in the translation domain
$ r3 dimension intl parent us unset -d translation
intl us set with no parent in the translation domain
$ r3 dimension intl parent jp unset -d translation
intl jp set with no parent in the translation domain

一番上の fr のところだけ "-f" (force)フラグを付けています。これは、前の操作で、 fr の下に ca が子供として付いており、削除すると子孫にも影響を与えることとなるため、r3がデフォルトでは削除させないようになっているためです。
ここまでで、テンプレートとページドメインについては以前の階層構造から変化はありませんが、翻訳(translation)ドメインについては、以下のように変化しました。

generic_intl
fr--+--ca
us
jp

generic_intlは依然、翻訳ドメインに存在しています。intl・プロダクト・ページの存在は、ドメインとは独立しており、それぞれのドメイン間で継承関係が異なっているだけとなっています。
指定したドメインにおいての継承構造は、コマンドラインで調べることができます。以下は、intlの翻訳ドメインでの継承関係を表示しています。

$ r3 dimension intl list -t translation
jp
us
fr
    ca
generic_intl

(2007/06/09 上の出力結果が間違えていたので修正しました)
-tフラグは、"tree" viewを意味していて、ドメインを指定することにより継承関係を得ることができます。