anyenv + phpenv + php-build が便利すぎる件

47
anyenv + phpenv + php-build 便利すぎる件 内山 雄司 (@y__uti) 2016-06-29 103 PHP 勉強会

Upload: y-uti

Post on 07-Jan-2017

2.595 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: anyenv + phpenv + php-build が便利すぎる件

anyenv + phpenv + php-build が便利すぎる件

内山 雄司 (@y__uti)

2016-06-29 第103回PHP勉強会

Page 2: anyenv + phpenv + php-build が便利すぎる件

自己紹介内山雄司 (@y__uti)

◦ http://y-uti.hatenablog.jp/ (phpusers-ja)

仕事◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています

興味◦ プログラミング言語処理系

◦ 機械学習

2016-06-29 第103回 PHP 勉強会 2

Page 3: anyenv + phpenv + php-build が便利すぎる件

目次はじめに

anyenvを使ってみよう

応用編1. ディレクトリごとにバージョンを指定する

2. anyenvのプラグインを使う

3. PHP のビルド手順をカスタマイズする

4. ローカルリポジトリの運用

CHH/phpenvの話

2016-06-29 第103回 PHP 勉強会 3

Page 4: anyenv + phpenv + php-build が便利すぎる件

phpenvとは複数の PHP のバージョンをコマンド一発で切り替えるツール

2016-06-29 第103回 PHP 勉強会 4

$ php -v

PHP 5.4.16 (cli) (built: May 12 2016 13:45:17)Copyright (c) 1997-2013 The PHP GroupZend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

$ phpenv global 7.1.0alpha17.1.0alpha1

$ php -v

PHP 7.1.0alpha1 (cli) (built: Jun 23 2016 23:58:03) ( NTS )Copyright (c) 1997-2016 The PHP GroupZend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

with Zend OPcache v7.1.0alpha1, Copyright (c) 1999-2016, by Zend Technologies

Page 5: anyenv + phpenv + php-build が便利すぎる件

anyenv + phpenv + php-buildphp-build とは◦ PHP の超簡単ビルドシステム

2016-06-29 第103回 PHP 勉強会 5

$ phpenv install 7.1.0alpha1

◦ これだけでソースコードのダウンロードからインストールまで全自動

anyenvとは◦ 各言語の *envを一元管理するツール

$ anyenv install rbenv

◦ これだけで Ruby でも同じように使える

これらの *envは Ruby (rbenv) が元祖。PHP が後発

Page 6: anyenv + phpenv + php-build が便利すぎる件

anyenvを使ってみよう

2016-06-29 第103回 PHP 勉強会 6

Page 7: anyenv + phpenv + php-build が便利すぎる件

anyenvのインストールhttps://github.com/riywo/anyenv の説明どおり

1. リポジトリを clone する

2016-06-29 第103回 PHP 勉強会 7

$ git clone https://github.com/riywo/anyenv ~/.anyenv

2. 初期化ファイルに設定を追加する

$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile

3. 初期化ファイルの設定を反映する

$ exec bash -l

Page 8: anyenv + phpenv + php-build が便利すぎる件

phpenvのインストールanyenv install コマンドを実行する

2016-06-29 第103回 PHP 勉強会 8

$ anyenv install phpenv$ exec bash -l

◦ 以下がまとめてインストールされる◦ madumlao/phpenv phpenv本体

◦ php-build/php-build PHP をビルドするためのプラグイン

◦ ngyuki/phpenv-composer PHP のバージョンごとにパッケージを管理するプラグイン

◦ 詳しい人向けの情報◦ CHH/phpenvではなく madumlao/phpenv (phpenv/phpenv系の後継) が入る

◦ 後半のスライドで違いを説明

Page 9: anyenv + phpenv + php-build が便利すぎる件

phpenvの使い方 [1/5]インストール済みの PHP のバージョンを一覧表示する

2016-06-29 第103回 PHP 勉強会 9

$ phpenv versions* system (set by /home/y-uti/.anyenv/envs/phpenv/version)

