PhantomJSが動かない、なぜだ!OS Xと拡張属性の話

2013-09-06

JavaScriptの単体テストの調査でPhantomJSを動かす必要があったのですが、この際にOSの機能に引っかかったという話です。

PhantomJS

PhantomJSは、headlessのWebKit実行環境。

ここでの「head」はGUIを指します。headless = GUIがない、つまりコマンドのみで動かせるWebKitで、ブラウザを立ち上げなくてもJavaScriptが動作するという優れもの。

これさえあれば、コンソールでコマンドを叩くだけでDOM操作を含むJavaScriptのテストコードを走らせることができるわけです。

PhantomJSを動かs…動かない?

PhantomJSは各OS用のバイナリを用意してくれているので、基本的にはダウンロードするだけです。

早速zipファイルを展開して実行してみると、見慣れないエラーが出てきました。

% cd phantomjs-1.9.1-macosx/bin
% ./phantomjs
zsh: operation not permitted: ./phantomjs

「この操作は許可されていません」。なんじゃこりゃ? パーミッション関連のようなので、アクセス権を確認してみます。

% ls -lA
-rwxr-xr-x@ 1 USERNAME  staff  11308856  6  5 16:35 phantomjs

何やら、見慣れないアットマーク「@」がくっついています。

見慣れない「@」の正体

この「@」の正体は、OS Xの拡張ファイル属性です。

Wikipedia: 拡張ファイル属性

xattr コマンドを使うと、どんな属性が付いているのか見ることができます。

% xattr -l phantom.js
com.apple.quarantine: 0000;00000000;The Unarchiver;00000000-0000-0000-0000-000000000000|com.operasoftware.Opera

quarantineは「隔離」という意味。 隔離で許可されていないというと…もしかして、よく見かける「ダウンロードしたファイルだけど、開いてもよろしいか」の機能のことかな?

xattr -d で拡張属性を削除できるので、試しに削除してみましょう。

% xattr -d com.apple.quarantine phantom.js
% ls -lA
-rwxr-xr-x  1 USERNAME  staff  11308856  6  5 16:35 phantomjs

「@」が消えました。 再度実行してみます。

% ./phantomjs --help
Usage:
   phantomjs [switchs] [options] [script] [argument [argument [...]]]
...

おー、動くようになった。

あのダイアログとの関係を確かめてみる

試しに、ダウンロードしてきたばかりの新鮮なPhantomJSを用意して、ダブルクリックで開いてみます。

やはり例のメッセージが表示されました。 許可したあとの拡張ファイル属性は…

% ls -lA
-rwxr-xr-x  1 USERNAME  staff  11308856  6  5 16:35 phantomjs

「@」がなくなっています。 xattrを使った拡張属性「quarantine」の削除と、ダイアログによる許可は同じ効果があることが確認できました。

書いている人:cocopon

Developer / Designer. Web / iOSなどのフロントエンドを主軸に、UIデザインから開発全般まで手がける。

趣味が高じて、ドット絵やジェネラティブアートが仕事になりつつある。