🦔

WSL に Laravel の開発環境を構築する (docker は使わない方針)

2022/06/26に公開

WSL に Laravel の開発環境を構築します!
ゴールは WSL で php artisan serve を実行するとページが見えるようになるところまでです!

次の流れで開発環境を構築します。

  • WSL をインストール
  • WSL にプロジェクト用の環境を作成
  • ansible をインストール
  • 開発環境構築用の ansible の playbook を作成
  • ansible を実行して開発環境を構築
  • mysql をインストール
  • mysql にプロジェクト用のデータベースを作成
  • ソースファイルを展開
  • php のライブラリをインストール
  • node のライブラリをインストール
  • .env を作成
  • 動作確認
  • ユニットテスト動作確認

開発環境の構成図は次の通りです。

技術スタックは、現在の仕事の環境にあわせて下記とします。

  • php 7.3
  • mysql 5.7
  • nodejs 16系

WSL のインストール

ref. WSL のインストール

作業は2つ。

  • 管理者権限で PowerShell を起動
  • wsl --install を実行

インストールされる Linux ディストリビューションは Ubuntu です。
別のディストリビューションを入れたい場合は ref のサイトを参照。

インストールが無事に終了すると、スタートメニューから Ubuntu を起動できるようになります。

WSL にプロジェクト用の環境を作成

ref. WSL で使用する Linux ディストリビューションをインポートする
ref. WSL(2)でOSを手動で無限に追加(インポート)する方法
ref. Installing Ubuntu on WSL via rootfs

WSL は別環境の作成が可能です。
つまり docker のように環境の使い捨てが可能です。
イメージとしては下記のとおり。

このため、下記のような場合は別に環境を作成して環境がゴチャゴチャしないようにしましょう。

  • 別案件のプロジェクトに入り環境が必要となった
  • いろいろいじった結果、開発環境がおかしくなった

手順

wsl 用 ubuntu の圧縮ファイルを https://cloud-images.ubuntu.com/focal/current/ からダウンロードします。
対象は focal-server-cloudimg-amd64-wsl.rootfs.tar.gz とかです。(とか、と書いたのは arm 版もあったので)

次にインストール先のフォルダパスを決めます。
デフォルトでは C:\Users\username\AppData\Local\Packages\ にインストールされるようです。
自分の環境では C:\Users\username\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc となっていました。

とくに思い入れがなければ C:\Users\username\AppData\Local\Packages\ubuntuXX.XX.PjName などで良いのではないでしょうか。
(自分はCドライブの空きが少なかったのでDドライブに入れたりしました)

# windows の powershell による操作です

wsl --import <Distro> <InstallLocation> <FileName>

# <Distro> : 識別名と考えてください。 ubuntu-XX.XX-PjName などで良いのではないでしょうか
# <InstallLocation> : インストール先フォルダパス
# <FileName> : ダウンロードした圧縮ファイルのパス

問題なく import が環境すれば、下記のコマンドで作成した環境を起動できます。

wsl -d <指定した Distro>

(任意) 作成した環境を wsl におけるデフォルト環境とします。
この設定をすると power shell の wsl を実行するだけで対象の環境を起動できます。

wsl --set-default <Distribution Name>

以降の作業は基本的に wsl 環境内での作業になります。
また、本方法では root ユーザーでの作業になりますので sudo などは省略します。

ansible をインストール

今回は ansible で環境を設定しようと思いますので asnible をインストールします。
ansible を使わない場合はもろもろよしなにインストールしてください。

apt-get update && apt-get install -y software-properties-common
# 下記のコマンドを実行すると enter ボタンの入力待機待ちとなる点に注意
apt-add-repository ppa:ansible/ansible
apt-get update && apt-get install -y ansible

次のコマンドで疎通を確認します。

ansible localhost -m ping

開発環境構築用の ansible の playbook を作成

ansible の playbook を作成します。
何をインストールするかは中身をご確認ください。

playbook.yml
---
- hosts: localhost
  tasks:
    - name: install required packages
      apt:
        name:
        - gcc
        - make
        state: present

    - name: install php block
      block:

        # ref. https://www.php.net/manual/ja/migration73.php

        - name: add repository
          apt_repository:
            repo: "ppa:ondrej/php"

        - name: install php and php packages
          apt:
            name:
            - php7.3
            - php7.3-cli
            - php7.3-bz2
            - php7.3-gd
            - php7.3-mbstring
            - php7.3-mcrypt
            - php7.3-mysql
            - php7.3-xml
	    - php7.3-curl
            state: present

        - name: Correct php version selected
          alternatives:
            name: php
            path: /usr/bin/php7.3

        - name: install composer
          get_url:
            url: https://getcomposer.org/download/latest-1.x/composer.phar
            dest: /usr/local/bin/composer
            mode: '+x'
    # End install php block

    # Note: ubuntu2004 に mysql5.7 を自動インストールできなかったため手動インストールとする
    #
    # - name: install mysql block
    #   block:

    #     # ref. https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/#repo-qg-apt-repo-manual-setup

    #     - name: Add key
    #       apt_key:
    #         keyserver: pgp.mit.edu
    #         id: 5072E1F5

    #     - name: add repository
    #       apt_repository:
    #         repo: "deb http://repo.mysql.com/apt/ubuntu/ focal mysql-5.7"
    #         filename: mysql
    #         state: present
    #         update_cache: yes

    #     - name: install mysql
    #       apt:
    #         name: mysql-server-5.7
    #         state: present
    #         notify:
    #         - enable and start mysql
    # # End install mysql block

    - name: install nodejs block
      block:
        - name: Add the NodeSource package signing key.
          apt_key:
            url: https://deb.nodesource.com/gpgkey/nodesource.gpg.key
            state: present

        - name: Add the desired NodeSource repository.
          apt_repository:
            repo: "deb https://deb.nodesource.com/node_16.x {{ ansible_lsb.codename }} main"
            filename: nodesource
            state: present
            update_cache: yes

        - name: Add the desired NodeSource repository(src).
          apt_repository:
            repo: "deb-src https://deb.nodesource.com/node_16.x {{ ansible_lsb.codename }} main"
            filename: nodesource
            state: present
            update_cache: yes

        - name: Install Node.js
          apt:
            name: nodejs
            state: present
    # End install nodejs block

  # handlers:
  #   - name: enable and start mysql
  #     service:
  #       name: "mysql.service"
  #       state: started
  #       enabled: yes