◦ 最初は "system" だけ

◦ system というのは anyenv管理外の PHP を表す

$ php -v

PHP 5.4.16 (cli) (built: May 12 2016 13:45:17)Copyright (c) 1997-2013 The PHP GroupZend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

◦ 環境により異なる (これは CentOS 7 での結果)

Page 10: anyenv + phpenv + php-build が便利すぎる件

phpenvの使い方 [2/5]利用可能な PHP のバージョンを一覧表示する

2016-06-29 第103回 PHP 勉強会 10

$ phpenv install -lAvailable versions:5.2.175.3.25.3.3:: (省略)

:7.0.67.0.77.0snapshot7.1.0alpha1master

Page 11: anyenv + phpenv + php-build が便利すぎる件

phpenvの使い方 [3/5]バージョンを指定して PHP をインストールする

2016-06-29 第103回 PHP 勉強会 11

$ phpenv install 7.1.0alpha1

◦ 以下の一連の処理が全自動で実行される1. PHP のソースコードをダウンロードして展開 ("master" を指定した場合は git clone)

2. PHP をビルドしてインストール

3. 拡張ライブラリをインストール (Xdebugなど)

4. php.ini ファイルを更新 (OPcacheを有効にするなど)

◦ インストールされたことの確認

$ phpenv versions* system (set by /home/y-uti/.anyenv/envs/phpenv/version)7.1.0alpha1

Page 12: anyenv + phpenv + php-build が便利すぎる件

phpenvの使い方 [4/5]PHP のバージョンを切り替える

2016-06-29 第103回 PHP 勉強会 12

$ phpenv global 7.1.0alpha17.1.0alpha1

$ phpenv versionssystem

* 7.1.0alpha1 (set by /home/y-uti/.anyenv/envs/phpenv/version)

◦ 行頭の "*" は現在選択されている PHP のバージョンを表す

Page 13: anyenv + phpenv + php-build が便利すぎる件

phpenvの使い方 [5/5]あとは普通どおりに PHP を実行する

2016-06-29 第103回 PHP 勉強会 13

$ php -v

PHP 7.1.0alpha1 (cli) (built: Jun 23 2016 23:58:03) ( NTS )Copyright (c) 1997-2016 The PHP GroupZend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

with Zend OPcache v7.1.0alpha1, Copyright (c) 1999-2016, by Zend Technologies

$ php -r 'echo "Hello, world!"[-1];'!

◦ 文字列に負のオフセットを指定すると末尾から数える (PHP 7.1 より)

◦ https://wiki.php.net/rfc/negative-string-offsets を参照

Page 14: anyenv + phpenv + php-build が便利すぎる件

rbenv (Ruby)PHP と同じ

2016-06-29 第103回 PHP 勉強会 14

$ anyenv install rbenv$ exec bash -l

$ rbenv install 2.4.0-preview1$ rbenv global 2.4.0-preview1

$ ruby -e 'if (a, b = nil); p "True"; else p "False"; end'-e:1: warning: found = in conditional, should be =="False"

◦ Multiple assignment in conditional expression (新機能らしいよ)

◦ https://github.com/ruby/ruby/blob/v2_4_0_preview1/NEWS

Page 15: anyenv + phpenv + php-build が便利すぎる件

pyenv (Python)PHP と同じ

2016-06-29 第103回 PHP 勉強会 15

$ anyenv install pyenv$ exec bash -l

$ pyenv install 3.6.0a2$ pyenv global 3.6.0a2

$ python -c 'name = "Fred"; print(f"He said his name is {name}")'He said his name is Fred

◦ Formatted string literals (新機能らしいよ)

◦ https://docs.python.org/3.6/whatsnew/3.6.html

Page 16: anyenv + phpenv + php-build が便利すぎる件

その他の言語anyenvでインストールできる言語たち

2016-06-29 第103回 PHP 勉強会 16

