メインコンテンツに移動

drush makeの留意点

drushとdrush makeの導入方法については記載しましたが、今回はdrush makeの留意点についてです。

以下はdrush ver.4.5 / drush make ver 2.3での話です。
※そのほかのバージョンでは異なる可能性があります。

1.ステータスに【Error】があるとファイルが作成されない

drush make を実行した場合、1つでもステータスに【Error】があるとDrupalルートディレクトリには何も作成されません。
このステータスの【Error】はどうもランダムで発生しており、すべてが【OK】で完了することがまれなケースもあります。

Drupalルートディレクトリに何も作成されない例

drush make でError

drush_make ver2.2のころにあったバグでver 2.3でFixしたような情報もありますが正確なことは不明です。

コア以外の1・2箇所で【Error】になっているのであれば、テンポラリに作成されたdrush_XXXXXXX/__build__以下をコピーした のち、【Error】の分だけwgetやcurlで再度入手するのが早いと思います。このときの入手先のURLは標準出力に表示されていますのでそれを利 用できます。

しかし・・・
【Error】になる時間帯に同じURLへwgetを実行すると高確率で「404エラー」(page not found)が発生します。
wgetやdrush_makeで使っているファイル転送の設定を見直せばよいのかもしれませんが、結果は時間帯で大きく異なるようなので時間帯を変えて実行するのがよいようです。

2.drush makeの中間ファイルが/var/tmpに作成される

drush make の実行では、ダウンロードやビルドなどの中間ファイルが/var/tmp(=/tmp)以下の「drush_make_tmp_XXXXXXXX_YYYYYYY」ディレクトリに作成されています。ステータスがすべて【OK】であれば完了後に消去されますが、【Error】の場合は確実にディレクトリごと残ります。
再度実行すると「drush_make_tmp_XXXXXXXX_YYYYYYYY」が新たに作成されます。
※YYYYYYYYの箇所の数字が異なります。

さくらのレンタルサーバでは、ユーザディレクトリのファイルサイズ以外に/var/tmp以下も500MB以内の制限があります。
※制限値はquotaコマンドで確認可能
/var/tmpに放置されたままになると何時かは制限値に達してしまいます。

また、ファイルのアップロードなどでもこの/var/tmpが使われるケースもあります。
その場合、/var/tmpの使用可能容量が不足するとファイルアップロードにも失敗します。ファイルアップロードは一例にすぎません。
実際にどのモジュールで/var/tmpが使われるかは、PHPプログラム内部のtmp_dirの値がそのまま使われるケースもあれば、複数の候補から優先順位で条件を満たした場所がテンポラリのパスとして設定されるケースもあるようなので、PHPプログラム次第となります。

php.iniのupload_tmp_dirディレクティブが有効なケース、Drupalのファイルシステム設定画面のテンポラリに指定した値が有効なケースなど様々です。1番の件に関連して何度も繰り返し実行しているとすぐに制限に達してしまう可能性があります。

なお、drush make でどこのテンポラリが使用されているかはデバックオプション(--debug)をつけて実行すれば簡単に判明すると思います。

PHPのバージョンが5.2.1より前であればTMP、TMPDIR、TEMPのシステム環境変数が使われ5.2.1以降であればsys_get_temp_dir()で取得するようです。ようするにsys_get_temp_dir()が使えるか使えないかでも$tmp_dirの決定方法が異なります。
使用しているPHPは5.2.1以降なのでsys_get_temp_dir()を使っているようで「/var/tmp」になるのは仕様のようです。

Drupalであればfile_directory_temp()にupload_tmp_dirの値を設定するのでしょうが、drushでは$tmp_dirの設定にfile_directory_temp()やupload_tmp_dirを参照するようには作られていません。

drush_make時の$tmp_dirは、$tmp_dirに値がセットされていない場合に限り「drush_make/drush_make.utilities.inc」で設定されているようです。

drush_make_tmp(drush_make/drush_make.utilities.inc)
    286 function drush_make_tmp($set = TRUE) {
    287   static $tmp_dir;
    288   if (!isset($tmp_dir) && $set) {
    289     $tmp_dir = sys_get_temp_dir();
    290     if (strrpos($tmp_dir, '/') == strlen($tmp_dir) - 1) {
    291       $tmp_dir .= 'drush_make_tmp_' . time() . '_' . uniqid();
    292     }
    293     else {
    294       $tmp_dir .= '/drush_make_tmp_' . time() . '_' . uniqid();
    295     }
    296     if (file_exists($tmp_dir)) {
    297       return drush_make_tmp(TRUE);
    298     }
    299     // else create it
    300     drush_make_mkdir($tmp_dir);
    301   }
    302   return $tmp_dir;
    303 }
289行目をコメントにして290行目に以下を追加してみました。
$tmp_dir = '/home/USERNAME/tmp';

期待通り「/home/USERNAME/tmp」以下にdrush_make_tmp_XXXXXXXXX_XXXXXが作成されました。
$tmp_dirがセットされていない場合のみはこれでよいのですが・・・
drush本体のなかでも$tmp_dirがセットされていない場合・・・となっていたようなので$tmp_dirをカスタムのパスに設定しておけばすべて解決のように思えます。ではそれはどこで?
$HOME/.bashrc、$HOME/.drush/.bashrcあるいはdrushrc.php、実行時のオプションでとか試しましたが手探り状態なのでまだ不明のままです。

$HOME/.bashrcにTMPDIR変数を使ってパスを設定すれば変更できました。

export TMPDIR=$HOME/tmp

※ホームディレクトリ以下のtmpにしました。ディレクトリのパーミッションは755でもOKでした。
※$HOME/.drush/.bashrcに記述してもdrush実行時には読み込まれていないようなので$HOME/.bashrcに追加してください。
※FreeBSDではTMPDIRでしたが、OSによりTMP、TEMPなどの可能性があります。

Drupalバージョン