asdfでインストール時にフックを実行しphp.iniファイルを自動的に設置したりする
備忘録です。一回設定したら忘れそうなのでメモ。
macOS 開発環境での話です。
ここではPHPでの内容になっていますが、フックはRubyでもPythonでも使えると思います。
asdfのPlugin Hooks
asdfのPlugin Hooksを使います。
Hookにシェルスクリプトなどを.asdfrcファイルに登録しておけば、指定のタイミングで実行できます。
下記のHookが使えるようです。
- pre_<plugin_name>_<command>
- pre_asdf_download_<plugin_name>
- {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
- $1: full version
- {pre,post}_asdf_plugin_{add,update,remove,reshim}
- $1: plugin name
- {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>
上記に照らし合わせ、PHPインストール前に実行したい場合はpre_asdf_plugin_install_php
、PHPインストール後に実行したい場合はpost_asdf_plugin_install_php
になります。
PHPインストール時に /path/to/hooks/php-post-install-hook.bash が実行されるように.asdfrc
ファイルに記述を加えます。
post_asdf_install_php = source /path/to/hooks/php-post-install-hook.bash "$@"
末尾の"$@"
はインストールするPHPのバージョン番号を渡す、という意味になるようです。
"$@"
をシェルスクリプト側で受け取るには$1
を使います。
#!/usr/bin/env bash
echo "[php-post-install-hook] Start"
# デフォルトのphp.iniはphp.ini-defaultとして残しておく
mv "$(asdf where php $1)/conf.d/php.ini" "$(asdf where php $1)/conf.d/php.ini-default"
# 自前で用意したAdditionalなphp.iniをconf.d/php-additional.iniとして設置する
# シンボリックリンクを張るだけ
ln -sfv "/path/to/php-additional.ini" "$(asdf where php $1)/conf.d/php-additional.ini"
echo "[php-post-install-hook] Done"
asdf where
サブコマンドでインストールされたディレクトリが得られます。brew --prefix
みたいな感じのやつです。
例えばPHP 8.2.12をインストールした場合、$(asdf where php 8.2.12)
で~/.asdf/installs/php/8.2.12
が得られます。
$(asdf where php $1)
でシェルスクリプトに渡されたバージョン番号を使って、インストールされたディレクトリまでのパスを得ます。
Additionalなphp.iniファイル
ここではphp.iniファイルを直接編集するわけではなく、自前で用意したAdditionalなphp.iniファイルを、各PHPバージョンのconf.dディレクトリに設置するようにしています。
php --ini
コマンドでScan for additional .ini files in:
と表示されたディレクトリに、拡張子*.ini
ファルを設置すれば、PHPのデフォルト設定値を上書きする形で読み込まれます。
$ php --ini
Configuration File (php.ini) Path: /Users/ユーザー名/.asdf/installs/php/8.2.12
Loaded Configuration File: (none)
Scan for additional .ini files in: /Users/ユーザー名/.asdf/installs/php/8.2.12/conf.d
Additional .ini files parsed: /Users/ユーザー名/.asdf/installs/php/8.2.12/conf.d/php-additional.ini
例えばphp-additional.iniの内容はこのような感じで、デフォルト値から変更したい所だけを記述しています。
; デフォルト値から変更したい所だけを記述
; 一例として……
error_reporting = E_ALL
post_max_size = 100M
upload_max_filesize = 30M
;xdebug使いたい場合は事前に $ pecl install xdebug する
;zend_extension=xdebug.so
もちろんsed等で編集してもいいと思いますが、Additionalなphp.iniをシンボリックリンクとしてconf.dに設置しておくと、後で複数のバージョンの設定を全部変えたくなった時に、1度の変更で済みます。そういうことはあまりないかもしれませんが。
ここではやっていないですが、バージョンごとに設置するファイルを分ける、ということもできそうです。
なんでもメモしておかないと本当に忘れる……
Discussion