$ ls -1 ~/.anyenv/share/anyenv-install | column -c 70Renv goenv nenv rbenvcrenv hsenv nodenv sbtenvdenv jenv phpenv scalaenverlenv luaenv plenv swiftenvexenv ndenv pyenv

Page 17: anyenv + phpenv + php-build が便利すぎる件

応用編1. ディレクトリごとにバージョンを指定する

2016-06-29 第103回 PHP 勉強会 17

Page 18: anyenv + phpenv + php-build が便利すぎる件

phpenv local [1/5]特定のディレクトリの配下だけ PHP のバージョンを変える

◦ 最初の状態を確認

2016-06-29 第103回 PHP 勉強会 18

$ phpenv versionsystem (set by /home/y-uti/.anyenv/envs/phpenv/version)

$ php -v | head -n 1PHP 5.4.16 (cli) (built: May 12 2016 13:45:17)

Page 19: anyenv + phpenv + php-build が便利すぎる件

phpenv local [2/5]特定のディレクトリの配下だけ PHP のバージョンを変える

◦ ディレクトリを作成して・・・

2016-06-29 第103回 PHP 勉強会 19

$ mkdir -p ~/samples/php$ cd ~/samples/php

◦ このディレクトリ配下で使いたい PHP のバージョンを指定する

$ phpenv local 7.1.0alpha17.1.0alpha1

Page 20: anyenv + phpenv + php-build が便利すぎる件

phpenv local [3/5]特定のディレクトリの配下だけ PHP のバージョンを変える

◦ 指定されたバージョンの PHP が使われる

2016-06-29 第103回 PHP 勉強会 20

$ php -v | head -n 1PHP 7.1.0alpha1 (cli) (built: Jun 23 2016 23:58:03) ( NTS )

$ cd ..$ php -v | head -n 1PHP 5.4.16 (cli) (built: May 12 2016 13:45:17)

◦ サブディレクトリでも OK (phpenv local で指定されたバージョンが使われる)

◦ phpenv local を実行したディレクトリの外側には効果を及ぼさない

Page 21: anyenv + phpenv + php-build が便利すぎる件

phpenv local [4/5]PHP ファイルを置いた場合はどうなる?

◦ phpenv local を実行したディレクトリの配下にファイルを作成する

2016-06-29 第103回 PHP 勉強会 21

$ cd ~/samples/php$ echo '<?php echo phpversion(), "¥n";' >phpversion.php

◦ ディレクトリの外側から実行する

$ cd ~$ php samples/php/phpversion.php7.1.0alpha1

◦ phpenv localで指定されたバージョンが使われる

Page 22: anyenv + phpenv + php-build が便利すぎる件

phpenv local [5/5]まとめ:どのバージョンが使われるかを決める規則

1. 現在の shell で有効なバージョン◦ phpenv shell コマンドで指定できる

◦ 今回は説明しなかった

2. 実行される PHP ファイルのディレクトリで有効なバージョン

3. カレントディレクトリで有効なバージョン

4. phpenv global で指定されているバージョン

2016-06-29 第103回 PHP 勉強会 22

Page 23: anyenv + phpenv + php-build が便利すぎる件

注意これらは phpenvを通して PHP を実行しているときの話

Q. phpenv local を実行しておけば対応する libphp5.so が選ばれる?

A. いいえ

2016-06-29 第103回 PHP 勉強会 23

Page 24: anyenv + phpenv + php-build が便利すぎる件

応用編2. anyenv のプラグインを使う

2016-06-29 第103回 PHP 勉強会 24

Page 25: anyenv + phpenv + php-build が便利すぎる件

anyenvの更新anyenv本体や各言語の *envは git cloneされた状態◦ 最新状態を取り込むには git pull すればよい

◦ 最新の PHP をビルドするには php-build を最新にする必要がある

ところが◦ 一つ一つ git pullするのは結構めんどくさい

2016-06-29 第103回 PHP 勉強会 25

$ cd ~/.anyenv$ git pull$ cd envs/phpenv$ git pull$ cd plugins/php-build$ git pull$ cd ../phpenv-composer$ git pull