ansible を実行して開発環境を設定

ansible-playbook を実行して環境を設定します。

ansible-playbook -i localhost playbook.yml

php, composer, nodejs のバージョンを確認します。

php --version  # => 7.3
composer -v    # => 1系
node --version # => 16系

mysql をインストール

ref. How to Install MySQL 5.7 on Ubuntu 20.04
ref. A Quick Guide to Using the MySQL APT Repository

mysql をインストールするための準備をします。

# 都合により最新バージョンは使わない
MYSQL_APT_CONFIG=0.8.12-1
wget https://dev.mysql.com/get/mysql-apt-config_${MYSQL_APT_CONFIG}_all.deb
dpkg -i mysql-apt-config_${MYSQL_APT_CONFIG}_all.deb

dpkg -i mysql-apt-config_${MYSQL_APT_CONFIG}_all.deb を実行すると TUI(テキストユーザインタフェース) が表示されるため次の通り設定します。

設定項目 選択
Add repository to unsupported system? Ubuntu Bionic
MySQL Server & Cluster mysql-5.7

mysql をインストールします。
途中で mysql の root ユーザーのパスワードを要求されるので、よしなに設定します。

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
apt update
apt install -y -f mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7*

ansible を使って起動します。

ansible localhost -m sysvinit -a "name=mysql state=started"

mysql のバージョンを確認します。
mysql -u root -p で mysql に接続します。

SELECT VERSION(); -- => 5.7系

mysql にプロジェクト用のデータベースを作成

root ユーザーで作業してもよいのですが、プロジェクト用にデータベースを作成します。
データベース名、ユーザー名、パスワードなどはよしなに書き換えてください。
mysql -u root -p で mysql に接続します。

-- プロジェクト用のデータベースを作成
CREATE DATABASE PjName_db;
-- 確認
SHOW DATABASES;

-- プロジェクト用のアクセスユーザーを作成
CREATE USER 'username'@'%' IDENTIFIED BY 'p@ssw0rd';
-- 確認
SELECT user, host FROM mysql.user;

-- プロジェクト用のアクセスユーザーに、プロジェクト用のデータベースに対する全権限を付与
GRANT ALL ON PjName_db.* TO username;
-- 確認
SHOW GRANTS FOR 'username'@'%';

一旦 mysql から抜けて、作成したユーザーでアクセスできることを確認。

mysql -u <username> -p <PjName_db>

ソースファイルを展開

適当なディレクトリにソースファイルを展開します。
よさげなソースファイルをお持ちでないようであれば自分のリポジトリをご使用ください。

https://github.com/yoshik159753/laravel-tutorial-links

自分は /root/workspaces/PjName/ といった感じで展開しました。

php のライブラリをインストール

composer.json があるディレクトリで次のコマンドを実行。

composer install

node のライブラリをインストール

package.json があるディレクトリで次のコマンドを実行。

npm install

.env を作成

大抵のリポジトリには .env.example があると思いますので、これをコピーして .env を作りましょう。
ひとまずとして下記を設定します。

設定項目 選択
データベースの接続情報 先ほど作成したデータベースにあわせる
MAIL_MAILER log(外部サービスを使うのであればよしなに書き換え)

次のコマンドを実行して APP_KEY を設定します。

php artisan key:generate

ユニットテスト用に、作成した .env をコピーして .env.testing を作成します。
.env.testing のデータベース接続情報を、ユニットテスト用のものに書き換えましょう。

動作確認

開発用サーバーを起動してアクセスできることを確認しましょう。

php artisan serve

ユニットテスト動作確認

ユニットテストを実行できることを確認しましょう。

vendor/bin/phpunit

以上です!お疲れさまでした!

延長戦

vscode

windows 側に vscode がインストールされていれば code コマンドで vscode が起動します!
ただし、拡張機能は windows から引き継がれないため別途インストールが必要です。
とはいえ、コマンド一つで引き継がれますので手間ではないです!

windows 側からのエクスプローラによるアクセス

ref. WSL2 + VSCode + Docker 開発環境

windows のエクスプローラーのパスに \\wsl$ と入力してアクセスすると、アクセス可能な wsl の環境が表示されます。
そのまま対象のフォルダに進んでいけば、あとは windows で操作するようにファイル操作が可能です。

Discussion