phpとcomposerとlaravelが使えるようになるbat

# おそろいの開発環境を構築させたい

- 非プログラマに各自で準備させる的な状況
- Windows使う
- laravelを準備する
- 仮想環境つかわない
  - dockerとかvagrant配らない、非プログラマには管理できない
- 手順書だと写経に失敗するからスクリプト叩くようにする

## ある人がいった

> wslでshを配ればOK

- え、しろーと捕まえてくるんだからwslはハードル高いんじゃ？

> そこはマウスぽちぽちだから手順書で
> もうsh用意したから

## いろんな方法がありますよね

- 組織的には残念ながら時間制約などでwslな方針で進んだのですが
- 個人的に素のWindowsで上手くやる方法を検証したので共有します

## やること

1. phpダウンロード(zip版)
1. phpインストール(解凍だけ)
1. php.ini用意(extension=openssl有効)
1. composerダウンロード
1. composerインストール(`php phar`するbat作成)
1. laravelインストール
1. PATH通す(ユーザ環境変数)

## 解説

### なぜバッチ

- PowerShellの方が便利
- だけどps1ファイルだと実行権限が云々といわれるので
- batでラップしとくとWindowsでもっとも実行が簡単なスクリプトになる

### wgetとかcurl

- バッチだときついけどPowerShellなら`wget url`または`curl url`でいけます

```sh:PowerShellコンソール
> man wget
名前
    Invoke-WebRequest
構文
    Invoke-WebRequest [-Uri] <uri>  [<CommonParameters>]
エイリアス
    iwr
    wget
    curl
```

### sed

- バッチだときついけどPowerShellなら`replaceオペレータ`でがんばれます
- 文字コードとか改行コードとか気を使って`Get-Content`と`Add-Content -encoding String`とともにやってみました

### unzip

- バッチだときついけどPowerShellなら`Expand-Archive`でいけます

### PowerShellからbatをつくる

- こちらもini同様に気を使ってBOMなしファイルになるように`Add-Content -encoding String`でいけます
- `Out-File`だとBOM付Unicodeになっちゃいました

### 環境変数

- バッチだときついけどPowerShellならdotNetの力を借りて`[System.Environment]::SetEnvironmentVariable`でいけます

## できあがり
```powershell:install-php.bat
@powershell -NoProfile -ExecutionPolicy Unrestricted "&([ScriptBlock]::Create((cat -encoding utf8 \"%~f0\" | ? {$_.ReadCount -gt 2}) -join \"`n\"))" %*
@pause&exit /b

# インストールフォルダで作業する
$workspace = "C:\php"
New-Item $workspace -type directory -force
Set-Location $workspace

# PHP取得、解凍、php.ini作成
$phpremote = "https://windows.php.net/downloads/releases/php-7.2.9-Win32-VC15-x64.zip"
$phplocal = Join-Path $workspace ( Split-Path $phpremote -Leaf )
if ( $false -eq ( Test-Path $phplocal ) ) {
  Invoke-WebRequest -Uri $phpremote -OutFile $phplocal
}
Expand-Archive -Path $phplocal -DestinationPath $workspace

$data = Get-Content .\php.ini-development
$data = $data | % { $_ -replace ';extension=openssl', 'extension=openssl' }
$data = $data | % { $_ -replace ';extension=curl', 'extension=curl' }
Add-Content -path .\php.ini -value $data -encoding String

# composer取得、インストール
$composerremote = "https://getcomposer.org/download/1.7.2/composer.phar"
$composerlocal = Join-Path $workspace ( Split-Path $composerremote -Leaf )
if ( $false -eq ( Test-Path $composerlocal ) ) {
  Invoke-WebRequest -Uri $composerremote -OutFile $composerlocal
}
if ( Test-Path composer.bat ) {
  Remove-Item composer.bat
}
Add-Content -path composer.bat -value '@%~dp0php.exe "%~dp0composer.phar" %*' -encoding String

# laravelインストール
# .\composer.bat global require "laravel/installer"
.\php composer.phar global require "laravel/installer"

# ユーザ環境変数Path設定
$oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
$oldSystemPath = "C:\php;$env:appdata\Composer\vendor\bin;$oldSystemPath"
[System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User")
```

## おしまい
- phpに触れたのはこのときがお初
  - といってもコードに触れず環境構築だけ
- 月間ひとつ以上投稿したいなぁと思って
  - 本当はpix2pix試した記録を記事にしたかったけど
  - まだうまくいってない事を記事にしようと思ったけど
  - あまりに、あまりにも半端な状況なのでやめました
  - 投稿したい記事のネタが年内に賞味期限切れしちゃうので焦りがあります

以上