Mojolicious 3.83でjquery.jsのパスが変更になり、アップデート組と3.83以降新規組で環境に差が出る
(2013-04-08追記)
@clclcl /js/jquery.jsはMojoliciousが内部的に利用することが意図されていて、ユーザーに提供されているものではないので、使わないほうがいいですよ。
— 木本裕紀(perlcodesample)さん (@perlcodesample2) 2013年4月7日
とのことなので、Mojolicious同梱のJSを指定せず、Googleなどがホスティングするjquery.jsを指定する方が確かにMojoliciousのバージョンに依存せずいいのかもしれません。
個人的には、
これらを考えるとMojolicious同梱のjsを使いたいところです。Mojoliciousの初期サンプルでは、Mojoliciousのjsを指定しているサンプルが多かったので、そのままの感覚で使っていました……
〜〜〜
(2013-04-08コメント受けて修正)
Mojoliciousはマイナーアップデートでも果敢に仕様が変わることで有名で、ネット上のサンプルプログラムをコピペして動かしてもうまく動作しないのはこの仕様変更が原因の大半だと思います。
(修正後)
今回、新しく調達したCentOS 6のサーバに、Mojoliciousのサイトに書いてあるインストールワンライナーで新規にインストールしたMojolicious 3.92の環境で、過去に作ったMojolicious::Liteアプリケーションを設置して、ブラウザから通信の様子を見ていたら、/js/jquery.js の読み込みで404 Not foundが出ているのを発見しました。
それを受けて、Mojoliciousの開発版が置かれているGitHubに行って、Changesを読んでみると、
3.83 2013-01-27
https://github.com/kraih/mojo/blob/master/Changes
- Moved bundled static files to mojo directory.
- Improved documentation.
- Improved tests.
- Fixed small Getopt::Long configuration bug in Mojolicious::Commands.
ということで、2013年1月のver 3.83で、static files、つまり静的ファイルの置き場所を/mojo に変更した、ということでした。
というわけで、Mojoliciousに同梱されたjquery.jsのパスは、
となります。
EPテンプレートエンジンのヘルパーで指定する場合は、
- Mojolicious 3.82までは、%= javascript '/js/jquery.js'
- Mojolicious 3.83以降は、%= javascript '/mojo/jquery/jquery.js'
となります。
Mojolicious 3.82以前からアップデートすると、jquery.jsの置き場所が2つになる
新規環境に入れたMojoliciousではjquery.jsのパスが違っているってことは、我が家のサーバのMojoliciousを最新にアップデートしたらスクリプトも直さなくちゃならないし、過去のブログで書きまくったMojolicousサンプルも直さなきゃなあ、とか思いながら、cpanm Mojoliciousと打ち込んでアップデートしたのですけれども、jquery.jsのパスを書き換えなくても普通に動いています。どういうこっちゃ?
調べてみたら、僕の環境の場合、(System Perl派なので)/usr/local/share/perl5/Mojolicious/public/ に、js/ と mojo/ が同居していました。どうやら、Mojoliciousのアップデート時は、js/ ディレクトリは消さないようです。
Mojoliciousが同じバージョンでも新規インストール組とアップデート組で動作に差異
Mojoliciousをアップデートしたら動かなくなった、という問題を結果的には回避できているので一見よろしいような気がしますが、
- Mojolicious旧バージョンからのアップデート組としては、Mojoliciousアプリケーションの書き換えをしなくても動作はするが、同梱jquery.jsの更新はされないし、新環境にインストールしたときにスクリプトの不備に気付いて困る
- Mojolicious新規インストール組としては、Mojoliciousアプリケーションのスクリプトを入手して設置しても動かないことがあって困る
という状況が発生します。これは一寸困る……
use Mojolicious 3.83; とバージョンを指定する書き方をするのはどうだろう
過去に書いたスクリプトはどうしようもないですが、これから書くスクリプトに関しては、バージョンを意識するために、
#!/usr/bin/perl use 5.010; use Mojolicious 3.83; use Mojolicious::Lite; ...
などと書くことで、低いバージョンのMojoliciousで動かそうとするのは防げるかなあと思いました。逆のパターンはいかんともしがたいですけれども……
ちなみにMojolicious 3.69から、use utf8; を自分で書かなくてもよくなっている
Mojoliciousは、use strict; use warnings; の決まり文句を書かずともあらかじめ設定されているのですが、今回Changesを見たら、Mojolicious 3.69で、use utf8; もあらかじめ設定されるようになっていました。
マイナーアップデートでも結構重要なところが変わるので要注意ですね。