困りました困りました! あまりにも困ったので、この苦しみを二度と繰り返さないために書いておきます。
1.Flex SDKをアップデート
現在、Flash Builder β2でアプリケーションを作成しているのですが、TextLayoutFrameworkで背景色の指定にバグありとの記述を見つけたので、急遽Flex SDKをアップデートすることにしました。
要するに、Flash Builder β2に元々入っていたSDKを4.0.0.10485から最新の安定版リリースである4.0.0.13875へ上げたわけですね。
Adobe Open SourceのダウンロードページからSDKをダウンロードして解凍、Flash Builderのフォルダ(今回はWin XPだったのでC:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks)にコピー。
プロジェクト>プロパティ>Flex コンパイラーとパネルを開き、「Flex SDKの設定…」をクリックします。
で、「追加」で新しいSDKを選び、それをデフォルトに設定しました。
2.mx名前空間で名前解決できてないっぽい
アップデートといってもマイナーバージョンの変更だからそのまま動くかと思いきや、いきなりエラー!
パッケージエクスプローラーに赤い×がぽちぽちついています。しかも、新規プロジェクトを作成直後にいきなりエラーを起こしたりと、すごいヤンチャぶり。
最初のエラーはTextコンポーネントを置いただけで起きました。<mx:Text>をコンポーネントの実装に解決できませんでしたというエラーメッセージ。
名前空間が変更になったのかと思ってコードヒントを出してみると、これまで<mx:Text>だったのが、<ns:Text>になってる。なにこれ。
入力すると一応動きますが、すべてのmxタグを変更するのはなんかイヤ。
色々ググった結果、Flexにはこれまでもこういう悲しい歴史があったとか、なかったとかいうことがわかりました。
とりあえず現状を確認するため、設定ファイルを確認してみることに。
僕の場合、設定ファイルはC:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks\4.0.0.13875\frameworks\flex-config.xmlにありました。
これを確認すると、やっぱり名前空間のURIが変わってます。
デフォルトのアプリケーションコンポーネントは下記のようなコードがMain.mxmlに書かれるので、mxのURIはlibrary://ns.adobe.com/flex/haloのはずなんですが。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> </s:Application>
設定ファイルによると、名前空間mxのURIはlibrary://ns.adobe.com/flex/mxとなっています。
これを変更してみると、名前空間の参照エラー、コードヒントともに直りました
というわけで、アプリケーションやコンポーネントを作成するときはmxの名前空間をちょろっとだけ変えます。
xmlns:mx="library://ns.adobe.com/flex/mx" //haloをmxに
なんでhaloがボツになったのかはわかりません。ガンダムに出てくるからでしょうか。
3.コンパイル時にランタイムエラー
さて、これで直ったわいと左うちわでデバッグしてみたところ、いきなりランタイムエラー! バカー!
VerifyError: Error #1014: クラス spark.skins::SparkSkin が見つかりませんというメッセージが出ました。
また見つかんねーのかよ、と思ったところ、この対処法はダウンロードページに書いてありました。
spark.skin.swcがRSLであるため起きるエラーだとか。ビルド番号13079から起きるようになったらしいです。
なんのこっちゃわかりませんが、公式リリースには直るとのこと。応急処置だけやっておきます。
プロジェクト>プロパティ>Flex ビルドパスを選択し、「フレームワークのリンク」項目を「SDKのデフォルトを使用する(ランタイム共有ライブラリ)」から「コードにマージされます」に変更する。
同じ選択肢で「ですます」調と「である」調が混在しているのは、β版ならではでしょうか。
ともかく、これでランタイムエラーも消え、これまで通りに動くようになりました。
4.雑感
- AdobeはFlexの名前の付け方にそうとう苦慮している。Flash Professional, Flash Catalyst, Flash Builder, Flex Builder, Flex SDKと、もう何が何だかわからない。Spark、halo、mx、fxも、スキンの名前なのかコンポーネントの名前なのか、「俺がお前でお前が俺で」みたいな状況です。
- 毎回プロジェクトのデフォルトファイルを書き換えるのは面倒臭い。設定方法を知っている人がいたら教えて下さい。
- ProgressionとFlexのどっちで作ったらいいか、まだまだ悩みはつきない。
追記@2010/02/07
この後、インテリセンス(コードヒント)でflashパッケージがすべて出てこなくなる現象に遭遇。
ググったところ、Flex intellisense forgets flash.*という記事に遭遇して、言われたとおりにしたら直りました。
プロジェクト>プロパティ>Flex ビルドパスを選択して、ライブラリパスのタブを選択。
ビルドパスライブラリにplayerglobal.swcを追加。このファイル自体はC:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks\4.0.0.13875\frameworks\libs\playerにありました。
うーん、すでにここへのライブラリパスを通ってるっぽいんだけどなあ、と不思議に思っていたところ、理由が判明。
ランタイムエラーを消すために「フレームワークのリンク」を「ランタイム共有ライブラリ(RSL)の使用」から「コードにマージされます」に変更しましたが、これが原因だったっぽいです。
RSLってのはAdobeのヘルプにありましたが、要するにFlash Playerで使い回す共有のライブラリ(まさにflash.*パッケージ)を埋め込まずに、使い回すことです。
このライブラリはFlash Playerがはじめて使われるときにダウンロードされ、半永続的にキャッシュされるらしいです。それを使い回すので、個々のswfファイルが軽くなるというわけですね。
「コードにマージされます」というのは、RSLを使わずにすべてのライブラリをswfに埋め込むこと。
ってことは、僕がこのページで書いたとおりにすると、swfが重くなることになります。普段は埋め込まないflashパッケージを全部埋め込んでるんだから…
どうやら、リリースビルドの時はplayerglobal.swcへのライブラリパスを外す必要がありそうです。