Page 26: anyenv + phpenv + php-build が便利すぎる件

anyenv-updateanyenvと配下の各 *envやプラグインを一括更新するプラグイン

◦ インストール方法◦ https://github.com/znz/anyenv-updateの説明どおり

2016-06-29 第103回 PHP 勉強会 26

$ mkdir ~/.anyenv/plugins$ cd ~/.anyenv/plugins$ git clone https://github.com/znz/anyenv-update.git

◦ 使い方

$ anyenv updateUpdating 'anyenv'...Updating 'anyenv/anyenv-update'...Updating 'phpenv'......

Page 27: anyenv + phpenv + php-build が便利すぎる件

anyenv-gitanyenvと配下の各 gitリポジトリに gitコマンドを一括発行

◦ インストール方法◦ https://github.com/znz/anyenv-gitの説明どおり

2016-06-29 第103回 PHP 勉強会 27

$ mkdir ~/.anyenv/plugins$ cd ~/.anyenv/plugins$ git clone https://github.com/znz/anyenv-git.git

◦ 使い方

$ anyenv git checkout -B mybranch

◦ 各 gitリポジトリのmybranchブランチをチェックアウト。無ければ作る

Page 28: anyenv + phpenv + php-build が便利すぎる件

応用編3. PHP のビルド手順をカスタマイズする

2016-06-29 第103回 PHP 勉強会 28

Page 29: anyenv + phpenv + php-build が便利すぎる件

configure オプション変更 [1/2]share/php-build/default_configure_optionsファイルを編集

2016-06-29 第103回 PHP 勉強会 29

$ head default_configure_options--without-pear--with-gd--enable-sockets--with-jpeg-dir=/usr--with-png-dir=/usr--enable-exif--enable-zip--with-zlib--with-zlib-dir=/usr--with-kerberos

◦ 全バージョンに適用される

Page 30: anyenv + phpenv + php-build が便利すぎる件

configure オプション変更 [2/2]share/php-build/definitions/ ディレクトリにファイルを追加

◦ ファイルの例

2016-06-29 第103回 PHP 勉強会 30

$ cat share/php-build/definitions/master-debugconfigure_option -D "--disable-debug"configure_option "--enable-debug"

install_package_from_github masterenable_builtin_opcache

◦ master-debug という「バージョン」を独自に追加◦ --disable-debug オプションを削除して --enable-debug オプションを追加

$ phpenv install master-debug

Page 31: anyenv + phpenv + php-build が便利すぎる件

./configure 後に処理を追加share/php-build/before-install.d/ に bash スクリプトを作成

◦ bash スクリプトの例

2016-06-29 第103回 PHP 勉強会 31

#!/usr/bin/env bashif type apxs &>/dev/null; then

apxs_libexecdir=$(apxs -q LIBEXECDIR)sed -i -e ¥

"s|'¥$(INSTALL_ROOT)$apxs_libexecdir'|$PREFIX/libexec|g" ¥$SOURCE_PATH/Makefile

fi

◦ libphp5.so ファイルの出力先を設定する

Page 32: anyenv + phpenv + php-build が便利すぎる件

インストール後に処理を追加share/php-build/after-install.dディレクトリにスクリプトを作成

◦ bash スクリプトの例

2016-06-29 第103回 PHP 勉強会 32

#!/usr/bin/env bashinifile="$PREFIX/etc/php.ini"if [ -f "$inifile" ]; then

sed -i -e 's/^memory_limit =.*$/memory_limit = 1024M/' $inifilesed -i -e 's/^;date.timezone =.*$/date.timezone = Asia¥/Tokyo/' $inifile

fi

◦ PHP のインストール後に php.ini を編集する◦ memory_limitを 1024M に設定

◦ date.timezoneを Asia/Tokyo に設定

Page 33: anyenv + phpenv + php-build が便利すぎる件

拡張モジュールの追加 [1/2]share/php-build/extension/definition ファイルに定義を追加

2016-06-29 第103回 PHP 勉強会 33

