JavaScriptの単体テストの調査でPhantomJSを動かす必要があったのですが、この際にOSの機能に引っかかったという話です。
PhantomJSは、headlessのWebKit実行環境。
ここでの「head」はGUIを指します。headless = GUIがない、つまりコマンドのみで動かせるWebKitで、ブラウザを立ち上げなくてもJavaScriptが動作するという優れもの。
これさえあれば、コンソールでコマンドを叩くだけでDOM操作を含むJavaScriptのテストコードを走らせることができるわけです。
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の拡張ファイル属性です。
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」の削除と、ダイアログによる許可は同じ効果があることが確認できました。