1からWindowsの開発環境を構築する
私がWindowsの開発環境を1から構築する際の手順を公開したいと思います。
設定はなるべくコマンドで行うように心がけています。
コマンドで設定することにより、GUIの変更があっても同じ手順で実行でき、設定の自動化が行いやすくなるからです。
Windowsのバージョンは10・11ともに「Version 22H2」を想定しています。
ちなみに、Windowsのバージョンのリリース日は以下になっています。
構築する内容は以下になります。
- winget
- Windows Terminal
- Windows Subsystem for Linux 2 (WSL2)
- Visual Studio Code (VS Code)
- Docker Desktop
構築
winget / Windows Terminal
Windows 10では winget および Windows Terminal がインストールされていないのでインストールします。
※ winget / Windows Terminal については以下。
winget インストール
Microsoft Store から「アプリ インストーラー」をインストール。
Windows Terminal インストール
コマンドプロンプトから winget を使いインストール。
CMD> winget install Microsoft.WindowsTerminal
gsudo インストール
管理者権限でターミナルを起動するのが、煩わしくなることがあるので、gsudo をインストールします。
Windows Terminalを起動しPowerShellからインストールします。
PS> winget install gerardog.gsudo
PS> $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
sudo
コマンドがすぐ使えるように環境変数を設定しています。
Windows 設定
# "登録されている拡張子は表示しない" チェックOFF
PS> Set-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -name "HideFileExt" -Value 0
# "隠しファイル、隠しフォルダ、および隠しドライブを表示する" チェックON
PS> Set-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -name "Hidden" -Value 1
# "自動的に現在のフォルダーまで展開する" チェックON
PS> Set-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -name "NavPaneExpandToCurrentFolder" -Value 1
# ダークモード
PS> Set-ItemProperty HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value 0
# "高速スタートアップを有効にする" チェックOFF
PS> sudo Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" -Name HiberbootEnabled -Value 0
WSL2 インストール
PS> sudo wsl --install
オプションを設定しない場合は、Ubuntu がインストールされます。
ディストリビューションを指定する場合は以下になります。
PS> sudo wsl --install --distribution Debian
再起動します。
PS> Restart-Computer
再起動後、WSLが立ち上がります。
数分後、ユーザ名・パスワードの設定が促されるので設定します。
Windows アプリインストール
Windows Terminal を立ち上げ、PowerShellからインストールします。
# Git
PS> winget install Git.Git
# Visual Studio Code
PS> winget install Microsoft.VisualStudioCode
# Docker Desktop
PS> winget install Docker.DockerDesktop
# nano
PS> sudo winget install GNU.Nano
nano を導入し、PowerShellからエディタを使えるようにしています。
※Vimのインストールがうまくいかなかったため nano にしています。
その他
その他、自分が使うアプリをインストールします。
winget にないアプリでもPowerShellからインストールしています。
# DBeaver
PS> winget install dbeaver.dbeaver
# WinSCP
PS> winget install WinSCP.WinSCP
# Rlogin
PS> Invoke-WebRequest -Uri https://github.com/kmiya-culti/RLogin/files/9193732/rlogin_x64.zip -OutFile rlogin_x64.zip -UseBasicParsing
PS> Expand-Archive -Path rlogin_x64.zip -DestinationPath ./RLogin
PS> rm rlogin_x64.zip
再起動します。
PS> Restart-Computer
フォントインストール
プログラミング向けフォント「白源」をインストールします。(HackGen Console NFJ)
PS> Invoke-WebRequest -Uri https://github.com/yuru7/HackGen/releases/download/v2.7.1/HackGen_NF_v2.7.1.zip -OutFile HackGen_NF.zip -UseBasicParsing
PS> Expand-Archive -Path HackGen_NF.zip -DestinationPath .
PS> $fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
PS> dir HackGen_NF_v2.7.1/*.ttf | %{ $fonts.CopyHere($_.fullname) }
PS> rm HackGen_NF* -Recurse
Windows Terminal 設定
以下で設定しています。
- 既定のプロファイル: WSL
- プロファイル - 規定値 - 外観
配色: One Half Dark
フォントフェイス: HackGen Console NFJ
フォントサイズ: 11
settings.json での設定です。 ※ defaultProfile はDebian(WSL)
...
"defaultProfile": "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}",
"profiles":
{
"defaults":
{
"colorScheme": "One Half Dark",
"font":
{
"face": "HackGen Console NFJ",
"size": 11
}
},
...
WSL2 設定
Windows Terminal のWSLから設定を行います。
.wslconfig
WSLのグローバルの設定ファイルを作成します。
vi .wslconfig
[wsl2]
memory=4GB
processors=8
swap=0
設定ファイルをWSL側からWindows側のホームディレクトリに移動します。
mv .wslconfig /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/
wsl.conf
WSLのディストリビューションの設定ファイルを作成します。
sudo vi /etc/wsl.conf
[automount]
options = "metadata,umask=22,fmask=11"
WSLを再起動させます。
PowerShellからWSLを終了します。
PS> wsl --shutdown
再びWindows TerminalからWSLを起動します。
sudo
sudo visudo
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
日本語設定
sudo sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
パッケージアップグレード
sudo apt update
sudo apt upgrade -y
基本パッケージ
sudo apt install -y bash-completion curl dnsutils fonts-ipafont git imagemagick jq locales nfs-client patch rsync tree wget vim whois zip
GUI
sudo apt install -y libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb libgbm-dev fonts-ipafont
Node.js
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
source ~/.profile
nvm install --lts
yarn
npm install -g yarn
Vim設定
vi ~/.vimrc
syntax on
set encoding=utf-8
set number
set tabstop=4
set softtabstop=4
set expandtab
set shiftwidth=4
set backspace=indent,eol,start
set paste
Git
Windows側のホームディレクトリに設定を作成し、リンクを張ります。
touch /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.gitconfig
ln -s /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.gitconfig ~/.gitconfig
touch /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.git-credentials
ln -s /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.git-credentials ~/.git-credentials
# Git設定例
git config --global user.name "name"
git config --global user.email name@email
git config --global credential.helper store
git config --global core.filemode false
git config --global core.autocrlf input
git config --global init.defaultBranch main
SSH
Windows側のホームディレクトリにディレクトリを作成し、リンクを張ります。
mkdir /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.ssh
ln -s /mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/.ssh ~/.ssh
鍵作成
ssh-keygen -t rsa -b 4096 -C ""
SSH Config
mkdir ~/.ssh/conf.d
vi ~/.ssh/config
# VS CODE Wildcards don't supported
Include ~/.ssh/conf.d/**/config
Host *
IdentitiesOnly yes
TCPKeepAlive yes
ServerAliveInterval 60
ServerAliveCountMax 10
ForwardAgent yes
chmod 600 ~/.ssh/config
SSH 接続時背景色変更
vi ~/ssh-change-color.sh
#!/bin/bash
CMD_SSH=/usr/bin/ssh
COLOR_WORD_DEFAULT="#ffffff"
COLOR_BG_DEFAULT="#282c34"
COLOR_BG_1="#005563"
function color_change() {
word=$1
back=$2
echo -ne "\e]10;${word}\a\e]11;${back}\a"
}
trap "color_change \"${COLOR_WORD_DEFAULT}\" \"${COLOR_BG_DEFAULT}\"" 2
color_change "${COLOR_WORD_DEFAULT}" "${COLOR_BG_1}"
$CMD_SSH "$@"
color_change "${COLOR_WORD_DEFAULT}" "${COLOR_BG_DEFAULT}"
chmod +x ~/ssh-change-color.sh
vi ~/.bashrc
alias ssh='~/ssh-change-color.sh'
反映
source ~/.bashrc
ssh-agent
wget https://github.com/rupor-github/wsl-ssh-agent/releases/download/v1.6.2/wsl-ssh-agent.zip
unzip wsl-ssh-agent.zip -d wsl-ssh-agent
mv wsl-ssh-agent /mnt/c/
rm wsl-ssh-agent.zip
ssh-agent 起動
# PowerShell
PS> sudo Set-Service ssh-agent -StartupType Automatic
PS> sudo Start-Service ssh-agent
起動ファイル作成
Windows のスタートアップにバッチ登録。
echo "start C:\wsl-ssh-agent\wsl-ssh-agent-gui.exe -socket C:\wsl-ssh-agent\ssh-agent.sock" > wsl-ssh-agent.bat
mv wsl-ssh-agent.bat "/mnt/c/Users/$(/mnt/c/Windows/System32/cmd.exe /c "<nul set /p=%UserName%" 2>/dev/null)/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/"
sudo apt install socat
vi ~/.bashrc
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
ss -a | grep -q $SSH_AUTH_SOCK
if [ $? -ne 0 ]; then
rm -f $SSH_AUTH_SOCK
( setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"/mnt/c/wsl-ssh-agent/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork & ) >/dev/null 2>&1
fi
chmod 755 /mnt/c/wsl-ssh-agent/npiperelay.exe
反映
source ~/.bashrc
VS Code 設定
普段VS Codeをお使いの方は 「設定の同期(Settings Sync)」を使うとよいです。
動作確認のため、最低限の設定をする場合は以下を設定してます。
Windows TerminalからPowerShellを起動します。
VS Codeの設定ファイルを書き換えます。
# PowerShell
PS> nano $env:APPDATA\Code\User\settings.json
{
"editor.fontFamily": "HackGen Console NFJ",
}
拡張機能をインストールします。
# 日本語化
PS> code --install-extension MS-CEINTL.vscode-language-pack-ja
# リモート開発
PS> code --install-extension ms-vscode-remote.vscode-remote-extensionpack
# Docker
PS> code --install-extension ms-azuretools.vscode-docker
VS Code を1回起動し、また起動しなおすと日本語化の拡張機能が正常に反映されます。
バックアップ
実際に開発を行う場合は、WSL内にファイルを置くことになるので、WSLを定期的にバックアップしています。
Windows側のホームディレクトリにbackup
フォルダを作成し、Windowsのタスクスケジューラーで定期的に保存します。
PS> mkdir backup
PS> nano backup.ps1
# WSLバックアップ
$CurrentDir = Split-Path $MyInvocation.MyCommand.Path
wsl --export ubuntu $CurrentDir"/backup/ubuntu.tar"
PS> $Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Thursday -At 21:00
PS> $Action = New-ScheduledTaskAction -Execute "%Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument "%UserProfile%\backup.ps1"
PS> Register-ScheduledTask -TaskName "バックアップWSL" -Action $Action -Trigger $Trigger
※毎週木曜日21時実行
# PowerShellの実行ポリシー変更
Set-ExecutionPolicy RemoteSigned -Scope Process -Force
backup フォルダ自体はWindowsのバックアップ機能を使い、NASやOneDriveなどにバックアップします。
その他
これでWSL2上での開発やVS Codeを使ったWSL・Docker内での開発が行えます。
「Version 22H2」であればWindsow 10でもLinux GUI アプリの実行が可能です。(WSLg)
こちら構築の参考になればと思います。
Discussion