$ cat definition"name","url-dist","url_source","source_cwd","configure_args","extension_type","after_install"...

"vld","http://pecl.php.net/get/vld-$version.tgz","https://github.com/derickr/vld.git",,,"extension",...

項目 内容 記述例

name モジュール名 vld

url-dist 圧縮ファイル URL http://pecl.php.net/get/vld-$version.tgz

url_source リポジトリ URL http://github.com/derickr/vld.git

source_cwd ビルドディレクトリ

configure_args ./configure オプション

extension_type 拡張の種類 extension

after_install ビルド後のコールバック関数

Page 34: anyenv + phpenv + php-build が便利すぎる件

拡張モジュールの追加 [2/2]PHP_BUILD_INSTALL_EXTENSION 環境変数を設定

2016-06-29 第103回 PHP 勉強会 34

$ PHP_BUILD_INSTALL_EXTENSION='vld=@' phpenv install 7.0.8

◦ vld拡張モジュールをインストールする◦ "@" はリポジトリから master ブランチを取得

◦ バージョン番号を指定した場合は圧縮ファイルを取得

◦ インストール後に設定ファイルに追加するところまで自動

Page 35: anyenv + phpenv + php-build が便利すぎる件

応用編4. ローカルリポジトリの運用

2016-06-29 第103回 PHP 勉強会 35

Page 36: anyenv + phpenv + php-build が便利すぎる件

ローカルリポジトリの運用悩ましい問題◦ 独自のカスタマイズによりリモートリポジトリとの差分が発生

◦ git pull したときにエラーになってしまう

私の運用の紹介(一例として)

2016-06-29 第103回 PHP 勉強会 36

$ anyenv git checkout -B local

◦ リモートリポジトリを pull するときは・・・

$ anyenv git checkout master$ anyenv update$ anyenv git rebase master local

◦ 節度を保ったカスタマイズなら滅多に conflict しない(経験上)

Page 37: anyenv + phpenv + php-build が便利すぎる件

CHH/phpenvの話

2016-06-29 第103回 PHP 勉強会 37

Page 38: anyenv + phpenv + php-build が便利すぎる件

最初に要点今回説明した madumlao/phpenvとは別に CHH/phpenvがある

1. 機能は大差ない

2. 実績は CHH/phpenv (TravisCIで使われている)

3. anyenvで使うなら madumlao/phpenvが簡単

4. どちらも phpenv install コマンドは php-build/php-build を使う

ウェブなどで情報を調べるときは◦ phpenvの情報はどちらの話なのか注意が必要

◦ php-build の情報はどちらの phpenvを使っていても共通

2016-06-29 第103回 PHP 勉強会 38

Page 39: anyenv + phpenv + php-build が便利すぎる件

CHH/phpenvとはrbenv (sstephenson/rbenv) を PHP 用に変更するパッチ

◦ https://github.com/CHH/phpenv

インストール方法◦ https://github.com/php-build/php-build の説明どおり

2016-06-29 第103回 PHP 勉強会 39

$ curl -L http://git.io/phpenv-installer | bash

◦ phpenvとプラグイン数種 (php-build 含む) がインストールされる

ところで何故インストール方法が php-build に書かれているのか◦ php-build は CHH/phpenvのプラグインとして使われる想定

◦ そもそも php-build/php-build は元々 CHH/php-build だった

Page 40: anyenv + phpenv + php-build が便利すぎる件

CHH/phpenvの使い方今回説明してきた phpenv (madumlao/phpenv) と同じ

2016-06-29 第103回 PHP 勉強会 40

$ phpenv helpUsage: rbenv <command> [<args>]

Some useful rbenv commands are:commands List all available rbenv commandslocal Set or show the local application-specific Ruby versionglobal Set or show the global Ruby versionshell Set or show the shell-specific Ruby versioninstall Install a PHP version using the php-build pluginuninstall Uninstall a specific PHP version using the php-build pluginrehash Rehash rbenv shims (run this after installing executables)version Show the current Ruby version and its originversions List all Ruby versions available to rbenvwhich Display the full path to an executablewhence List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.For full documentation, see: https://github.com/rbenv/rbenv#readme

