🪝

asdfでインストール時にフックを実行しphp.iniファイルを自動的に設置したりする

2023/12/17に公開

備忘録です。一回設定したら忘れそうなのでメモ。
macOS 開発環境での話です。

ここではPHPでの内容になっていますが、フックはRubyでもPythonでも使えると思います。

asdfのPlugin Hooks

asdfのPlugin Hooksを使います。
https://asdf-vm.com/manage/configuration.html#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ファイルに記述を加えます。

.asdfrc
post_asdf_install_php = source /path/to/hooks/php-post-install-hook.bash "$@"

末尾の"$@"はインストールするPHPのバージョン番号を渡す、という意味になるようです。

"$@"をシェルスクリプト側で受け取るには$1を使います。

/path/to/hooks/php-post-install-hook.bash
#!/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ディレクトリに設置するようにしています。

https://www.nyamucoro.com/entry/2019/07/02/212904

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の内容はこのような感じで、デフォルト値から変更したい所だけを記述しています。

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