◦ あちこちに "rbenv" や "Ruby" と表示されていることに気付いた?

Page 41: anyenv + phpenv + php-build が便利すぎる件

改めて CHH/phpenvとはrbenv (sstephenson/rbenv) を PHP 用に変更するパッチ

◦ CHH/phpenvのインストーラがやること1. git clone sstephenson/rbenvして

2. PHP用にソースコードを変更する

◦ したがって rbenvのリポジトリがそのまま見えている

2016-06-29 第103回 PHP 勉強会 41

$ cd ~/.phpenv$ git remote show origin* remote originFetch URL: https://github.com/sstephenson/rbenv.gitPush URL: https://github.com/sstephenson/rbenv.git

...

◦ clone した後にソースコードを変更しているので diff も出ている

Page 42: anyenv + phpenv + php-build が便利すぎる件

phpenv/phpenvrbenv (sstephenson/rbenv) をベースとした PHP 向けの実装

◦ https://github.com/phpenv/phpenv

CHH/phpenvとの主な違い◦ rbenvに依存していない

◦ phpenv install コマンドを独自実装している◦ php-build を使っていない

◦ php-build ほど高機能ではなかった (シェルスクリプト 1 ファイルでの実装)

開発が止まっている◦ 最終コミットは 2013 年 11 月 (dev branch)

2016-06-29 第103回 PHP 勉強会 42

Page 43: anyenv + phpenv + php-build が便利すぎる件

madumlao/phpenv開発の止まっている phpenv/phpenvを fork したもの◦ 2015 年 11 月 ~

phpenv/phpenvとの主な違い (fork 後の変更点)

◦ php-build を使う

2016-06-29 第103回 PHP 勉強会 43

Page 44: anyenv + phpenv + php-build が便利すぎる件

anyenvで使われる phpenv~/.anyenv/share/anyenv-install/phpenvに書かれている

2016-06-29 第103回 PHP 勉強会 44

$ cat ~/.anyenv/share/anyenv-install/phpenv

install_env "https://github.com/madumlao/phpenv.git" "master"install_plugin "php-build" "https://github.com/php-build/php-build.git" "master"install_plugin "phpenv-composer" https://github.com/ngyuki/phpenv-composer "master"

◦ 現在は madumlao/phpenv

◦ 時期によって異なる

◦ phpenv/phpenv 0000-00-00 ~ 2014-08-17

◦ laprasdrum/phpenv 2014-08-17 ~ 2016-03-26

◦ madumlao/phpenv 2016-03-26

Page 45: anyenv + phpenv + php-build が便利すぎる件

anyenv + CHH/phpenv [1/2]私は使っていないので十分に検証できていません

anyenvの管理下で CHH/phpenvを使う◦ phpenvを ~/.anyenv/envs/ディレクトリ以下に置けばよい

2016-06-29 第103回 PHP 勉強会 45

$ curl -L http://git.io/phpenv-installer |¥PHPENV_ROOT=~/.anyenv/envs/phpenv bash

Page 46: anyenv + phpenv + php-build が便利すぎる件

anyenv + CHH/phpenv [2/2]私は使っていないので十分に検証できていません

git pull できない問題の対応◦ rbenvからの差分を別ブランチに commit する

2016-06-29 第103回 PHP 勉強会 46

$ cd ~/.anyenv/envs/phpenv$ git checkout -b local$ git add bin/phpenv$ git commit -a

◦ 本発表の「応用編 4ローカルリポジトリの運用」を参照

一応これで anyenv update できるようになるが・・・◦ rbenvの変更に応じて phpenvを更新するわけではないので微妙

Page 47: anyenv + phpenv + php-build が便利すぎる件

まとめanyenv + phpenv + php-build 便利!

対抗馬 (私は使っていないので詳しくありません)

◦ Homebrew

◦ direnv

2016-06-29 第103回 PHP 勉強会 47